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:
LUIS NOVO 2025-12-14 11:39:59 -03:00
parent 3001537aa7
commit d0d5d97578
5 changed files with 34 additions and 4 deletions

View file

@ -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

View file

@ -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
View 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)

View file

@ -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

View file

@ -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