# mineru-service — MinerU 2.5 VLM 기반 PDF→markdown 추출기. marker-service 대체.
# 단일카드(RTX 4070 Ti S 16GB→PRO 4000 24GB) markdown VRAM ~10GB(marker)→~5GB(MinerU VLM).
#
# 공식 opendatalab/MinerU global Dockerfile 기반:
#   FROM vllm/vllm-openai:v0.21.0 (CUDA 13.0). GPU 호스트 드라이버 595.71.05 / CUDA 13.2 가
#   13.0 런타임 지원 → cu129 폴백 불필요. vLLM 은 base 이미지가 제공하므로 mineru 는 [core] 만.
#
# 모델은 이미지에 굽지 않고 런타임 warmup 시 HF cache 볼륨으로 lazy 다운로드 (marker/ocr 선례 =
#   서버 .cache 볼륨). 이미지 슬림 유지 + server.py 반복 빌드 빠름 + 모델 볼륨 영속.
FROM vllm/vllm-openai:v0.21.0

# base 이미지의 ENTRYPOINT(vLLM OpenAI 서버)를 제거 — 우리는 uvicorn 으로 자체 FastAPI 기동.
ENTRYPOINT []

# opencv(libgl) + CJK 폰트(레이아웃/렌더 안전) + curl(healthcheck). 공식 Dockerfile 동일.
RUN apt-get update && apt-get install -y --no-install-recommends \
        fonts-noto-core fonts-noto-cjk fontconfig libgl1 curl \
    && fc-cache -fv \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# mineru[core] — 공식 설치 라인. vLLM(vlm-engine 백엔드)은 base 가 이미 제공.
RUN python3 -m pip install -U 'mineru[core]>=3.2.1' --break-system-packages \
    && python3 -m pip cache purge

# 서비스 wrapper 의존성. base(vllm-openai)+mineru 가 fastapi/uvicorn/pillow 를 이미 제공 →
# pymupdf 만 추가(나머지 명시 핀은 base 의 pillow 12.x 를 불필요하게 다운그레이드해서 제거).
RUN python3 -m pip install --no-cache-dir --break-system-packages \
        'pymupdf>=1.24.0,<2.0.0'

# MINERU_MODEL_SOURCE=huggingface = warmup 시 lazy 다운로드 (HF cache 볼륨에 영속).
# PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True = 단편화 완화(연구 권고, 거대 입력 OOM 완충).
ENV MINERU_MODEL_SOURCE=huggingface \
    HF_HOME=/root/.cache/huggingface \
    PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True

WORKDIR /app
# server.py = 무거운 pip 레이어 뒤에 COPY → 반복 빌드 시 캐시 적중(빠른 재빌드).
COPY server.py /app/server.py

EXPOSE 3301
# VLM 모델 lazy 다운로드(~2.4GB)+엔진 로드 여유로 start-period 길게.
HEALTHCHECK --start-period=900s --interval=30s --timeout=10s --retries=3 \
    CMD curl -f http://localhost:3301/ready || exit 1

CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "3301"]
