# app.py # 主程式檔案 - 整合所有模組並啟動應用 # 此檔案負責初始化系統、載入模組和啟動服務 import os from fastapi.middleware.cors import CORSMiddleware # 載入配置和工具 from config import SERVER_CONFIG from utils import setup_chinese_font, suppress_warnings from models import load_models_and_data from api import api_app from ui import create_demo, custom_css # 初始化系統 setup_chinese_font() suppress_warnings() load_models_and_data() # 設定 CORS api_app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], allow_credentials=False, # 避免與 allow_origins=["*"] 衝突 ) if __name__ == "__main__": # 取得環境變數,HF 預設 PORT 通常是 7860,HOST 務必用 0.0.0.0 host = SERVER_CONFIG["host"] port = SERVER_CONFIG["port"] try: import uvicorn import gradio as gr # 創建 Gradio 應用 demo = create_demo() # 將 Gradio 掛載到 FastAPI (api_app) # 這樣兩者會「合體」在同一個 Port 執行 app = gr.mount_gradio_app(api_app, demo, path="/") print(f"🚀 數位保鏢系統啟動中:http://{host}:{port}") # 唯一啟動點:交給 uvicorn 負責 # 不要再 except 裡面放 demo.launch(),避免自動跳埠到 7861 uvicorn.run( api_app, # 執行掛載後的 FastAPI 主程式 host=host, port=port, proxy_headers=True, # 必須!讓 Gradio 知道它在 HF 的代理之後 forwarded_allow_ips="*", # 必須!允許 HF 轉發 IP 資訊 timeout_keep_alive=30, # 增加保持連線時間 log_level="info" ) except Exception as e: print(f"❌ 伺服器啟動嚴重錯誤: {e}")