main.py 1.77 KB
import os
from pathlib import Path

if not os.environ.get("PROJECT_ROOT"):
    os.environ['PROJECT_ROOT'] = Path(__file__).parent.absolute().as_posix()
from aabd.base.patched_logging import init_logging, get_logger

init_logging()
logger = get_logger(__name__)

from contextlib import asynccontextmanager
from typing import AsyncGenerator
from fastapi import FastAPI
from embedding_sever.api.http_config import config_fastapi
from embedding_sever.config import settings
from embedding_sever.db import connect as db_client_connect, disconnect as db_client_disconnect


@asynccontextmanager
async def lifespan(fastapi_app: FastAPI) -> AsyncGenerator[None, None]:
    """应用生命周期管理."""
    # 启动时建立数据库连接
    try:
        await db_client_connect()
        logger.info(f"✓ database connected")
    except Exception as e:
        logger.error(f"✗ Failed to connect to database: {e}")
        raise

    yield

    # 关闭时断开数据库连接
    try:
        await db_client_disconnect()
        logger.info(f"✓ database disconnected")
    except Exception as e:
        logger.error(f"✗ Error disconnecting from database: {e}")


# 创建应用实例
app = FastAPI(
    title=settings.app_name,
    version=settings.app_version,
    description="基于向量的CRUD服务,支持多种Embedding场景",
    lifespan=lifespan,
    docs_url="/docs",
    redoc_url="/redoc",
)
config_fastapi(app)

def main():
    """应用入口函数."""
    import uvicorn

    logger.info(f'docs_url: http://127.0.0.1:{settings.port}/docs')
    uvicorn.run(
        app,
        host='0.0.0.0',
        port=settings.port,
        reload=settings.debug,
        log_config=None
    )


if __name__ == "__main__":
    main()