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

Keep PostgreSQL directories alive on HF

Browse files
Files changed (1) hide show
  1. start.sh +60 -95
start.sh CHANGED
@@ -7,35 +7,56 @@ APP_DATA_DIR=/data/sub2api
7
  APP_PID=""
8
  REDIS_PID=""
9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  if [ -z "$DATABASE_PASSWORD" ]; then
11
  echo "DATABASE_PASSWORD is required" >&2
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"
@@ -50,7 +71,9 @@ if [ ! -s "$PGDATA/PG_VERSION" ]; then
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"
@@ -95,79 +118,21 @@ 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"
116
- chown -R redis:redis "$REDIS_DATA_DIR"
117
- chown -R sub2api:sub2api "$APP_DATA_DIR"
118
-
119
- if [ ! -s "$PGDATA/PG_VERSION" ]; then
120
- PASSWORD_FILE=$(mktemp)
121
- chmod 600 "$PASSWORD_FILE"
122
- printf '%s\n' "$DATABASE_PASSWORD" > "$PASSWORD_FILE"
123
- chown postgres:postgres "$PASSWORD_FILE"
124
- su-exec postgres initdb -D "$PGDATA" -U "$DATABASE_USER" --pwfile="$PASSWORD_FILE" --auth-local=trust --auth-host=scram-sha-256
125
- rm -f "$PASSWORD_FILE"
126
- fi
127
-
128
- 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
129
-
130
- 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
131
- su-exec postgres createdb -h /tmp -U "$DATABASE_USER" -O "$DATABASE_USER" "$DATABASE_DBNAME"
132
- fi
133
-
134
- su-exec redis redis-server \
135
- --bind 127.0.0.1 \
136
- --port 6379 \
137
- --dir "$REDIS_DATA_DIR" \
138
- --save 60 1 \
139
- --appendonly yes \
140
- --appendfsync everysec &
141
- REDIS_PID=$!
142
-
143
- cleanup() {
144
- trap - EXIT INT TERM
145
- if [ -n "$APP_PID" ] && kill -0 "$APP_PID" 2>/dev/null; then
146
- kill -TERM "$APP_PID" 2>/dev/null || true
147
- wait "$APP_PID" 2>/dev/null || true
148
- fi
149
- if [ -n "$REDIS_PID" ] && kill -0 "$REDIS_PID" 2>/dev/null; then
150
- kill -TERM "$REDIS_PID" 2>/dev/null || true
151
- wait "$REDIS_PID" 2>/dev/null || true
152
- fi
153
- su-exec postgres pg_ctl -D "$PGDATA" -m fast -w stop >/dev/null 2>&1 || true
154
- }
155
- trap cleanup EXIT INT TERM
156
 
157
- attempt=0
158
- until redis-cli -h 127.0.0.1 -p 6379 ping 2>/dev/null | grep -q PONG; do
159
- if ! kill -0 "$REDIS_PID" 2>/dev/null; then
160
- echo "Redis failed to start" >&2
161
- exit 1
 
 
 
 
 
 
 
162
  fi
163
- attempt=$((attempt + 1))
164
- if [ "$attempt" -ge 30 ]; then
165
- echo "Redis readiness check timed out" >&2
166
- exit 1
167
- fi
168
- sleep 1
169
  done
170
 
171
- su-exec sub2api /app/sub2api &
172
- APP_PID=$!
173
  wait "$APP_PID"
 
7
  APP_PID=""
8
  REDIS_PID=""
9
 
10
+ PG_KEEP_DIRS="
11
+ pg_commit_ts
12
+ pg_dynshmem
13
+ pg_logical
14
+ pg_logical/mappings
15
+ pg_logical/snapshots
16
+ pg_multixact
17
+ pg_multixact/members
18
+ pg_multixact/offsets
19
+ pg_notify
20
+ pg_replslot
21
+ pg_serial
22
+ pg_snapshots
23
+ pg_stat
24
+ pg_stat_tmp
25
+ pg_subtrans
26
+ pg_tblspc
27
+ pg_twophase
28
+ pg_wal
29
+ pg_wal/archive_status
30
+ pg_wal/summaries
31
+ "
32
+
33
+ ensure_pg_dirs() {
34
+ for rel in $PG_KEEP_DIRS; do
35
+ dir="$PGDATA/$rel"
36
+ marker="$dir/.hf-keep"
37
+ if [ ! -d "$dir" ]; then
38
+ mkdir -p "$dir"
39
+ chown postgres:postgres "$dir"
40
+ chmod 700 "$dir"
41
+ echo "Restored PostgreSQL directory: $rel"
42
+ fi
43
+ if [ ! -f "$marker" ]; then
44
+ printf '%s\n' "HF Spaces persistent directory marker" > "$marker"
45
+ chown postgres:postgres "$marker"
46
+ fi
47
+ done
48
+ }
49
+
50
+ start_postgres() {
51
+ 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
52
+ }
53
+
54
  if [ -z "$DATABASE_PASSWORD" ]; then
55
  echo "DATABASE_PASSWORD is required" >&2
56
  exit 1
57
  fi
58
 
59
  mkdir -p "$PGDATA" "$REDIS_DATA_DIR" "$APP_DATA_DIR"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  chown -R postgres:postgres "$PGDATA"
61
  chmod 700 "$PGDATA"
62
  chown -R redis:redis "$REDIS_DATA_DIR"
 
71
  rm -f "$PASSWORD_FILE"
72
  fi
73
 
74
+ rm -f "$PGDATA/postmaster.pid"
75
+ ensure_pg_dirs
76
+ start_postgres
77
 
78
  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
79
  su-exec postgres createdb -h /tmp -U "$DATABASE_USER" -O "$DATABASE_USER" "$DATABASE_DBNAME"
 
118
 
119
  su-exec sub2api /app/sub2api &
120
  APP_PID=$!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
 
122
+ while kill -0 "$APP_PID" 2>/dev/null; do
123
+ ensure_pg_dirs
124
+ if ! su-exec postgres pg_ctl -D "$PGDATA" status >/dev/null 2>&1; then
125
+ echo "PostgreSQL stopped unexpectedly; attempting recovery" >&2
126
+ rm -f "$PGDATA/postmaster.pid"
127
+ if ! start_postgres; then
128
+ echo "PostgreSQL recovery failed; stopping Sub2API" >&2
129
+ kill -TERM "$APP_PID" 2>/dev/null || true
130
+ wait "$APP_PID" 2>/dev/null || true
131
+ exit 1
132
+ fi
133
+ echo "PostgreSQL recovered"
134
  fi
135
+ sleep 5
 
 
 
 
 
136
  done
137
 
 
 
138
  wait "$APP_PID"