#!/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" [ "$(date +%u)" = 7 ] && cp "$LOCAL/daily/autoscholar-$STAMP.dump" "$LOCAL/weekly/" ls -1t "$LOCAL/daily"/*.dump | tail -n +8 | xargs -r rm -f ls -1t "$LOCAL/weekly"/*.dump 2>/dev/null | tail -n +5 | xargs -r rm -f sha256sum "$LOCAL/daily/autoscholar-$STAMP.dump" 2>/dev/null || 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"