#!/bin/bash set -euo pipefail source /home/nico/backup/lib.sh # ================================ # Grundeinstellungen # ================================ WORDPRESS_BASE="/home/nico/docker-setup/wordpress" BACKUP_DIR="/home/nico/backup/tmp/wordpress_backups" REMOTE="onedrive-tdhaider:/IONOS/Backups/wordpress" MARIADB_CONTAINER="mariadb" DATE=$(date +%F_%H-%M-%S) RUN_DIR="$BACKUP_DIR/$DATE" mkdir -p "$RUN_DIR" log "🚀 Starte WordPress Komplett-Backup" log "📅 Backup-Zeitpunkt: $DATE" log "=========================================" FAILED_SITES=() # ================================ # Alle WordPress-Seiten durchgehen # ================================ for SITE_PATH in "$WORDPRESS_BASE"/*; do [ -d "$SITE_PATH" ] || continue SITE_NAME=$(basename "$SITE_PATH") ENV_FILE="$SITE_PATH/.env" VOLUME_NAME="wordpress_${SITE_NAME}" SITE_DIR="$RUN_DIR/$SITE_NAME" log log "🔹 Verarbeite: $SITE_NAME" if [ ! -f "$ENV_FILE" ]; then log "⚠️ Keine .env gefunden – überspringe" FAILED_SITES+=("$SITE_NAME (keine .env)") continue fi mkdir -p "$SITE_DIR" # ================================ # .env laden # ================================ set -o allexport source "$ENV_FILE" set +o allexport if [[ -z "${MYSQL_DATABASE:-}" || -z "${MYSQL_USER:-}" || -z "${MYSQL_PASSWORD:-}" ]]; then log "❌ Unvollständige DB-Zugangsdaten" FAILED_SITES+=("$SITE_NAME (DB-Config)") continue fi # ================================ # Datenbank sichern # ================================ DB_FILE="$SITE_DIR/db_${SITE_NAME}_${DATE}.sql.gz" log "🗄️ DB Backup: $MYSQL_DATABASE" if docker exec -e MYSQL_PWD="$MYSQL_PASSWORD" "$MARIADB_CONTAINER" \ mariadb-dump -h 127.0.0.1 -u "$MYSQL_USER" "$MYSQL_DATABASE" \ | gzip > "$DB_FILE"; then log "✅ DB gesichert" else log "❌ DB Backup fehlgeschlagen" FAILED_SITES+=("$SITE_NAME (DB)") continue fi # ================================ # WordPress-Dateien (Volume) # ================================ FILES_FILE="$SITE_DIR/files_${SITE_NAME}_${DATE}.tar.gz" log "📦 Dateien Backup (low-load, Volume: $VOLUME_NAME)" if docker run --rm \ -v "$VOLUME_NAME":/data \ -v "$SITE_DIR":/backup \ alpine sh -c " nice -n 19 ionice -c2 -n7 \ tar \ --exclude='./wp-content/cache' \ --exclude='./wp-content/wflogs' \ --exclude='./wp-content/uploads/cache' \ --exclude='./wp-content/updraft' \ -cf - -C /data . \ | gzip -1 > /backup/$(basename "$FILES_FILE") "; then log "✅ Dateien gesichert" else log "❌ Dateien Backup fehlgeschlagen" FAILED_SITES+=("$SITE_NAME (Files)") continue fi done # ================================ # Einmaliger Upload # ================================ log log "☁️ Starte EINEN Gesamt-Upload zu OneDrive..." upload "$RUN_DIR" "$REMOTE/$DATE" log "✅ Upload abgeschlossen" cleanup_keep_latest "$REMOTE" 2 log "✅ Cleanup abgeschlossen!" # ================================ # Aufräumen # ================================ [[ -d "$BACKUP_DIR" ]] && rm -rf "$BACKUP_DIR" log log "🧹 Lokale temporäre Backups gelöscht" log "🏁 WordPress Backup abgeschlossen" # ================================ # Ergebnisübersicht # ================================ if [ "${#FAILED_SITES[@]}" -gt 0 ]; then log log "⚠️ Folgende Seiten hatten Probleme:" for SITE in "${FAILED_SITES[@]}"; do log " - $SITE" done else log log "🎉 Alle WordPress-Seiten erfolgreich gesichert!" fi