#!/bin/bash # Backup Docker Configurations Script # Creates timestamped backup of all Docker configs set -e BACKUP_DIR="/mnt/media/backups/tower-of-joy-configs" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_PATH="${BACKUP_DIR}/backup_${TIMESTAMP}" SOURCE_DIR="/home/jpmschweitzer/docker-data" echo "=== Docker Configs Backup ===" echo "Timestamp: $(date)" echo "" # Check if source exists if [ ! -d "$SOURCE_DIR" ]; then echo "❌ Source directory not found: $SOURCE_DIR" exit 1 fi # Create backup directory echo "[1/4] Creating backup directory..." mkdir -p "$BACKUP_PATH" echo "✅ Created: $BACKUP_PATH" echo "" # Backup Docker configs echo "[2/4] Backing up Docker configs..." rsync -av --progress "$SOURCE_DIR/" "$BACKUP_PATH/" --exclude='cache' --exclude='*.log' echo "✅ Configs backed up" echo "" # Backup stack files echo "[3/4] Backing up stack definitions..." mkdir -p "$BACKUP_PATH/stacks" cp -r /home/jpmschweitzer/Projects/tower-of-joy/stacks/*.yml "$BACKUP_PATH/stacks/" 2>/dev/null || true echo "✅ Stack files backed up" echo "" # Create backup manifest echo "[4/4] Creating backup manifest..." cat > "$BACKUP_PATH/MANIFEST.txt" << EOF Backup created: $(date) Hostname: $(hostname) Docker version: $(docker --version) Containers backed up: $(docker ps --format ' - {{.Names}} ({{.Image}})') Backup size: $(du -sh "$BACKUP_PATH" | cut -f1) EOF echo "✅ Manifest created" echo "" # Cleanup old backups (keep last 30 days) echo "[Cleanup] Removing backups older than 30 days..." find "$BACKUP_DIR" -maxdepth 1 -type d -name "backup_*" -mtime +30 -exec rm -rf {} \; 2>/dev/null || true remaining=$(find "$BACKUP_DIR" -maxdepth 1 -type d -name "backup_*" | wc -l) echo "✅ Kept $remaining recent backups" echo "" echo "=== Backup Complete ===" echo "Location: $BACKUP_PATH" echo "Size: $(du -sh "$BACKUP_PATH" | cut -f1)" echo "" # Verify backup if [ -d "$BACKUP_PATH" ] && [ -f "$BACKUP_PATH/MANIFEST.txt" ]; then echo "✅ Backup verification passed" exit 0 else echo "❌ Backup verification failed" exit 1 fi