#!/bin/sh set -e # Include app binaries in our path export PATH="/app/.venv/bin:$PATH" # Shared config : "${ROOM_CAL_DATA_HOME:=/config}" export ROOM_CAL_DATA_HOME if [ -z "$TZ" ] && [ -f "$ROOM_CAL_DATA_HOME/config.json" ]; then TZ=$(python3 -c "import json,sys; print(json.load(open('$ROOM_CAL_DATA_HOME/config.json')).get('timezone',''))" 2>/dev/null || true) fi : "${TZ:=UTC}" export TZ if [ -z "$ROOM_CAL_API_URL" ] && [ -f "$ROOM_CAL_DATA_HOME/config.json" ]; then ROOM_CAL_API_URL=$(python3 -c "import json,sys; print(json.load(open('$ROOM_CAL_DATA_HOME/config.json')).get('api_url',''))" 2>/dev/null || true) fi export ROOM_CAL_API_URL SERVICE="${1:-api}" # MCP if [ "$SERVICE" = "mcp" ]; then : "${FASTMCP_HOST:=0.0.0.0}" : "${FASTMCP_PORT:=8001}" : "${FASTMCP_LOG_LEVEL:=INFO}" : "${FASTMCP_ENABLE_RICH_LOGGING:=false}" : "${FASTMCP_ENABLE_RICH_TRACEBACKS:=false}" export FASTMCP_TRANSPORT=http export FASTMCP_HOST FASTMCP_PORT FASTMCP_LOG_LEVEL export FASTMCP_ENABLE_RICH_LOGGING FASTMCP_ENABLE_RICH_TRACEBACKS exec room-mcp fi # Shared API config : "${API_HOST:=0.0.0.0}" : "${API_PORT:=8000}" : "${LOG_LEVEL:=info}" # App builds its own loopback URL from API_PORT (internal credential upload) export API_PORT LOG_CONFIG=/etc/uvicorn_log.json [ -f "${ROOM_CAL_DATA_HOME}/uvicorn_log.json" ] && LOG_CONFIG="${ROOM_CAL_DATA_HOME}/uvicorn_log.json" # Calc-only API if [ "$SERVICE" = "calc" ]; then exec uvicorn "room_cal.api.calc_app:app" \ --host "$API_HOST" \ --port "$API_PORT" \ --log-config "$LOG_CONFIG" \ --log-level "$LOG_LEVEL" # Standard API else export DISPLAY=:99 Xvfb ${DISPLAY} -screen 0 1280x720x24 -ac & exec uvicorn "room_cal.api:create_app" --factory \ --host "$API_HOST" \ --port "$API_PORT" \ --log-config "$LOG_CONFIG" \ --log-level "$LOG_LEVEL" fi