From 6ae090d20d63fd4bb476722874512c5622057eae Mon Sep 17 00:00:00 2001 From: Christopher <1289128+dragonfire1119@users.noreply.github.com> Date: Wed, 27 Nov 2024 10:47:27 -0600 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20Implement=20Debian=20Docker?= =?UTF-8?q?=20Disk=20Recovery=20Tool=20v1.0.0=20(#22)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit introduces a new Debian Docker Disk Recovery Tool script that helps users recover disk space on their systems by managing Docker resources. The key changes include: - Implement a script to start, install, and clean up Docker resources - Add functions to check available disk space, display disk usage, and confirm user actions - Provide instructions for users on recommended next steps after running the script - Use color formatting and headers to improve the user experience --- debian-docker-disk-recovery/README.md | 58 ++++++ debian-docker-disk-recovery/run.sh | 263 ++++++++++++++++++++++++++ 2 files changed, 321 insertions(+) create mode 100644 debian-docker-disk-recovery/README.md create mode 100644 debian-docker-disk-recovery/run.sh diff --git a/debian-docker-disk-recovery/README.md b/debian-docker-disk-recovery/README.md new file mode 100644 index 0000000..90ef91e --- /dev/null +++ b/debian-docker-disk-recovery/README.md @@ -0,0 +1,58 @@ +## Why? + +This script helps recover a Debian server when it runs out of disk space, specifically focusing on getting the Docker daemon running again. It takes an interactive, step-by-step approach to free up disk space without destructively removing Docker data. + +## Safety First 🛡️ + +This script is designed to be safe and non-destructive: +- ✅ Preserves all container data +- ✅ Keeps all Docker images intact +- ✅ Maintains running containers +- ✅ Protects active Docker volumes +- ✅ Interactive process (asks before each action) +- ✅ Only cleans logs and temporary files + +The script NEVER: +- ❌ Deletes container data +- ❌ Removes running containers +- ❌ Deletes Docker images +- ❌ Removes active Docker volumes +- ❌ Modifies container configurations + +## Features + +- Interactive cleanup process +- Safe, non-destructive operations +- Step-by-step disk space recovery +- Preserves Docker data while clearing logs +- Shows disk usage after each operation +- Docker cleanup integration (when daemon is running) +- Option to reinstall Docker if needed +- Docker Compose installation option +- Comprehensive cleanup statistics + +## Complete Workflow + +1. Initial System Cleanup: + - Clear system journal logs + - Clean package manager cache + - Truncate Docker container logs + - Clean individual container logs + +2. If Docker Starts: + - Option to run comprehensive Docker cleanup + - Remove unused containers, images, volumes, and networks + - View cleanup statistics + +3. If Issues Persist: + - Option to reinstall Docker + - Option to install Docker Compose + - Clear instructions for next steps + +## How to use? + +```bash +bash -c "$(wget -qLO - https://raw.githubusercontent.com/bigbeartechworld/big-bear-scripts/master/debian-docker-disk-recovery/run.sh)" +``` + +The script will guide you through various cleanup options and provide statistics and next steps along the way. Each step requires confirmation before proceeding. diff --git a/debian-docker-disk-recovery/run.sh b/debian-docker-disk-recovery/run.sh new file mode 100644 index 0000000..515b673 --- /dev/null +++ b/debian-docker-disk-recovery/run.sh @@ -0,0 +1,263 @@ +#!/bin/bash + +# Debian Docker Disk Recovery Tool v1.0.0 +# Run with sudo permissions +# Support: https://ko-fi.com/bigbeartechworld + +# Set text colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Function to print header +print_header() { + echo "================================================" + echo -e "${GREEN}Debian Docker Disk Recovery Tool v1.0.0${NC}" + echo -e "${YELLOW}Support: https://ko-fi.com/bigbeartechworld${NC}" + echo "================================================" + echo "Here are some links:" + echo -e "${GREEN}https://community.bigbeartechworld.com${NC}" + echo -e "${GREEN}https://github.com/BigBearTechWorld${NC}" + echo "================================================" + echo +} + +# Check if script is run as root +if [ "$EUID" -ne 0 ]; then + echo "Please run as root (use sudo)" + exit 1 +fi + +# Function to check available space in root partition +check_space() { + local available_space=$(df / | awk 'NR==2 {print $4}') + echo $available_space +} + +# Function to display human-readable disk usage +show_disk_usage() { + echo "Current disk usage:" + df -h / +} + +# Function to ask user for confirmation +confirm_action() { + read -p "$1 (y/n): " response + case "$response" in + [yY]|[yY][eE][sS]) return 0 ;; + *) return 1 ;; + esac +} + +# Function to try starting Docker +try_start_docker() { + echo "Attempting to start Docker..." + if systemctl start docker; then + echo "Success! Docker has been started." + systemctl status docker + echo -e "\nRecommended next steps:" + echo "1. Run our Docker cleanup script to free up more space:" + echo " bash -c \"\$(wget -qLO - https://raw.githubusercontent.com/bigbeartechworld/big-bear-scripts/master/docker-cleanup/run.sh)\"" + echo "2. Or manually run these commands:" + echo " - 'docker system prune' to remove unused data" + echo " - 'docker volume prune' to remove unused volumes" + echo "3. Monitor disk space with 'df -h'" + return 0 + fi + return 1 +} + +# Function to install Docker +install_docker() { + # Check if Docker is installed via Snap + if command -v snap >/dev/null && snap list docker &> /dev/null; then + echo "Docker is installed via Snap." + if confirm_action "Do you want to uninstall the Snap version of Docker?"; then + echo "Uninstalling Docker from Snap..." + snap remove docker + else + echo "Skipping Docker uninstallation from Snap." + return 1 + fi + fi + + # Update package database + echo "Updating package database..." + apt-get update + + # Install prerequisites + echo "Installing prerequisites..." + apt-get install -y \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg \ + lsb-release + + # Add Docker's official GPG key + echo "Adding Docker's official GPG key..." + curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + + # Set up the stable repository + echo "Setting up Docker repository..." + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ + $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null + + # Install Docker Engine + echo "Installing Docker Engine..." + apt-get update + apt-get install -y docker-ce docker-ce-cli containerd.io + + # Verify Docker installation + echo "Verifying Docker installation..." + docker run hello-world + + # Ask if the user wants to install Docker Compose + if confirm_action "Do you want to install Docker Compose?"; then + echo "Installing Docker Compose..." + curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + chmod +x /usr/local/bin/docker-compose + echo "Docker Compose installed successfully." + else + echo "Skipping Docker Compose installation." + fi + + echo "Docker installation completed successfully!" + return 0 +} + +# Function to cleanup Docker resources +cleanup_docker() { + # Initialize counters + local CONTAINERS_REMOVED=0 + local IMAGES_REMOVED=0 + local VOLUMES_REMOVED=0 + local NETWORKS_REMOVED=0 + + echo "Starting Docker cleanup process..." + + # Cleanup containers + echo "Current Docker Containers:" + docker ps -a + if confirm_action "Would you like to remove all stopped containers?"; then + CONTAINERS_REMOVED=$(docker container prune -f | grep -oP '(?<=Deleted Containers: )\d+' || echo "0") + echo "Stopped containers removed." + fi + + # Cleanup images + echo "Current Docker Images:" + docker images + if confirm_action "Would you like to remove unused Docker images?"; then + IMAGES_REMOVED=$(docker image prune -a -f | grep -oP '(?<=Total reclaimed space: )\S+' || echo "0B") + echo "Unused images removed." + fi + + # Cleanup volumes + echo "Current Docker Volumes:" + docker volume ls + if confirm_action "Would you like to remove unused Docker volumes?"; then + VOLUMES_REMOVED=$(docker volume prune -f | grep -oP '(?<=Total reclaimed space: )\S+' || echo "0B") + echo "Unused volumes removed." + fi + + # Cleanup networks + echo "Current Docker Networks:" + docker network ls + if confirm_action "Would you like to remove unused Docker networks?"; then + NETWORKS_REMOVED=$(docker network prune -f | grep -oP '(?<=Deleted Networks: )\d+' || echo "0") + echo "Unused networks removed." + fi + + # Print cleanup statistics + echo "---------------------" + echo "Docker Cleanup Statistics" + echo "---------------------" + echo "Containers removed: $CONTAINERS_REMOVED" + echo "Images removed: $IMAGES_REMOVED" + echo "Volumes removed: $VOLUMES_REMOVED" + echo "Networks removed: $NETWORKS_REMOVED" + echo "---------------------" +} + +print_header +echo "Starting interactive disk space recovery for Docker..." +show_disk_usage + +# Try to start Docker first to see if it works +if try_start_docker; then + exit 0 +fi + +# Step 1: Clear journal logs +if confirm_action "Would you like to clear system journal logs?"; then + echo "Clearing system journal logs..." + journalctl --vacuum-time=1d + show_disk_usage + if try_start_docker; then + exit 0 + fi +fi + +# Step 2: Clean package manager cache +if confirm_action "Would you like to clean package manager cache?"; then + echo "Cleaning package manager cache..." + apt-get clean + apt-get autoremove -y + show_disk_usage + if try_start_docker; then + exit 0 + fi +fi + +# Step 3: Clean up old Docker logs +if confirm_action "Would you like to clean up Docker container logs?"; then + echo "Cleaning up Docker container logs..." + find /var/lib/docker/containers/ -type f -name "*.log" -exec truncate -s 0 {} \; + show_disk_usage + if try_start_docker; then + exit 0 + fi +fi + +# Step 4: Remove old container logs one by one +if confirm_action "Would you like to review and clean individual container logs?"; then + for container_dir in /var/lib/docker/containers/*; do + if [ -d "$container_dir" ]; then + container_id=$(basename "$container_dir") + log_size=$(du -h "$container_dir"/*-json.log 2>/dev/null | cut -f1) + if [ ! -z "$log_size" ]; then + if confirm_action "Container $container_id has log size $log_size. Clear it?"; then + truncate -s 0 "$container_dir"/*-json.log + show_disk_usage + if try_start_docker; then + exit 0 + fi + fi + fi + fi + done +fi + +echo "Docker still cannot start. You might need to:" +echo "1. Check Docker logs: journalctl -u docker" +echo "2. Consider more aggressive cleanup options" +echo "3. Add more disk space to the system" + +# Try Docker cleanup if it's running +if systemctl is-active docker >/dev/null 2>&1; then + if confirm_action "Would you like to perform Docker cleanup?"; then + cleanup_docker + fi +fi + +# Ask if user wants to reinstall Docker +if confirm_action "Would you like to reinstall Docker?"; then + echo "Proceeding with Docker installation..." + if install_docker; then + echo "Docker has been successfully reinstalled!" + else + echo "Docker installation was not completed. Please check the errors above." + fi +fi