inpaintServer/main.py

121 lines
3.3 KiB
Python

#!/usr/bin/env python3
"""
인페인팅 서버 메인 애플리케이션
iopaint와 호환되는 API를 제공합니다.
"""
import time
import logging
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
from app.core.config import settings
from app.core.worker_manager import worker_manager
from app.core.session_pool import session_pool
from app.api.endpoints import router
from app.monitoring.dashboard import monitor_app
# 로깅 설정
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
# 서버 시작 시간 기록
settings.start_time = time.time()
@asynccontextmanager
async def lifespan(app: FastAPI):
"""애플리케이션 생명주기 관리"""
# 시작 시
logger.info("🚀 인페인팅 서버 시작 중...")
try:
# 세션 풀 초기화
await session_pool.initialize()
logger.info("✅ 세션 풀 초기화 완료")
# 워커 매니저 시작
await worker_manager.start()
logger.info("✅ 워커 매니저 시작 완료")
logger.info("🎉 인페인팅 서버 시작 완료!")
except Exception as e:
logger.error(f"❌ 서버 시작 실패: {e}")
raise
yield
# 종료 시
logger.info("🛑 인페인팅 서버 종료 중...")
try:
# 워커 매니저 중지
await worker_manager.stop()
logger.info("✅ 워커 매니저 중지 완료")
logger.info("👋 인페인팅 서버 종료 완료")
except Exception as e:
logger.error(f"❌ 서버 종료 중 오류: {e}")
# 메인 애플리케이션 생성
app = FastAPI(
title="인페인팅 서버",
description="Simple LAMA, MIGAN, REMBG를 활용한 병렬 처리 인페인팅 서버 (iopaint 호환)",
version="1.0.0",
lifespan=lifespan
)
# CORS 미들웨어 추가
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# API 라우터 포함
app.include_router(router)
# 모니터링 대시보드 마운트
app.mount("/monitoring", monitor_app, name="monitoring")
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="인페인팅 서버")
parser.add_argument("--dev", action="store_true", help="개발 모드로 실행")
parser.add_argument("--host", default=settings.HOST, help="호스트 주소")
parser.add_argument("--port", type=int, default=settings.PORT, help="포트 번호")
parser.add_argument("--workers", type=int, default=settings.WORKERS, help="워커 수")
args = parser.parse_args()
if args.dev:
logger.info("🔧 개발 모드로 실행합니다")
uvicorn.run(
"main:app",
host=args.host,
port=args.port,
reload=True,
log_level="info"
)
else:
logger.info("🚀 프로덕션 모드로 실행합니다")
uvicorn.run(
"main:app",
host=args.host,
port=args.port,
workers=args.workers,
log_level="info"
)