File size: 2,645 Bytes
2b50ae3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72ceb13
 
 
2b50ae3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d8cded5
f9df220
2b50ae3
 
 
 
 
f9df220
 
 
2b50ae3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# =====================================================================
# 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"]