#!/bin/sh # ───────────────────────────────────────────────────────────────────────────── # Single Postgres backup: pg_dump -> gzip -> N-day rotation. # Run by scripts/backup-loop.sh inside the `backup` compose service. # Env: DB_USER, DB_PASSWORD, DB_NAME, BACKUP_DIR, RETENTION_DAYS # ───────────────────────────────────────────────────────────────────────────── set -eu BACKUP_DIR="${BACKUP_DIR:-/backups}" RETENTION_DAYS="${RETENTION_DAYS:-14}" TS=$(date -u +%Y%m%d_%H%M%S) OUT="${BACKUP_DIR}/flux_db_${TS}.sql.gz" mkdir -p "$BACKUP_DIR" export PGPASSWORD="$DB_PASSWORD" echo "[backup] $(date -u +%Y-%m-%dT%H:%M:%SZ) starting pg_dump -> ${OUT}" # --no-owner/--no-privileges keep the dump portable across roles on restore. if pg_dump -h postgres -U "$DB_USER" -d "$DB_NAME" --no-owner --no-privileges | gzip -9 > "$OUT"; then SIZE=$(du -h "$OUT" | cut -f1) echo "[backup] OK: ${OUT} (${SIZE})" else echo "[backup] FAILED: pg_dump returned non-zero; removing partial file" rm -f "$OUT" exit 1 fi # Rotation — drop dumps older than RETENTION_DAYS. DELETED=$(find "$BACKUP_DIR" -name 'flux_db_*.sql.gz' -mtime +"$RETENTION_DAYS" -print -delete 2>/dev/null | wc -l || echo 0) echo "[backup] rotation: kept last ${RETENTION_DAYS} days, pruned ${DELETED} old dump(s)"