From e0e56090ee4bf5a9f5de2bf1a8e878362daca8eb Mon Sep 17 00:00:00 2001 From: gahusb Date: Tue, 19 May 2026 02:07:31 +0900 Subject: [PATCH] feat(services/insta-render): FastAPI entry + lifespan (SP-3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lifespan에서 Browser pool init + worker_loop spawn. shutdown 시 정상 cleanup. GET /health (LivenessProbe용). Plan-B-Insta Phase 2. Co-Authored-By: Claude Opus 4.7 (1M context) --- services/insta-render/main.py | 41 +++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 services/insta-render/main.py diff --git a/services/insta-render/main.py b/services/insta-render/main.py new file mode 100644 index 0000000..0d93b76 --- /dev/null +++ b/services/insta-render/main.py @@ -0,0 +1,41 @@ +"""insta-render FastAPI entry — health + lifespan (Browser pool + worker loop).""" +from __future__ import annotations + +import asyncio +import logging +from contextlib import asynccontextmanager + +from fastapi import FastAPI + +import card_renderer +import worker + +logging.basicConfig(level=logging.INFO, format="%(asctime)s %(name)s %(levelname)s %(message)s") +logger = logging.getLogger(__name__) + + +@asynccontextmanager +async def lifespan(app: FastAPI): + # Browser pool 초기화 (Chromium launch) + await card_renderer.init_browser() + # 큐 워커 백그라운드 시작 + worker_task = asyncio.create_task(worker.worker_loop()) + logger.info("insta-render lifespan 시작") + try: + yield + finally: + worker_task.cancel() + try: + await worker_task + except asyncio.CancelledError: + pass + await card_renderer.shutdown_browser() + logger.info("insta-render lifespan 종료") + + +app = FastAPI(lifespan=lifespan) + + +@app.get("/health") +def health(): + return {"ok": True, "service": "insta-render"}