snapshot: preserve backup UX, remote target setup, and docs updates
This commit is contained in:
55
scripts/backup_verify.sh
Normal file
55
scripts/backup_verify.sh
Normal file
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
if [[ $# -lt 1 ]]; then
|
||||
echo "Usage: $0 <backup_dir>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
backup_dir="$1"
|
||||
db_dump_path="$backup_dir/db.dump"
|
||||
media_archive_path="$backup_dir/media.tar.gz"
|
||||
|
||||
if [[ ! -f "$db_dump_path" || ! -f "$media_archive_path" ]]; then
|
||||
echo "Backup files missing in $backup_dir" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -a
|
||||
. ./.env
|
||||
set +a
|
||||
|
||||
verify_db="${POSTGRES_DB}_verify_$(date +%s)"
|
||||
verify_media_dir="$(mktemp -d /tmp/tubco_backup_verify_media.XXXXXX)"
|
||||
|
||||
cleanup() {
|
||||
docker compose exec -T db sh -lc "PGPASSWORD='$POSTGRES_PASSWORD' psql -U '$POSTGRES_USER' -d postgres -c \"DROP DATABASE IF EXISTS \\\"$verify_db\\\";\"" >/dev/null 2>&1 || true
|
||||
chmod -R u+rwx "$verify_media_dir" >/dev/null 2>&1 || true
|
||||
rm -rf "$verify_media_dir"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
docker compose exec -T db sh -lc "PGPASSWORD='$POSTGRES_PASSWORD' psql -U '$POSTGRES_USER' -d postgres -c \"CREATE DATABASE \\\"$verify_db\\\";\""
|
||||
docker compose exec -T db sh -lc "PGPASSWORD='$POSTGRES_PASSWORD' pg_restore -U '$POSTGRES_USER' -d '$verify_db' --no-owner --no-privileges" < "$db_dump_path"
|
||||
|
||||
table_count="$(docker compose exec -T db sh -lc "PGPASSWORD='$POSTGRES_PASSWORD' psql -U '$POSTGRES_USER' -d '$verify_db' -t -A -c \"SELECT COUNT(*) FROM pg_tables WHERE schemaname='public';\"")"
|
||||
onboarding_count="$(docker compose exec -T db sh -lc "PGPASSWORD='$POSTGRES_PASSWORD' psql -U '$POSTGRES_USER' -d '$verify_db' -t -A -c \"SELECT COUNT(*) FROM workflows_onboardingrequest;\"")"
|
||||
offboarding_count="$(docker compose exec -T db sh -lc "PGPASSWORD='$POSTGRES_PASSWORD' psql -U '$POSTGRES_USER' -d '$verify_db' -t -A -c \"SELECT COUNT(*) FROM workflows_offboardingrequest;\"")"
|
||||
|
||||
tar -C "$verify_media_dir" --no-same-owner --no-same-permissions -xzf "$media_archive_path"
|
||||
if [[ ! -d "$verify_media_dir/media" ]]; then
|
||||
echo "Media restore verification failed: extracted media directory missing" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
media_file_count="$(find "$verify_media_dir/media" -type f | wc -l | tr -d ' ')"
|
||||
|
||||
printf 'Verified backup: %s\n' "$backup_dir"
|
||||
printf 'Restore DB: %s\n' "$verify_db"
|
||||
printf 'Public tables: %s\n' "$table_count"
|
||||
printf 'Onboarding rows: %s\n' "$onboarding_count"
|
||||
printf 'Offboarding rows: %s\n' "$offboarding_count"
|
||||
printf 'Media files: %s\n' "$media_file_count"
|
||||
Reference in New Issue
Block a user