#!/bin/bash # Docker Volume Backup Script # Wird remote auf dem Server ausgeführt # Sichert alle Docker Volumes automatisch set -e # Parameter BACKUP_DATE="${BACKUP_DATE:-$(date +%Y%m%d_%H%M%S)}" BACKUP_BASE_DIR="$HOME/backups" BACKUP_DIR="$BACKUP_BASE_DIR/$BACKUP_DATE" EXCLUDE_VOLUMES="${EXCLUDE_VOLUMES:-}" # Komma-separierte Liste von Volumes die übersprungen werden sollen echo "========================================" echo "Docker Volume Backup" echo "========================================" echo "Backup directory: $BACKUP_DIR" echo "Date: $(date)" echo "Server: ${SERVER_NAME:-unknown}" echo "" # Backup-Verzeichnis erstellen echo "Creating backup directory: $BACKUP_DIR" mkdir -p "$BACKUP_DIR" echo "Discovering Docker volumes..." VOLUMES=$(docker volume ls --format '{{.Name}}') VOLUME_COUNT=$(echo "$VOLUMES" | wc -l) if [ -z "$VOLUMES" ]; then echo "⚠ No Docker volumes found!" exit 0 fi echo "Found $VOLUME_COUNT volumes to backup" if [ -n "$EXCLUDE_VOLUMES" ]; then echo "Excluding: $EXCLUDE_VOLUMES" fi echo "" # Funktion zum Prüfen ob Volume ausgeschlossen werden soll is_excluded() { local VOLUME_NAME=$1 if [ -z "$EXCLUDE_VOLUMES" ]; then return 1 # Nicht ausgeschlossen fi IFS=',' read -ra EXCLUDED <<< "$EXCLUDE_VOLUMES" for excluded in "${EXCLUDED[@]}"; do if [[ "$VOLUME_NAME" == "$excluded" ]]; then return 0 # Ausgeschlossen fi done return 1 # Nicht ausgeschlossen } # Funktion zum Backup eines Volumes backup_volume() { local VOLUME_NAME=$1 local SAFE_NAME=$(echo "$VOLUME_NAME" | tr '/' '_' | tr ':' '_') # Prüfen ob ausgeschlossen if is_excluded "$VOLUME_NAME"; then echo "⊘ Skipping $VOLUME_NAME (excluded)" return 0 fi echo "Backing up: $VOLUME_NAME..." if docker run --rm \ -v "$VOLUME_NAME":/source:ro \ -v "$BACKUP_DIR":/backup \ alpine tar czf "/backup/${SAFE_NAME}.tar.gz" -C /source . 2>/dev/null; then SIZE=$(du -h "$BACKUP_DIR/${SAFE_NAME}.tar.gz" | cut -f1) echo "✓ $VOLUME_NAME backed up ($SIZE)" else echo "✗ Failed to backup $VOLUME_NAME" return 1 fi } # Alle Volumes sichern SUCCESS_COUNT=0 FAILED_COUNT=0 while IFS= read -r volume; do if backup_volume "$volume"; then ((SUCCESS_COUNT++)) || true else ((FAILED_COUNT++)) || true fi echo "" done <<< "$VOLUMES" # Create manifest echo "========================================" echo "Creating backup manifest..." cd "$BACKUP_DIR" cat > manifest.txt << EOF Backup created: $(date) Hostname: $(hostname) Server: ${SERVER_NAME:-unknown} Total volumes: $VOLUME_COUNT Successful: $SUCCESS_COUNT Failed: $FAILED_COUNT Files: $(ls -lh *.tar.gz 2>/dev/null || echo "No backup files created") Checksums (SHA256): $(sha256sum *.tar.gz 2>/dev/null || echo "No files to checksum") EOF echo "Backup manifest:" cat manifest.txt echo "" echo "Total backup size: $(du -sh $BACKUP_DIR | cut -f1)" echo "========================================" echo "Summary:" echo " Total volumes: $VOLUME_COUNT" echo " Successful: $SUCCESS_COUNT" echo " Failed: $FAILED_COUNT" echo "========================================" if [ $FAILED_COUNT -gt 0 ]; then echo "⚠ Backup completed with errors!" exit 1 else echo "✓ Backup completed successfully!" exit 0 fi