Add pg_dump/pg_restore backup and restore scripts

For moving this project to a new server: git tracks code, not the
Postgres data directory, and raw volume/data-dir copying is fragile
across Postgres versions or architectures (this repo already hit a
collation-version mismatch once from just changing the Postgres
image). pg_dump/pg_restore is the portable way to move the actual
data instead.

scripts/backup-db.sh dumps the running postgres container's database
in pg_dump's custom format into ./backups/ (gitignored — dumps
contain real user data and don't belong in git history). It reads
POSTGRES_USER/POSTGRES_DB from the container's own environment rather
than re-parsing .env, so it can't drift out of sync with the actual
running config.

scripts/restore-db.sh restores a dump into the running container
(--clean --if-exists --single-transaction, so a failure rolls back
atomically instead of leaving a half-restored database), with a
confirmation prompt since it's destructive, skippable via -y.

Added .gitattributes forcing LF on *.sh — Windows git would otherwise
check these out as CRLF, breaking the bash shebang on the Linux
server they're meant to run on.

Verified end to end: took a real backup of the live database, restored
it back over itself, and confirmed exact row-count matches across every
table plus that pgvector similarity search still works on the restored
embeddings (not just that the bytes round-tripped).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Thorsten
2026-09-03 13:04:00 +02:00
parent a58730fce7
commit fb19795fdb
4 changed files with 65 additions and 0 deletions
+19
View File
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
# Dumps the Postgres database from the running "postgres" container into ./backups/,
# in pg_dump's custom format (compressed, restorable with pg_restore — see restore-db.sh).
#
# Usage: scripts/backup-db.sh
set -euo pipefail
cd "$(dirname "$0")/.."
mkdir -p backups
timestamp="$(date +%Y%m%d_%H%M%S)"
out="backups/dnd_backup_${timestamp}.dump"
trap 'rm -f "${out}"' ERR
echo "Dumping database into ${out} ..."
docker compose exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -F c' > "${out}"
size="$(du -h "${out}" | cut -f1)"
echo "Done: ${out} (${size})"