IntegraChat / docker-entrypoint.sh
nothingworry's picture
Add Docker support and remove Ollama
0452a50
raw
history blame
2.82 kB
#!/bin/bash
set -euo pipefail
log() {
echo "[IntegraChat][$(date -Iseconds)] $*"
}
API_PORT="${API_PORT:-8000}"
MCP_PORT="${MCP_PORT:-8900}"
GRADIO_PORT="${GRADIO_PORT:-7860}"
export API_PORT MCP_PORT GRADIO_PORT
LOG_DIR="/app/logs"
mkdir -p "${LOG_DIR}"
log "Container starting. Python: $(python --version 2>&1)"
log "API_PORT=${API_PORT}, MCP_PORT=${MCP_PORT}, GRADIO_PORT=${GRADIO_PORT}"
cleanup() {
log "Received termination signal. Stopping services..."
# Kill child processes (only if they exist)
[ -n "${MCP_PID:-}" ] && kill "${MCP_PID}" 2>/dev/null || true
[ -n "${API_PID:-}" ] && kill "${API_PID}" 2>/dev/null || true
[ -n "${GRADIO_PID:-}" ] && kill "${GRADIO_PID}" 2>/dev/null || true
[ -n "${TAIL_PID:-}" ] && kill "${TAIL_PID}" 2>/dev/null || true
wait || true
log "All services stopped. Exiting."
}
trap cleanup SIGTERM SIGINT
# Start MCP server
log "Starting MCP server..."
python -m backend.mcp_server.server > "${LOG_DIR}/mcp.log" 2>&1 &
MCP_PID=$!
# Give MCP a moment
sleep 2
# Start FastAPI backend
log "Starting FastAPI backend..."
uvicorn backend.api.main:app --host 0.0.0.0 --port "${API_PORT}" > "${LOG_DIR}/fastapi.log" 2>&1 &
API_PID=$!
# Check if FastAPI process started
sleep 2
if ! kill -0 "${API_PID}" 2>/dev/null; then
log "ERROR: FastAPI process died immediately. Last 20 lines of log:"
tail -n 20 "${LOG_DIR}/fastapi.log" || true
exit 1
fi
# Wait for FastAPI to become healthy
log "Waiting for FastAPI health endpoint..."
for attempt in {1..60}; do
if curl -fsS "http://127.0.0.1:${API_PORT}/health" >/dev/null 2>&1; then
log "FastAPI backend is healthy."
break
fi
# Check if process is still running
if ! kill -0 "${API_PID}" 2>/dev/null; then
log "ERROR: FastAPI process died. Last 20 lines of log:"
tail -n 20 "${LOG_DIR}/fastapi.log" || true
exit 1
fi
sleep 1
if [ $((attempt % 10)) -eq 0 ]; then
log "FastAPI not ready yet (attempt ${attempt}/60). Last 5 lines of log:"
tail -n 5 "${LOG_DIR}/fastapi.log" || true
else
log "FastAPI not ready yet (attempt ${attempt}/60)..."
fi
done
# Final check
if ! curl -fsS "http://127.0.0.1:${API_PORT}/health" >/dev/null 2>&1; then
log "WARNING: FastAPI health check failed after 60 attempts. Last 30 lines of log:"
tail -n 30 "${LOG_DIR}/fastapi.log" || true
log "Continuing anyway..."
fi
# Start Gradio UI (foreground)
log "Starting Gradio UI on port ${GRADIO_PORT}..."
# Set DOCKER_CONTAINER flag so app.py knows not to auto-start services
export DOCKER_CONTAINER=1
python app.py > "${LOG_DIR}/gradio.log" 2>&1 &
GRADIO_PID=$!
log "All services launched. Streaming logs (Ctrl+C to stop)..."
tail -n 50 -F "${LOG_DIR}/"*.log &
TAIL_PID=$!
wait "${GRADIO_PID}"
cleanup