fix: wait for API to be ready before starting frontend
Users reported "Unable to Connect to API Server" errors on startup because the frontend started before the API finished initialization (database migrations, etc.). - Add wait-for-api.sh script that polls /health endpoint - Update supervisord configs to use wait script instead of sleep 5 - Waits up to 5 minutes for API to be ready before starting frontend - Applies to both single-container and multi-container deployments Fixes #315
This commit is contained in:
parent
3001537aa7
commit
d0d5d97578
5 changed files with 34 additions and 4 deletions
|
|
@ -76,6 +76,10 @@ EXPOSE 8502 5055
|
|||
|
||||
RUN mkdir -p /app/data
|
||||
|
||||
# Copy and make executable the wait-for-api script
|
||||
COPY scripts/wait-for-api.sh /app/scripts/wait-for-api.sh
|
||||
RUN chmod +x /app/scripts/wait-for-api.sh
|
||||
|
||||
# Copy supervisord configuration
|
||||
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
||||
|
||||
|
|
|
|||
|
|
@ -77,6 +77,10 @@ COPY --from=builder /app/frontend/public /app/frontend/public
|
|||
# Create directories for data persistence
|
||||
RUN mkdir -p /app/data /mydata
|
||||
|
||||
# Copy and make executable the wait-for-api script
|
||||
COPY scripts/wait-for-api.sh /app/scripts/wait-for-api.sh
|
||||
RUN chmod +x /app/scripts/wait-for-api.sh
|
||||
|
||||
# Expose ports for Frontend and API
|
||||
EXPOSE 8502 5055
|
||||
|
||||
|
|
|
|||
22
scripts/wait-for-api.sh
Executable file
22
scripts/wait-for-api.sh
Executable file
|
|
@ -0,0 +1,22 @@
|
|||
#!/bin/bash
|
||||
# Wait for the API to be healthy before starting the frontend
|
||||
# This prevents the "Unable to Connect to API Server" error during startup
|
||||
|
||||
API_URL="${INTERNAL_API_URL:-http://localhost:5055}"
|
||||
MAX_RETRIES=60 # 60 retries * 5 seconds = 5 minutes max wait
|
||||
RETRY_INTERVAL=5
|
||||
|
||||
echo "Waiting for API to be ready at ${API_URL}/health..."
|
||||
|
||||
for i in $(seq 1 $MAX_RETRIES); do
|
||||
if curl -s -f "${API_URL}/health" > /dev/null 2>&1; then
|
||||
echo "API is ready! Starting frontend..."
|
||||
exit 0
|
||||
fi
|
||||
echo "Attempt $i/$MAX_RETRIES: API not ready yet, waiting ${RETRY_INTERVAL}s..."
|
||||
sleep $RETRY_INTERVAL
|
||||
done
|
||||
|
||||
echo "ERROR: API did not become ready within $((MAX_RETRIES * RETRY_INTERVAL)) seconds"
|
||||
echo "Starting frontend anyway - users may see connection errors initially"
|
||||
exit 0 # Exit 0 so frontend still starts (better than nothing)
|
||||
|
|
@ -26,7 +26,7 @@ autostart=true
|
|||
startsecs=3
|
||||
|
||||
[program:frontend]
|
||||
command=bash -c "sleep 5 && npm run start"
|
||||
command=bash -c "/app/scripts/wait-for-api.sh && npm run start"
|
||||
directory=/app/frontend
|
||||
environment=NODE_ENV="production",PORT="8502"
|
||||
passenv=API_URL,NEXT_PUBLIC_API_URL,INTERNAL_API_URL
|
||||
|
|
@ -37,4 +37,4 @@ stderr_logfile_maxbytes=0
|
|||
autorestart=true
|
||||
priority=30
|
||||
autostart=true
|
||||
startsecs=5
|
||||
startsecs=10
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ autostart=true
|
|||
startsecs=3
|
||||
|
||||
[program:frontend]
|
||||
command=bash -c "sleep 5 && npm run start"
|
||||
command=bash -c "/app/scripts/wait-for-api.sh && npm run start"
|
||||
directory=/app/frontend
|
||||
environment=NODE_ENV="production",PORT="8502"
|
||||
passenv=API_URL,NEXT_PUBLIC_API_URL,INTERNAL_API_URL
|
||||
|
|
@ -49,4 +49,4 @@ stderr_logfile_maxbytes=0
|
|||
autorestart=true
|
||||
priority=30
|
||||
autostart=true
|
||||
startsecs=5
|
||||
startsecs=10
|
||||
Loading…
Reference in a new issue