| #!/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" |
|
|