backup-automation/ansible/roles/borg-client/templates/pre-backup-docker.sh.j2

102 lines
2.8 KiB
Django/Jinja

#!/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"