25 lines
831 B
Bash
25 lines
831 B
Bash
#!/bin/sh
|
|
set -eu
|
|
|
|
if [ -z "${PG_BACKUP_DSN:-}" ]; then
|
|
echo "PG_BACKUP_DSN is required (managed PostgreSQL TLS DSN, supplied via secure environment)." >&2
|
|
exit 64
|
|
fi
|
|
case "$PG_BACKUP_DSN" in
|
|
*sslmode=verify-full*sslrootcert=*) ;;
|
|
*) echo "PG_BACKUP_DSN must enforce sslmode=verify-full and sslrootcert." >&2; exit 64 ;;
|
|
esac
|
|
|
|
output_dir=${1:-/opt/han-chat/backups}
|
|
umask 077
|
|
mkdir -p "$output_dir"
|
|
stamp=$(date -u +%Y%m%dT%H%M%SZ)
|
|
archive="$output_dir/han-chat-$stamp.dump"
|
|
|
|
pg_dump --dbname="$PG_BACKUP_DSN" --format=custom --no-owner --no-privileges --file="$archive"
|
|
pg_restore --list "$archive" >/dev/null
|
|
sha256sum "$archive" > "$archive.sha256"
|
|
chmod 600 "$archive" "$archive.sha256"
|
|
echo "Logical backup verified: $archive"
|
|
echo "This supplements, but does not replace, provider backup/PITR and restore rehearsal."
|