# -*- coding: utf-8 -*- """FastAPI 服务入口(uvicorn)。 运行(生产/开发一致): python web/main.py Flask 巨石已删除,本进程是唯一服务端:默认在根路径服务前端(API_PREFIX 留空); 把 API_PREFIX 设为非空(如 /api/v1)可把全部路由挂到子前缀下,供契约比对脚本使用。 数据目录 `data/` 是**相对当前工作目录**解析的(可由 SITE_DATA_DIR 覆盖), 所以务必从项目根启动——否则会在别处新建一份空库。 """ import os import sys import uvicorn # 直接以 `python web/main.py` 运行时,sys.path[0] 是 web/ 而非项目根—— # 补上项目根,保证 `import core` / `import music_api` / `import web.app` 可用。 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from web.app import create_app HOST = os.environ.get('HOST', '0.0.0.0') PORT = int(os.environ.get('PORT', '5000')) # Flask 巨石已删除:本应用即唯一服务端,直接服务前端使用的根路径。 # API_PREFIX 非空时挂在子前缀下(契约比对脚本使用)。 API_PREFIX = os.environ.get('API_PREFIX', '').strip() app = create_app(api_prefix=API_PREFIX) if __name__ == '__main__': uvicorn.run( app, host=HOST, port=PORT, log_level=os.environ.get('LOG_LEVEL', 'info').lower(), # 反向代理(Caddy 本机回环)下按 XFF 取真实 IP,与既有口径一致 proxy_headers=True, forwarded_allow_ips='127.0.0.1', server_header=False, # 不暴露服务器版本指纹 date_header=True, )