#!/usr/bin/env bash # MarkItDown API - Production Startup Script # # Environment variable overrides: # LOG_DIR - directory for persistent log files (default: /app/logs) # HOST - bind address (default: 0.0.0.0) # PORT - listen port (default: 7860) # WORKERS - uvicorn worker count (default: 1) # LOG_LEVEL - uvicorn log level (default: info) set -euo pipefail # --------------------------------------------------------------------------- # Logging helpers # --------------------------------------------------------------------------- LOG_DIR="${LOG_DIR:-/app/logs}" mkdir -p "$LOG_DIR" LOG_FILE="$LOG_DIR/startup.log" _log() { local level="$1" shift local ts ts="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" local line="[$ts] [$level] $*" echo "$line" echo "$line" >> "$LOG_FILE" } log_info() { _log "INFO " "$@"; } log_ok() { _log "OK " "$@"; } log_warn() { _log "WARN " "$@"; } log_err() { _log "ERROR" "$@"; } log_step() { echo ""; _log "STEP " "---- $* ----"; } # --------------------------------------------------------------------------- # Print startup banner # --------------------------------------------------------------------------- python -c "from banner import print_banner; print_banner()" 2>/dev/null || true # --------------------------------------------------------------------------- # Step 1: Verify core Python dependencies # --------------------------------------------------------------------------- log_step "1/2 Verifying Python dependencies" if python -c "import markitdown, fastapi, httpx" 2>/dev/null; then log_ok "Core dependencies verified." else log_err "Missing core dependencies. Ensure requirements.txt has been installed." exit 1 fi # --------------------------------------------------------------------------- # Step 2: Smoke-test imports # --------------------------------------------------------------------------- log_step "2/2 Running import smoke test" python >> "$LOG_FILE" 2>&1 << PYEOF import sys try: import markitdown, fastapi, httpx, pandas print("[smoke-test] All core imports successful.") except ImportError as exc: print(f"[smoke-test] Import error: {exc}") sys.exit(1) PYEOF if [ $? -eq 0 ]; then log_ok "Import smoke test passed." else log_warn "Import smoke test failed. Check $LOG_FILE for details. Continuing startup." fi # --------------------------------------------------------------------------- # Start uvicorn # --------------------------------------------------------------------------- log_step "Starting uvicorn" HOST="${HOST:-0.0.0.0}" PORT="${PORT:-7860}" WORKERS="${WORKERS:-1}" LOG_LEVEL="${LOG_LEVEL:-info}" log_info "Binding to $HOST:$PORT | workers=$WORKERS | log_level=$LOG_LEVEL" exec python -m uvicorn api.server:app \ --host "$HOST" \ --port "$PORT" \ --workers "$WORKERS" \ --log-level "$LOG_LEVEL" \ --access-log