Files
reservas/ops/test-restore-postgres.sh

52 lines
1.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
backup_path="${1:-}"
if [[ -z "$backup_path" ]] || [[ ! -f "$backup_path" ]]; then
echo "Utilização: $0 <ficheiro.dump>" >&2
exit 1
fi
database_user="$(docker compose exec -T postgres printenv POSTGRES_USER)"
restore_database="reserva_restore_$(date -u +%Y%m%d%H%M%S)_$$"
if [[ ! "$database_user" =~ ^[A-Za-z0-9_]+$ ]] || [[ ! "$restore_database" =~ ^reserva_restore_[0-9_]+$ ]]; then
echo "Identificador de restauro inválido." >&2
exit 1
fi
cleanup() {
docker compose exec -T postgres dropdb \
--username="$database_user" \
--if-exists \
"$restore_database" > /dev/null
}
trap cleanup EXIT
docker compose exec -T postgres createdb \
--username="$database_user" \
"$restore_database"
docker compose exec -T postgres pg_restore \
--username="$database_user" \
--dbname="$restore_database" \
--no-owner \
--no-privileges < "$backup_path"
migration_count="$(docker compose exec -T postgres psql \
--username="$database_user" \
--dbname="$restore_database" \
--tuples-only \
--no-align \
--command='select count(*) from migrations')"
if [[ ! "$migration_count" =~ ^[1-9][0-9]*$ ]]; then
echo "O restauro não contém o histórico de migrations esperado." >&2
exit 1
fi
echo "Restauro validado em base temporária (${migration_count} migrations)."