121 lines
3.3 KiB
Python
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"
|
|
)
|