# ===================================================================== # 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"]