import random from fastapi import FastAPI from contextlib import asynccontextmanager import uvicorn from pathlib import Path from datetime import datetime from typing import List, Dict, Optional from pydantic import BaseModel import yaml import asyncio import httpx from config.settings import settings from routers.subscriptions import router from routers.mihomo import mihomo_router,stop_all_mihomo,get_mihomo_running_status from utils.mihomo_service import download_mihomo from database.engine import create_db_and_tables from aiomultiprocess import Pool from utils.processes_mgr import process_manager @asynccontextmanager async def lifespan(app: FastAPI): """应用生命周期管理""" # 初始化目录结构 settings.PATH_CONFIG_DIR.mkdir(parents=True, exist_ok=True) settings.PATH_SUBSCRIPTION_DIR.mkdir(parents=True, exist_ok=True) create_db_and_tables() # 检查并下载mihomo await download_mihomo() await stop_all_mihomo() yield process_manager.stop_all_processes() app = FastAPI(lifespan=lifespan) # 注册路由 app.include_router(router, prefix="/subscriptions", tags=["订阅管理"]) app.include_router(mihomo_router, prefix="/mihomo", tags=["mihomo管理"]) # 添加健康检查路由 @app.get("/health") async def health_check(): """服务健康检查""" return {"status": "healthy"} @app.get("/") async def root(): return { "message": "代理池管理API", "endpoints": { "/docs": "API文档", "/configs": "配置管理", "/subscriptions": "订阅管理" } } @app.get("/get") async def get_random_proxy(): results = await get_mihomo_running_status() if not results: return {"message": "No running mihomo instances", 'code': 404} active_results = [] for result in results: if result.delay is not None and result.delay < 2000: active_results.append(result.mixed_port) return {"port": random.choice(active_results)} if __name__ == "__main__": uvicorn.run("main:app", host=settings.HOST, port=settings.PORT, reload=False)