agagsder commited on
Commit
0f33135
·
verified ·
1 Parent(s): c0c33e7

Add persistent startup script

Browse files

#!/bin/sh
set -eu

PGDATA=/data/postgresql
REDIS_DATA_DIR=/data/redis
APP_DATA_DIR=/data/sub2api
APP_PID=""
REDIS_PID=""

if [ -z "$DATABASE_PASSWORD" ]; then
echo "DATABASE_PASSWORD is required" >&2
exit 1
fi

mkdir -p "$PGDATA" "$REDIS_DATA_DIR" "$APP_DATA_DIR"
chown -R postgres:postgres "$PGDATA"
chmod 700 "$PGDATA"
chown -R redis:redis "$REDIS_DATA_DIR"
chown -R sub2api:sub2api "$APP_DATA_DIR"

if [ ! -s "$PGDATA/PG_VERSION" ]; then
PASSWORD_FILE=$(mktemp)
chmod 600 "$PASSWORD_FILE"
printf '%s\n' "$DATABASE_PASSWORD" > "$PASSWORD_FILE"
chown postgres:postgres "$PASSWORD_FILE"
su-exec postgres initdb -D "$PGDATA" -U "$DATABASE_USER" --pwfile="$PASSWORD_FILE" --auth-local=trust --auth-host=scram-sha-256
rm -f "$PASSWORD_FILE"
fi

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

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
su-exec postgres createdb -h /tmp -U "$DATABASE_USER" -O "$DATABASE_USER" "$DATABASE_DBNAME"
fi

su-exec redis redis-server \
--bind 127.0.0.1 \
--port 6379 \
--dir "$REDIS_DATA_DIR" \
--save 60 1 \
--appendonly yes \
--appendfsync everysec &
REDIS_PID=$!

cleanup() {
trap - EXIT INT TERM
if [ -n "$APP_PID" ] && kill -0 "$APP_PID" 2>/dev/null; then
kill -TERM "$APP_PID" 2>/dev/null || true
wait "$APP_PID" 2>/dev/null || true
fi
if [ -n "$REDIS_PID" ] && kill -0 "$REDIS_PID" 2>/dev/null; then
kill -TERM "$REDIS_PID" 2>/dev/null || true
wait "$REDIS_PID" 2>/dev/null || true
fi
su-exec postgres pg_ctl -D "$PGDATA" -m fast -w stop >/dev/null 2>&1 || true
}
trap cleanup EXIT INT TERM

attempt=0
until redis-cli -h 127.0.0.1 -p 6379 ping 2>/dev/null | grep -q PONG; do
if ! kill -0 "$REDIS_PID" 2>/dev/null; then
echo "Redis failed to start" >&2
exit 1
fi
attempt=$((attempt + 1))
if [ "$attempt" -ge 30 ]; then
echo "Redis readiness check timed out" >&2
exit 1
fi
sleep 1
done

su-exec sub2api /app/sub2api &
APP_PID=$!
wait "$APP_PID"

Files changed (1) hide show
  1. start.sh +75 -0
start.sh ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/sh
2
+ set -eu
3
+
4
+ PGDATA=/data/postgresql
5
+ REDIS_DATA_DIR=/data/redis
6
+ 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
+ chown -R postgres:postgres "$PGDATA"
17
+ chmod 700 "$PGDATA"
18
+ chown -R redis:redis "$REDIS_DATA_DIR"
19
+ chown -R sub2api:sub2api "$APP_DATA_DIR"
20
+
21
+ if [ ! -s "$PGDATA/PG_VERSION" ]; then
22
+ PASSWORD_FILE=$(mktemp)
23
+ chmod 600 "$PASSWORD_FILE"
24
+ printf '%s\n' "$DATABASE_PASSWORD" > "$PASSWORD_FILE"
25
+ chown postgres:postgres "$PASSWORD_FILE"
26
+ su-exec postgres initdb -D "$PGDATA" -U "$DATABASE_USER" --pwfile="$PASSWORD_FILE" --auth-local=trust --auth-host=scram-sha-256
27
+ rm -f "$PASSWORD_FILE"
28
+ fi
29
+
30
+ 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
31
+
32
+ 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
33
+ su-exec postgres createdb -h /tmp -U "$DATABASE_USER" -O "$DATABASE_USER" "$DATABASE_DBNAME"
34
+ fi
35
+
36
+ su-exec redis redis-server \
37
+ --bind 127.0.0.1 \
38
+ --port 6379 \
39
+ --dir "$REDIS_DATA_DIR" \
40
+ --save 60 1 \
41
+ --appendonly yes \
42
+ --appendfsync everysec &
43
+ REDIS_PID=$!
44
+
45
+ cleanup() {
46
+ trap - EXIT INT TERM
47
+ if [ -n "$APP_PID" ] && kill -0 "$APP_PID" 2>/dev/null; then
48
+ kill -TERM "$APP_PID" 2>/dev/null || true
49
+ wait "$APP_PID" 2>/dev/null || true
50
+ fi
51
+ if [ -n "$REDIS_PID" ] && kill -0 "$REDIS_PID" 2>/dev/null; then
52
+ kill -TERM "$REDIS_PID" 2>/dev/null || true
53
+ wait "$REDIS_PID" 2>/dev/null || true
54
+ fi
55
+ su-exec postgres pg_ctl -D "$PGDATA" -m fast -w stop >/dev/null 2>&1 || true
56
+ }
57
+ trap cleanup EXIT INT TERM
58
+
59
+ attempt=0
60
+ until redis-cli -h 127.0.0.1 -p 6379 ping 2>/dev/null | grep -q PONG; do
61
+ if ! kill -0 "$REDIS_PID" 2>/dev/null; then
62
+ echo "Redis failed to start" >&2
63
+ exit 1
64
+ fi
65
+ attempt=$((attempt + 1))
66
+ if [ "$attempt" -ge 30 ]; then
67
+ echo "Redis readiness check timed out" >&2
68
+ exit 1
69
+ fi
70
+ sleep 1
71
+ done
72
+
73
+ su-exec sub2api /app/sub2api &
74
+ APP_PID=$!
75
+ wait "$APP_PID"