#!/usr/bin/env bash # anwarpy.ai — Postgres backup (L-06) # # Run ON THE VPS (needs the `proxy`/compose network up): # ./scripts/backup-db.sh # # Cron (nightly 03:15, keep dir writable): # 15 3 * * * cd /root/anwarpi && ./scripts/backup-db.sh >> backups/backup.log 2>&1 # # Restore a dump into the running db container: # gunzip -c backups/anwarpi-YYYYMMDD-HHMMSS.sql.gz | \ # docker compose -f docker-compose.vps.yml exec -T db psql -U anwarpi anwarpi # # Restore-rehearsal (verify a backup is loadable BEFORE you need it): # gunzip -c backups/.sql.gz | \ # docker compose -f docker-compose.vps.yml exec -T db psql -U anwarpi -c "CREATE DATABASE anwarpi_restore_test;" # gunzip -c backups/.sql.gz | \ # docker compose -f docker-compose.vps.yml exec -T db psql -U anwarpi -d anwarpi_restore_test -q # docker compose -f docker-compose.vps.yml exec -T db psql -U anwarpi -d anwarpi_restore_test -tAc \ # "SELECT (SELECT count(*) FROM posts) AS posts, (SELECT count(*) FROM users) AS users;" # docker compose -f docker-compose.vps.yml exec -T db psql -U anwarpi -c "DROP DATABASE anwarpi_restore_test;" set -euo pipefail cd "$(dirname "$0")/.." mkdir -p backups STAMP=$(date +%Y%m%d-%H%M%S) OUT="backups/anwarpi-${STAMP}.sql.gz" docker compose -f docker-compose.vps.yml exec -T db pg_dump -U anwarpi anwarpi | gzip > "$OUT" echo "wrote $OUT ($(du -h "$OUT" | cut -f1))"