30 lines
1.0 KiB
Bash
30 lines
1.0 KiB
Bash
#!/usr/bin/env sh
|
|
# Daily PostgreSQL backup via Docker Compose (database service).
|
|
# Run from anywhere: uses project root next to this script.
|
|
# Cron example (2:15 AM): 15 2 * * * /path/to/repo/scripts/backup-postgres.sh
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
|
PROJECT_ROOT=$(CDPATH= cd -- "$SCRIPT_DIR/.." && pwd)
|
|
cd "$PROJECT_ROOT"
|
|
|
|
BACKUP_DIR="${BACKUP_DIR:-$PROJECT_ROOT/backups}"
|
|
KEEP_DAYS="${KEEP_DAYS:-14}"
|
|
|
|
mkdir -p "$BACKUP_DIR"
|
|
STAMP=$(date +%Y%m%d-%H%M%S)
|
|
OUT="$BACKUP_DIR/dashboard_db-$STAMP.sql.gz"
|
|
|
|
# TCP + password avoids peer-auth issues when exec runs as non-postgres user
|
|
docker compose exec -T database sh -c \
|
|
'PGPASSWORD="$POSTGRES_PASSWORD" pg_dump -h 127.0.0.1 -U "$POSTGRES_USER" -d "$POSTGRES_DB" --no-owner --no-acl' \
|
|
| gzip -c > "$OUT"
|
|
|
|
echo "Backup written: $OUT"
|
|
|
|
# Drop backups older than KEEP_DAYS (optional)
|
|
if [ -n "$KEEP_DAYS" ] && [ "$KEEP_DAYS" -gt 0 ] 2>/dev/null; then
|
|
find "$BACKUP_DIR" -maxdepth 1 -name 'dashboard_db-*.sql.gz' -type f -mtime "+$KEEP_DAYS" -delete 2>/dev/null || true
|
|
fi
|