#!/bin/bash # Nightly backup: pg_dump (custom format) + artifact rsync to BACKUP_TARGET (user@host:dir). Keeps 7 daily + 4 weekly dumps locally. set -euo pipefail : "${DATABASE_URL:?}" "${ARTIFACT_ROOT:?}" "${BACKUP_TARGET:?}" export PATH=/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:/usr/bin:/bin STAMP=$(date +%Y%m%d-%H%M) LOCAL="${ARTIFACT_ROOT%/artifacts}/backups"; mkdir -p "$LOCAL/daily" "$LOCAL/weekly" pg_dump --no-owner -Fc "$DATABASE_URL" > "$LOCAL/daily/autoscholar-$STAMP.dump" if [ "$(date +%u)" = 7 ]; then cp "$LOCAL/daily/autoscholar-$STAMP.dump" "$LOCAL/weekly/"; fi (ls -1t "$LOCAL/daily"/*.dump 2>/dev/null | tail -n +8 | xargs rm -f) || true (ls -1t "$LOCAL/weekly"/*.dump 2>/dev/null | tail -n +5 | xargs rm -f) || true shasum -a 256 "$LOCAL/daily/autoscholar-$STAMP.dump" ssh -o BatchMode=yes "${BACKUP_TARGET%%:*}" "mkdir -p ${BACKUP_TARGET#*:}/dumps ${BACKUP_TARGET#*:}/artifacts" rsync -a --delete "$LOCAL/daily/" "$BACKUP_TARGET/dumps/" rsync -a "$ARTIFACT_ROOT/" "$BACKUP_TARGET/artifacts/" echo "backup $STAMP ok → $BACKUP_TARGET"