Backup-Sidecar: täglicher pg_dump scharf geschaltet

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>
This commit is contained in:
Raffael SheikhandClaude Opus 4.8 committed 2026-06-07 11:09:38 +02:00
1 parent 39e259f3ac
commit 7285ed9cae
5 files changed
+95 -13

No files matched your search

+27
View File
@@ -21,6 +21,33 @@ services:
timeout: 5s
retries: 5
# Backup-Sidecar: täglicher pg_dump des postgres-Service nach cockpit_backups.
# Nutzt scripts/backup.sh (Custom-Format-Dump + Retention + API-Heartbeat),
# getaktet von scripts/backup-loop.sh. Stock postgres-Image → pg_dump passt
# versionsgenau (16) zur DB. Restore: siehe docs/operations.md.
backup:
image: postgres:16-alpine
container_name: cockpit-backup
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
POSTGRES_USER: ${POSTGRES_USER:-cockpit}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB:-cockpit}
PGHOST: postgres
API_URL: http://api:3000
CRON_BEARER_TOKEN: ${CRON_BEARER_TOKEN}
BACKUP_HOUR: ${BACKUP_HOUR:-03}
BACKUP_RETENTION_DAYS: ${BACKUP_RETENTION_DAYS:-14}
TZ: Europe/Berlin
volumes:
- cockpit_backups:/backups
- ./scripts/backup.sh:/usr/local/bin/backup.sh:ro
- ./scripts/backup-loop.sh:/usr/local/bin/backup-loop.sh:ro
entrypoint: ['/bin/sh', '/usr/local/bin/backup-loop.sh']
api:
build:
context: .