102 lines
2.8 KiB
Django/Jinja
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"
|