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"