#!/bin/bash # Pre-Backup Hook für Docker Container # Dumped Datenbanken und exportiert Named Volumes LOG_FILE="${1:-/var/log/mbo-backup/docker-pre-backup.log}" DOCKER_BACKUP_DIR="/var/backups/docker" DUMP_DIR="$DOCKER_BACKUP_DIR/$(date +%Y%m%d-%H%M%S)" mkdir -p "$DUMP_DIR" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE" } # ====================== # MySQL/MariaDB Dumps # ====================== dump_mysql_containers() { log "Dumping MySQL/MariaDB containers..." docker ps --filter "label=backup.mysql=true" --format "{{.Names}}" | while read container; do log " Dumping $container..." docker exec "$container" mysqldump \ --all-databases \ --single-transaction \ --quick \ --lock-tables=false \ > "$DUMP_DIR/${container}-mysql-dump.sql" \ 2>> "$LOG_FILE" || log "Failed to dump $container" done } # ====================== # PostgreSQL Dumps # ====================== dump_postgres_containers() { log "Dumping PostgreSQL containers..." docker ps --filter "label=backup.postgres=true" --format "{{.Names}}" | while read container; do log " Dumping $container..." docker exec "$container" pg_dumpall \ > "$DUMP_DIR/${container}-postgres-dump.sql" \ 2>> "$LOG_FILE" || log "Failed to dump $container" done } # ====================== # Named Volumes Export # ====================== export_named_volumes() { log "Exporting named volumes..." docker volume ls --filter "label=backup=true" --format "{{.Name}}" | while read volume; do log " Exporting volume: $volume..." VOLUME_BACKUP="$DUMP_DIR/volume-${volume}.tar.gz" # Erstelle Container zum Backup der Volume docker run --rm \ -v "$volume:/data" \ -v "$DUMP_DIR:/backup" \ alpine tar czf "/backup/$(basename "$VOLUME_BACKUP")" -C /data . \ 2>> "$LOG_FILE" || log "Failed to export volume $volume" done } # ====================== # Docker Compose Backups # ====================== backup_compose_files() { log "Backing up docker-compose files..." find / -name "docker-compose.yml" -o -name "docker-compose.yaml" 2>/dev/null | while read compose_file; do dir=$(dirname "$compose_file") safe_name=$(echo "$dir" | sed 's/\//_/g') log " Backing up: $compose_file" cp "$compose_file" "$DUMP_DIR/compose-${safe_name}.yml" 2>> "$LOG_FILE" done } # ====================== # Cleanup old dumps # ====================== cleanup_old_dumps() { log "Cleaning up backups older than 7 days..." find "$DOCKER_BACKUP_DIR" -type d -mtime +7 -exec rm -rf {} \; 2>/dev/null || true } # ====================== # Main # ====================== log "=== Docker Pre-Backup Started ===" dump_mysql_containers dump_postgres_containers export_named_volumes backup_compose_files cleanup_old_dumps log "=== Docker Pre-Backup Completed ===" log "Backup directory: $DUMP_DIR"