File size: 2,013 Bytes
6d528b3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #!/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"
|