| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- 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)
|