Files
backup-scripts/backup-wordpress.sh
T
2026-04-27 17:45:35 +02:00

136 lines
3.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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