| #!/bin/bash |
| set -e |
|
|
| echo "π Starting DocGenie API + Worker..." |
| echo "============================================================" |
| echo "π§ Configuration:" |
| echo " PORT: ${PORT:-7860}" |
| echo " REDIS_URL: ${REDIS_URL:0:30}..." |
| echo " ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:0:20}..." |
| echo "============================================================" |
|
|
| |
| prefix_logs() { |
| local prefix=$1 |
| while IFS= read -r line; do |
| echo "[$prefix] $line" |
| done |
| } |
|
|
| |
| echo "π Starting FastAPI server..." |
| uvicorn api.main:app --host 0.0.0.0 --port ${PORT:-7860} 2>&1 | prefix_logs "API" & |
| API_PID=$! |
| echo " PID: $API_PID" |
|
|
| |
| sleep 2 |
|
|
| |
| |
| WORKER_ID="docgenie-worker-$(date +%s)-${RANDOM}" |
| echo "π· Starting RQ Worker..." |
| rq worker ${RQ_QUEUE_NAME:-docgenie} --url $REDIS_URL --name "$WORKER_ID" --verbose 2>&1 | prefix_logs "WORKER" & |
| WORKER_PID=$! |
| echo " PID: $WORKER_PID" |
|
|
| echo "============================================================" |
| echo "β Both processes started successfully" |
| echo " API: http://0.0.0.0:${PORT:-7860}" |
| echo " Worker: Connected to Redis" |
| echo "============================================================" |
|
|
| |
| shutdown() { |
| echo "" |
| echo "π Shutting down gracefully..." |
| kill -TERM $API_PID 2>/dev/null || true |
| kill -TERM $WORKER_PID 2>/dev/null || true |
| wait $API_PID 2>/dev/null || true |
| wait $WORKER_PID 2>/dev/null || true |
| echo "β Shutdown complete" |
| exit 0 |
| } |
|
|
| |
| trap shutdown SIGTERM SIGINT |
|
|
| |
| while kill -0 $API_PID 2>/dev/null && kill -0 $WORKER_PID 2>/dev/null; do |
| sleep 1 |
| done |
|
|
| |
| echo "" |
| echo "β One of the processes exited unexpectedly" |
| if ! kill -0 $API_PID 2>/dev/null; then |
| echo " API process died (PID: $API_PID)" |
| fi |
| if ! kill -0 $WORKER_PID 2>/dev/null; then |
| echo " Worker process died (PID: $WORKER_PID)" |
| fi |
|
|
| shutdown |
|
|