#!/usr/bin/env bash set -euo pipefail SUFFIX="${RANDOM}${RANDOM}" SOURCE="matchday-backup-source-$SUFFIX" RESTORE="matchday-backup-restore-$SUFFIX" DB_TEST_VALUE="local-backup-test-$SUFFIX" TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/matchday-backup-test.XXXXXX")" DUMP="$TMP_DIR/matchday.dump" cleanup() { docker rm -f "$SOURCE" "$RESTORE" >/dev/null 2>&1 || true rm -rf "$TMP_DIR" } trap cleanup EXIT INT TERM wait_for_postgres() { local name="$1" for _ in $(seq 1 60); do ready_markers="$(docker logs "$name" 2>&1 | grep -c 'database system is ready to accept connections' || true)" if [[ "$ready_markers" -ge 2 ]] && \ docker exec "$name" psql -U matchday -d matchday -Atc 'SELECT 1' >/dev/null 2>&1; then return fi sleep 0.25 done echo "PostgreSQL test container did not become ready." >&2 exit 1 } start_postgres() { local name="$1" docker run -d --name "$name" \ -e "POSTGRES_PASSWORD=$DB_TEST_VALUE" \ -e POSTGRES_USER=matchday \ -e POSTGRES_DB=matchday \ postgres:16-alpine >/dev/null wait_for_postgres "$name" } start_postgres "$SOURCE" docker exec "$SOURCE" psql -U matchday -d matchday -v ON_ERROR_STOP=1 -c \ "CREATE TABLE backup_probe (value text PRIMARY KEY); INSERT INTO backup_probe VALUES ('matchday-backup-ok');" >/dev/null docker stop "$SOURCE" >/dev/null docker start "$SOURCE" >/dev/null wait_for_postgres "$SOURCE" RESTARTED="$(docker exec "$SOURCE" psql -U matchday -d matchday -Atc 'SELECT value FROM backup_probe')" test "$RESTARTED" = "matchday-backup-ok" docker exec "$SOURCE" pg_dump -U matchday -d matchday -Fc > "$DUMP" docker rm -f "$SOURCE" >/dev/null start_postgres "$RESTORE" docker exec -i "$RESTORE" pg_restore -U matchday -d matchday --clean --if-exists < "$DUMP" >/dev/null RESTORED="$(docker exec "$RESTORE" psql -U matchday -d matchday -Atc 'SELECT value FROM backup_probe')" test "$RESTORED" = "matchday-backup-ok" printf 'PostgreSQL restart and backup/restore verified with sentinel: %s\n' "$RESTORED"