#!/usr/bin/env bash set -euo pipefail if [[ $# -lt 1 ]]; then echo "Usage: $0 " >&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"