# syntax=docker/dockerfile:1
# ============================================================
# OPC 智能园区后端（FastAPI + s2s 语音栈）Docker 镜像
#   构建：  docker build -f backend/Dockerfile -t dpm-backend .
#   运行：  docker compose up -d --build   （推荐，见根目录 docker-compose.yml）
# 说明：
#   · 依赖使用 uv 按 uv.lock 锁定安装（Python 3.12）
#   · vendor/s2s-cloud（补丁版语音栈）以 --no-deps 方式安装，避免拖入多余依赖
#   · silero VAD / nltk 数据 / YOLO 模型随镜像打包，运行期不联网下载
#   · media / knowledge / data.json 挂载为持久卷（数据与知识库可热更新）
# ============================================================
FROM python:3.12-slim-bookworm

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PIP_NO_CACHE_DIR=1 \
    UV_LINK_MODE=copy \
    UV_PROJECT_ENVIRONMENT=/opt/venv \
    PATH="/opt/venv/bin:$PATH"

# 系统依赖：libsndfile1（soundfile 音频解码）、libgomp1（torch）、
#            libgl1/libglib2.0-0（OpenCV/ultralytics 图像处理）
RUN apt-get update && apt-get install -y --no-install-recommends \
        libsndfile1 \
        libgomp1 \
        libgl1 \
        libglib2.0-0 \
        curl \
    && rm -rf /var/lib/apt/lists/*

# uv 包管理器（按 lock 锁定版本安装）
COPY --from=ghcr.io/astral-sh/uv:0.7.4 /uv /uvx /usr/local/bin/

WORKDIR /app
COPY backend /app/backend

WORKDIR /app/backend

# 1) 按 uv.lock 安装全部依赖（不含 dev；不安装项目本身，保持 /app/backend 为源码目录）
RUN uv sync --locked --no-dev --no-install-project

# 2) 安装补丁后的 s2s 语音栈（--no-deps：仅装包体，依赖已由 uv sync 覆盖）
RUN uv pip install --no-deps --no-build-isolation -e vendor/s2s-cloud

# 3) 运行期资源目录（本地缓存随镜像打包，避免运行期联网下载）
ENV TORCH_HOME=/app/backend/.torch-cache \
    NLTK_DATA=/app/backend/nltk_data \
    YOLO_CONFIG_DIR=/app/backend/.ultralytics \
    NO_PROXY=* \
    no_proxy=*

# 持久卷：媒体资源 / 知识库 / 运行数据
VOLUME ["/app/backend/media", "/app/backend/knowledge", "/app/backend/data.json"]

EXPOSE 10085 8765

HEALTHCHECK --interval=15s --timeout=5s --start-period=30s --retries=5 \
    CMD python -c "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://192.168.1.9:10085/api/health', timeout=4).status==200 else 1)" || exit 1

CMD ["python", "docker_entry.py"]
