Skip to content

Commit 2aac5a4

Browse files
committed
Enhance Docker configurations and supervisor scripts for database readiness
- Updated Dockerfiles for MongoDB, PostgreSQL, and SQLite to install necessary packages and include a new wait-for-db.sh script for database readiness checks. - Modified supervisord configuration files to add a db-ready program that ensures services wait for the database to be ready before starting. - Improved executable permissions to include the new wait-for-db.sh script across all relevant Dockerfiles.
1 parent a79e908 commit 2aac5a4

7 files changed

+154
-13
lines changed

Dockerfile.bundle.mongo

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@ RUN curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --de
6464
&& apt-get install -y caddy \
6565
&& rm -rf /var/lib/apt/lists/*
6666

67-
# Install MongoDB 7 - using Ubuntu jammy repository as Debian bookworm packages may not be available
67+
# Install MongoDB 7 and mongosh - using Ubuntu jammy repository as Debian bookworm packages may not be available
6868
RUN curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg \
6969
&& echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-7.0.list \
7070
&& apt-get update \
71-
&& apt-get install -y mongodb-org \
71+
&& apt-get install -y mongodb-org mongodb-mongosh \
7272
&& rm -rf /var/lib/apt/lists/*
7373

7474
# Create necessary directories
@@ -94,9 +94,10 @@ COPY --from=web-builder /app/apps/web/dist /app/web
9494
COPY Caddyfile /etc/caddy/Caddyfile
9595
COPY supervisord.bundle.mongo.conf /etc/supervisor/conf.d/supervisord.conf
9696
COPY startup.bundle.mongo.sh /app/startup.sh
97+
COPY wait-for-db.sh /app/wait-for-db.sh
9798

9899
# Set proper permissions for executables
99-
RUN chmod +x /app/server/run-migrations.sh /app/startup.sh /app/server/api /app/server/producer /app/server/worker /app/server/ingester
100+
RUN chmod +x /app/server/run-migrations.sh /app/startup.sh /app/server/api /app/server/producer /app/server/worker /app/server/ingester /app/wait-for-db.sh
100101

101102
# Expose port
102103
EXPOSE 8383

Dockerfile.bundle.postgres

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,10 @@ COPY --from=web-builder /app/apps/web/dist /app/web
101101
COPY Caddyfile /etc/caddy/Caddyfile
102102
COPY supervisord.bundle.postgres.conf /etc/supervisor/conf.d/supervisord.conf
103103
COPY startup.bundle.postgres.sh /app/startup.sh
104+
COPY wait-for-db.sh /app/wait-for-db.sh
104105

105106
# Set proper permissions for executables
106-
RUN chmod +x /app/server/run-migrations.sh /app/startup.sh /app/server/api /app/server/producer /app/server/worker /app/server/ingester /app/server/bun
107+
RUN chmod +x /app/server/run-migrations.sh /app/startup.sh /app/server/api /app/server/producer /app/server/worker /app/server/ingester /app/server/bun /app/wait-for-db.sh
107108

108109
# Expose port
109110
EXPOSE 8383

Dockerfile.bundle.sqlite

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ RUN curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --de
6363
&& apt-get install -y caddy \
6464
&& rm -rf /var/lib/apt/lists/*
6565

66+
# Install SQLite for database health checks
67+
RUN apt-get update \
68+
&& apt-get install -y sqlite3 \
69+
&& rm -rf /var/lib/apt/lists/*
70+
6671
# Create necessary directories
6772
RUN mkdir -p /app/server /app/data /var/log/supervisor /app/web
6873

@@ -83,9 +88,10 @@ COPY --from=web-builder /app/apps/web/dist /app/web
8388
COPY Caddyfile /etc/caddy/Caddyfile
8489
COPY supervisord.bundle.sqlite.conf /etc/supervisor/conf.d/supervisord.conf
8590
COPY startup.bundle.sqlite.sh /app/startup.sh
91+
COPY wait-for-db.sh /app/wait-for-db.sh
8692

8793
# Set proper permissions for executables
88-
RUN chmod +x /app/server/run-migrations.sh /app/startup.sh /app/server/api /app/server/producer /app/server/worker /app/server/ingester /app/server/bun
94+
RUN chmod +x /app/server/run-migrations.sh /app/startup.sh /app/server/api /app/server/producer /app/server/worker /app/server/ingester /app/server/bun /app/wait-for-db.sh
8995

9096
# Expose port
9197
EXPOSE 8383

supervisord.bundle.mongo.conf

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@ priority=150
3232
startsecs=5
3333
startretries=3
3434

35+
[program:db-ready]
36+
command=/app/wait-for-db.sh
37+
autostart=true
38+
autorestart=false
39+
user=root
40+
stdout_logfile=/dev/stdout
41+
stdout_logfile_maxbytes=0
42+
stderr_logfile=/dev/stderr
43+
stderr_logfile_maxbytes=0
44+
environment=DB_TYPE="mongodb",DB_HOST="localhost",DB_PORT="%(ENV_DB_PORT)s"
45+
depends_on=mongodb,redis
46+
priority=180
47+
startsecs=0
48+
exitcodes=0
49+
3550
[program:api]
3651
command=/app/server/api
3752
directory=/app/server
@@ -43,7 +58,7 @@ stdout_logfile_maxbytes=0
4358
stderr_logfile=/dev/stderr
4459
stderr_logfile_maxbytes=0
4560
environment=REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
46-
depends_on=mongodb
61+
depends_on=db-ready
4762
priority=200
4863
startsecs=10
4964
startretries=3
@@ -59,7 +74,7 @@ stdout_logfile_maxbytes=0
5974
stderr_logfile=/dev/stderr
6075
stderr_logfile_maxbytes=0
6176
environment=REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
62-
depends_on=mongodb
77+
depends_on=db-ready
6378
priority=210
6479
startsecs=10
6580
startretries=3
@@ -75,7 +90,7 @@ stdout_logfile_maxbytes=0
7590
stderr_logfile=/dev/stderr
7691
stderr_logfile_maxbytes=0
7792
environment=REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
78-
depends_on=mongodb
93+
depends_on=db-ready
7994
priority=220
8095
startsecs=10
8196
startretries=3
@@ -91,7 +106,7 @@ stdout_logfile_maxbytes=0
91106
stderr_logfile=/dev/stderr
92107
stderr_logfile_maxbytes=0
93108
environment=REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
94-
depends_on=mongodb
109+
depends_on=db-ready
95110
priority=230
96111
startsecs=10
97112
startretries=3

supervisord.bundle.postgres.conf

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@ priority=150
3232
startsecs=5
3333
startretries=3
3434

35+
[program:db-ready]
36+
command=/app/wait-for-db.sh
37+
autostart=true
38+
autorestart=false
39+
user=root
40+
stdout_logfile=/dev/stdout
41+
stdout_logfile_maxbytes=0
42+
stderr_logfile=/dev/stderr
43+
stderr_logfile_maxbytes=0
44+
environment=DB_HOST="localhost",DB_PORT="%(ENV_DB_PORT)s"
45+
depends_on=postgres,redis
46+
priority=180
47+
startsecs=0
48+
exitcodes=0
49+
3550
[program:api]
3651
command=/app/server/api
3752
directory=/app/server
@@ -43,7 +58,7 @@ stdout_logfile_maxbytes=0
4358
stderr_logfile=/dev/stderr
4459
stderr_logfile_maxbytes=0
4560
environment=REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
46-
depends_on=postgres
61+
depends_on=db-ready
4762
priority=200
4863
startsecs=10
4964
startretries=3
@@ -59,7 +74,7 @@ stdout_logfile_maxbytes=0
5974
stderr_logfile=/dev/stderr
6075
stderr_logfile_maxbytes=0
6176
environment=REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
62-
depends_on=postgres
77+
depends_on=db-ready
6378
priority=210
6479
startsecs=10
6580
startretries=3
@@ -75,7 +90,7 @@ stdout_logfile_maxbytes=0
7590
stderr_logfile=/dev/stderr
7691
stderr_logfile_maxbytes=0
7792
environment=REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
78-
depends_on=postgres
93+
depends_on=db-ready
7994
priority=220
8095
startsecs=10
8196
startretries=3
@@ -91,7 +106,7 @@ stdout_logfile_maxbytes=0
91106
stderr_logfile=/dev/stderr
92107
stderr_logfile_maxbytes=0
93108
environment=REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
94-
depends_on=postgres
109+
depends_on=db-ready
95110
priority=230
96111
startsecs=10
97112
startretries=3

supervisord.bundle.sqlite.conf

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,21 @@ priority=90
1919
startsecs=5
2020
startretries=3
2121

22+
[program:db-ready]
23+
command=/app/wait-for-db.sh
24+
autostart=true
25+
autorestart=false
26+
user=root
27+
stdout_logfile=/dev/stdout
28+
stdout_logfile_maxbytes=0
29+
stderr_logfile=/dev/stderr
30+
stderr_logfile_maxbytes=0
31+
environment=DB_TYPE="sqlite",DB_NAME="/app/data/peekaping.db"
32+
depends_on=redis
33+
priority=95
34+
startsecs=0
35+
exitcodes=0
36+
2237
[program:api]
2338
command=/app/server/api
2439
directory=/app/server
@@ -30,6 +45,7 @@ stdout_logfile_maxbytes=0
3045
stderr_logfile=/dev/stderr
3146
stderr_logfile_maxbytes=0
3247
environment=DB_TYPE="sqlite",DB_NAME="/app/data/peekaping.db",REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
48+
depends_on=db-ready
3349
priority=100
3450
startsecs=10
3551
startretries=3
@@ -45,6 +61,7 @@ stdout_logfile_maxbytes=0
4561
stderr_logfile=/dev/stderr
4662
stderr_logfile_maxbytes=0
4763
environment=DB_TYPE="sqlite",DB_NAME="/app/data/peekaping.db",REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
64+
depends_on=db-ready
4865
priority=110
4966
startsecs=10
5067
startretries=3
@@ -60,6 +77,7 @@ stdout_logfile_maxbytes=0
6077
stderr_logfile=/dev/stderr
6178
stderr_logfile_maxbytes=0
6279
environment=DB_TYPE="sqlite",DB_NAME="/app/data/peekaping.db",REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
80+
depends_on=db-ready
6381
priority=120
6482
startsecs=10
6583
startretries=3
@@ -75,6 +93,7 @@ stdout_logfile_maxbytes=0
7593
stderr_logfile=/dev/stderr
7694
stderr_logfile_maxbytes=0
7795
environment=DB_TYPE="sqlite",DB_NAME="/app/data/peekaping.db",REDIS_HOST="0.0.0.0",REDIS_PORT="6379",MODE="prod"
96+
depends_on=db-ready
7897
priority=130
7998
startsecs=10
8099
startretries=3

wait-for-db.sh

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#!/bin/sh
2+
# wait-for-db.sh - Wait for database to be ready before starting application services
3+
set -e
4+
5+
DB_TYPE="${DB_TYPE:-postgres}"
6+
MAX_RETRIES=60
7+
RETRY_DELAY=1
8+
9+
echo "Waiting for $DB_TYPE database to be ready..."
10+
11+
case "$DB_TYPE" in
12+
postgres|postgresql)
13+
DB_HOST="${DB_HOST:-localhost}"
14+
DB_PORT="${DB_PORT:-5432}"
15+
DB_NAME="${DB_NAME:-peekaping}"
16+
DB_USER="${DB_USER:-postgres}"
17+
18+
for i in $(seq 1 $MAX_RETRIES); do
19+
if PGPASSWORD="$DB_PASS" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c "SELECT 1" >/dev/null 2>&1; then
20+
echo "PostgreSQL is ready!"
21+
exit 0
22+
fi
23+
echo "Attempt $i/$MAX_RETRIES: PostgreSQL is not ready yet, waiting ${RETRY_DELAY}s..."
24+
sleep $RETRY_DELAY
25+
done
26+
echo "ERROR: PostgreSQL failed to become ready after $MAX_RETRIES attempts"
27+
exit 1
28+
;;
29+
30+
mysql)
31+
DB_HOST="${DB_HOST:-localhost}"
32+
DB_PORT="${DB_PORT:-3306}"
33+
DB_NAME="${DB_NAME:-peekaping}"
34+
DB_USER="${DB_USER:-root}"
35+
36+
for i in $(seq 1 $MAX_RETRIES); do
37+
if mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" -e "SELECT 1" "$DB_NAME" >/dev/null 2>&1; then
38+
echo "MySQL is ready!"
39+
exit 0
40+
fi
41+
echo "Attempt $i/$MAX_RETRIES: MySQL is not ready yet, waiting ${RETRY_DELAY}s..."
42+
sleep $RETRY_DELAY
43+
done
44+
echo "ERROR: MySQL failed to become ready after $MAX_RETRIES attempts"
45+
exit 1
46+
;;
47+
48+
sqlite)
49+
DB_NAME="${DB_NAME:-/app/data/peekaping.db}"
50+
51+
for i in $(seq 1 $MAX_RETRIES); do
52+
if [ -f "$DB_NAME" ] && sqlite3 "$DB_NAME" "SELECT 1" >/dev/null 2>&1; then
53+
echo "SQLite is ready!"
54+
exit 0
55+
fi
56+
echo "Attempt $i/$MAX_RETRIES: SQLite is not ready yet, waiting ${RETRY_DELAY}s..."
57+
sleep $RETRY_DELAY
58+
done
59+
echo "ERROR: SQLite failed to become ready after $MAX_RETRIES attempts"
60+
exit 1
61+
;;
62+
63+
mongo|mongodb)
64+
DB_HOST="${DB_HOST:-localhost}"
65+
DB_PORT="${DB_PORT:-27017}"
66+
67+
for i in $(seq 1 $MAX_RETRIES); do
68+
if mongosh --host "$DB_HOST" --port "$DB_PORT" --eval "db.adminCommand('ping')" >/dev/null 2>&1; then
69+
echo "MongoDB is ready!"
70+
exit 0
71+
fi
72+
echo "Attempt $i/$MAX_RETRIES: MongoDB is not ready yet, waiting ${RETRY_DELAY}s..."
73+
sleep $RETRY_DELAY
74+
done
75+
echo "ERROR: MongoDB failed to become ready after $MAX_RETRIES attempts"
76+
exit 1
77+
;;
78+
79+
*)
80+
echo "ERROR: Unsupported database type: $DB_TYPE"
81+
exit 1
82+
;;
83+
esac
84+

0 commit comments

Comments
 (0)