Das dokumentierte Backup lief real nie (stock postgres-Image ohne Cron, backup.sh nirgends eingebunden) -> bei Volume-/Disk-Verlust drohte Totalverlust. - Neuer service "backup" (docker-compose.yml): postgres:16-alpine als Sidecar, taeglicher pg_dump um BACKUP_HOUR (Default 03:00 Europe/Berlin) - backup-loop.sh: abhaengigkeitsfreier Tages-Scheduler (umgeht busybox-cron- Environment-Eigenheiten) - backup.sh korrigiert: laeuft remote gegen PGHOST mit PGPASSWORD; -Fc statt "-Fc | gzip" (war doppelt komprimiert und als .sql.gz nicht restore-bar) -> .dump - BACKUP_HOUR/BACKUP_RETENTION_DAYS konfigurierbar (.env.example) - operations.md: Backup-/Restore-Anleitung an Ist-Zustand angepasst Verifiziert: pg_dump erstellt + pg_restore in frische DB, Daten intakt. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
20 lines
725 B
Bash
Executable File
20 lines
725 B
Bash
Executable File
#!/bin/sh
|
|
# Minimaler Tages-Scheduler für den Backup-Sidecar: führt backup.sh einmal
|
|
# täglich zur Stunde BACKUP_HOUR (Container-TZ = Europe/Berlin) aus.
|
|
#
|
|
# Bewusst kein cron: ein simpler Poll-Loop erbt das Container-Environment
|
|
# zuverlässig (POSTGRES_PASSWORD u. a.) und hat keine busybox-cron-Eigenheiten.
|
|
|
|
set -eu
|
|
|
|
HOUR="${BACKUP_HOUR:-03}"
|
|
echo "Backup-Sidecar aktiv — täglich um ${HOUR}:00 (TZ=${TZ:-UTC}), Retention ${BACKUP_RETENTION_DAYS:-14} Tage."
|
|
|
|
while true; do
|
|
if [ "$(date +%H)" = "$HOUR" ] && [ "$(date +%M)" = "00" ]; then
|
|
/usr/local/bin/backup.sh || echo "Backup fehlgeschlagen (Exit $?)" >&2
|
|
sleep 61 # diese Minute überspringen, damit nicht doppelt ausgelöst wird
|
|
fi
|
|
sleep 30
|
|
done
|