Spaces:
Running
Running
| # ===================================================================== | |
| # Stage 1: React (Vite) 빌드 | |
| # ===================================================================== | |
| FROM node:20-alpine AS web-build | |
| WORKDIR /web | |
| COPY web/package.json web/package-lock.json* ./ | |
| RUN npm install --no-audit --no-fund | |
| COPY web/ ./ | |
| RUN npm run build | |
| # ===================================================================== | |
| # Stage 2: Python 런타임 (FastAPI + 데이터 + Web 빌드 결과) | |
| # ===================================================================== | |
| FROM python:3.11-slim | |
| ENV PYTHONUNBUFFERED=1 \ | |
| PYTHONDONTWRITEBYTECODE=1 \ | |
| PIP_NO_CACHE_DIR=1 \ | |
| HF_HOME=/app/.cache/huggingface \ | |
| KOSIMCSE_DEVICE=cpu \ | |
| OMP_NUM_THREADS=2 \ | |
| TOKENIZERS_PARALLELISM=false | |
| # HF Spaces 기본 포트 | |
| ENV PORT=7860 | |
| WORKDIR /app | |
| # 시스템 패키지 (rdflib + sentence-transformers 빌드 의존) | |
| RUN apt-get update && apt-get install -y --no-install-recommends \ | |
| build-essential git curl \ | |
| && rm -rf /var/lib/apt/lists/* | |
| # Python 의존성 (캐시 효율화: requirements 먼저) | |
| COPY api/requirements.txt /app/api/requirements.txt | |
| RUN pip install --upgrade pip && pip install -r /app/api/requirements.txt | |
| # 코드 (rag_engine·semantic_search 등 active/code의 핵심 모듈) | |
| # 캐시 무효화용 ARG (commit SHA 다르면 캐시 무효화) | |
| ARG CACHE_BUST=v8 | |
| COPY code/ /app/code/ | |
| # 백엔드 | |
| COPY api/ /app/api/ | |
| # 데이터 | |
| COPY data/ /app/active/ontology/ | |
| # assets/(paper PDF·노드그래프)는 LFS라 HF Docker 빌드 컨텍스트에서 실제 내용으로 smudge되지 않아 | |
| # COPY 시 빌드 지연/누락을 유발 → COPY 제외. /api/download는 main.py가 런타임에 | |
| # huggingface_hub로 Space 레포에서 직접 fetch(HF_TOKEN)하므로 컨테이너에 파일이 없어도 동작. | |
| # React 빌드 결과 (Stage 1) | |
| COPY --from=web-build /web/dist /app/hf_app/web/dist | |
| # 디렉토리 구조 맞춤 (main.py가 active/ontology 등 상대경로 사용) | |
| RUN mkdir -p /app/active/code && cp -r /app/code/* /app/active/code/ | |
| # KoSimCSE 모델 사전 다운로드 (런타임 cold start 단축) | |
| RUN python -c "from transformers import AutoModel, AutoTokenizer; \ | |
| AutoTokenizer.from_pretrained('BM-K/KoSimCSE-roberta'); \ | |
| AutoModel.from_pretrained('BM-K/KoSimCSE-roberta')" || true | |
| # HF Space 사용자 권한 (필수 — 1000) | |
| RUN useradd -m -u 1000 user && chown -R user /app | |
| USER user | |
| EXPOSE 7860 | |
| # FastAPI 시작 — Dockerfile WORKDIR이 /app, main.py는 api/main.py | |
| WORKDIR /app/hf_app | |
| RUN ln -sf /app/api ./api | |
| WORKDIR /app | |
| CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "7860"] | |