agagsder commited on
Commit
c1cdb5b
·
verified ·
1 Parent(s): c1dd2b7

Restore PostgreSQL state from bucket

Browse files
Files changed (1) hide show
  1. start.sh +98 -0
start.sh CHANGED
@@ -12,6 +12,104 @@ if [ -z "$DATABASE_PASSWORD" ]; then
12
  exit 1
13
  fi
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  mkdir -p "$PGDATA" "$REDIS_DATA_DIR" "$APP_DATA_DIR"
16
  chown -R postgres:postgres "$PGDATA"
17
  chmod 700 "$PGDATA"
 
12
  exit 1
13
  fi
14
 
15
+ mkdir -p "$PGDATA" "$REDIS_DATA_DIR" "$APP_DATA_DIR"
16
+
17
+ # Object-backed mounts do not retain empty PostgreSQL directories.
18
+ if [ -s "$PGDATA/PG_VERSION" ]; then
19
+ mkdir -p \
20
+ "$PGDATA/pg_commit_ts" \
21
+ "$PGDATA/pg_dynshmem" \
22
+ "$PGDATA/pg_logical/mappings" \
23
+ "$PGDATA/pg_logical/snapshots" \
24
+ "$PGDATA/pg_multixact/members" \
25
+ "$PGDATA/pg_multixact/offsets" \
26
+ "$PGDATA/pg_notify" \
27
+ "$PGDATA/pg_replslot" \
28
+ "$PGDATA/pg_serial" \
29
+ "$PGDATA/pg_snapshots" \
30
+ "$PGDATA/pg_stat" \
31
+ "$PGDATA/pg_stat_tmp" \
32
+ "$PGDATA/pg_subtrans" \
33
+ "$PGDATA/pg_tblspc" \
34
+ "$PGDATA/pg_twophase" \
35
+ "$PGDATA/pg_wal/archive_status" \
36
+ "$PGDATA/pg_wal/summaries"
37
+ rm -f "$PGDATA/postmaster.pid"
38
+ fi
39
+ chown -R postgres:postgres "$PGDATA"
40
+ chmod 700 "$PGDATA"
41
+ chown -R redis:redis "$REDIS_DATA_DIR"
42
+ chown -R sub2api:sub2api "$APP_DATA_DIR"
43
+
44
+ if [ ! -s "$PGDATA/PG_VERSION" ]; then
45
+ PASSWORD_FILE=$(mktemp)
46
+ chmod 600 "$PASSWORD_FILE"
47
+ printf '%s\n' "$DATABASE_PASSWORD" > "$PASSWORD_FILE"
48
+ chown postgres:postgres "$PASSWORD_FILE"
49
+ su-exec postgres initdb -D "$PGDATA" -U "$DATABASE_USER" --pwfile="$PASSWORD_FILE" --auth-local=trust --auth-host=scram-sha-256
50
+ rm -f "$PASSWORD_FILE"
51
+ fi
52
+
53
+ su-exec postgres pg_ctl -D "$PGDATA" -o "-c listen_addresses=127.0.0.1 -c port=5432 -c unix_socket_directories=/tmp" -w start
54
+
55
+ if ! su-exec postgres psql -h /tmp -U "$DATABASE_USER" -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname = 'sub2api'" | grep -q 1; then
56
+ su-exec postgres createdb -h /tmp -U "$DATABASE_USER" -O "$DATABASE_USER" "$DATABASE_DBNAME"
57
+ fi
58
+
59
+ su-exec redis redis-server \
60
+ --bind 127.0.0.1 \
61
+ --port 6379 \
62
+ --dir "$REDIS_DATA_DIR" \
63
+ --save 60 1 \
64
+ --appendonly yes \
65
+ --appendfsync everysec &
66
+ REDIS_PID=$!
67
+
68
+ cleanup() {
69
+ trap - EXIT INT TERM
70
+ if [ -n "$APP_PID" ] && kill -0 "$APP_PID" 2>/dev/null; then
71
+ kill -TERM "$APP_PID" 2>/dev/null || true
72
+ wait "$APP_PID" 2>/dev/null || true
73
+ fi
74
+ if [ -n "$REDIS_PID" ] && kill -0 "$REDIS_PID" 2>/dev/null; then
75
+ kill -TERM "$REDIS_PID" 2>/dev/null || true
76
+ wait "$REDIS_PID" 2>/dev/null || true
77
+ fi
78
+ su-exec postgres pg_ctl -D "$PGDATA" -m fast -w stop >/dev/null 2>&1 || true
79
+ }
80
+ trap cleanup EXIT INT TERM
81
+
82
+ attempt=0
83
+ until redis-cli -h 127.0.0.1 -p 6379 ping 2>/dev/null | grep -q PONG; do
84
+ if ! kill -0 "$REDIS_PID" 2>/dev/null; then
85
+ echo "Redis failed to start" >&2
86
+ exit 1
87
+ fi
88
+ attempt=$((attempt + 1))
89
+ if [ "$attempt" -ge 30 ]; then
90
+ echo "Redis readiness check timed out" >&2
91
+ exit 1
92
+ fi
93
+ sleep 1
94
+ done
95
+
96
+ su-exec sub2api /app/sub2api &
97
+ APP_PID=$!
98
+ wait "$APP_PID"
99
+ #!/bin/sh
100
+ set -eu
101
+
102
+ PGDATA=/data/postgresql
103
+ REDIS_DATA_DIR=/data/redis
104
+ APP_DATA_DIR=/data/sub2api
105
+ APP_PID=""
106
+ REDIS_PID=""
107
+
108
+ if [ -z "$DATABASE_PASSWORD" ]; then
109
+ echo "DATABASE_PASSWORD is required" >&2
110
+ exit 1
111
+ fi
112
+
113
  mkdir -p "$PGDATA" "$REDIS_DATA_DIR" "$APP_DATA_DIR"
114
  chown -R postgres:postgres "$PGDATA"
115
  chmod 700 "$PGDATA"