FROM node:20-slim AS frontend-builder

WORKDIR /build/templates/index

# 安装前端依赖，并在镜像构建阶段生成 Vite 产物。
COPY templates/index/package.json templates/index/pnpm-lock.yaml ./
RUN corepack enable && \
    corepack prepare pnpm@9.15.9 --activate && \
    pnpm install --frozen-lockfile

COPY templates/index/ ./

RUN rm -f pnpm-workspace.yaml && pnpm build

FROM python:3.11-slim

WORKDIR /app

# 安装运行时系统依赖。
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    ffmpeg \
    && rm -rf /var/lib/apt/lists/*

# 先安装 Python 依赖，提高 Docker 层缓存命中率。
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 先准备 vendor 目录，便于离线依赖下载脚本写入文件。
RUN mkdir -p /app/static/vendor

# 只复制下载脚本，避免业务代码变化导致 vendor 依赖重复下载。
COPY scripts/download_offline_deps.py scripts/
RUN pip install --no-cache-dir requests && \
    python scripts/download_offline_deps.py

# 复制应用代码。
COPY . .

# 使用前端构建阶段生成的产物覆盖源码中的旧产物。
COPY --from=frontend-builder /build/static/vite/index /app/static/vite/index

# 创建容器运行时数据目录。
RUN mkdir -p /data/uploads /data/instance && \
    chmod 755 /data/uploads /data/instance

# 设置默认运行环境变量。
ENV FLASK_APP=src/app.py
ENV SQLALCHEMY_DATABASE_URI=sqlite:////data/instance/transcriptions.db
ENV UPLOAD_FOLDER=/data/uploads
ENV PYTHONPATH=/app

# 安装容器入口脚本。
COPY scripts/docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

# 暴露 Flask/Gunicorn 服务端口。
EXPOSE 8899

# 设置入口脚本和默认启动命令。
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["gunicorn", "--workers", "3", "--threads", "8", "--bind", "0.0.0.0:8899", "--timeout", "600", "src.app:app"]
