# 审探 AuditProbe — 生产演示镜像
# 基于 Python 3.11 + Streamlit 1.60 构建
# 使用方法:
#   docker build --build-arg AUDITPROBE_VERSION=2.0.0 -t auditprobe:2.0.0 .
#   docker run --rm -p 8501:8501 -v auditprobe-hitl:/app/runtime/hitl auditprobe:2.0.0

FROM python:3.11-slim

ARG AUDITPROBE_VERSION=2.0.0

LABEL maintainer="AuditProbe Team"
LABEL version="${AUDITPROBE_VERSION}"
LABEL description="审探 AuditProbe:基于白盒规则、证据定位与人工复核的财报风险筛查助手"

WORKDIR /app

# 1. 安装最小系统依赖:中文字体 + PID 1 信号转发
# 构建期软件包来源默认切换为清华镜像(HTTPS):deb.debian.org 的 CDN 在部分构建
# 网络下下载不可达。可用 --build-arg APT_MIRROR_URL=... 覆盖(例如官方源)。
# 该变更只改变构建期软件包来源(供应链),运行时配置不变。
ARG APT_MIRROR_URL=https://mirrors.tuna.tsinghua.edu.cn
RUN sed -i "s|http://deb\.debian\.org|$APT_MIRROR_URL|g" /etc/apt/sources.list.d/debian.sources 2>/dev/null || true \
    && sed -i "s|http://deb\.debian\.org|$APT_MIRROR_URL|g" /etc/apt/sources.list 2>/dev/null || true \
    && apt-get update \
    && apt-get install -y --no-install-recommends \
    fonts-noto-cjk \
    tini \
    && rm -rf /var/lib/apt/lists/*

# 2. Docker 只安装当前运行路径真实使用的锁定依赖;开发/路线图依赖仍见 requirements.txt
COPY requirements.docker.txt .
RUN python -m pip install --no-cache-dir --disable-pip-version-check -r requirements.docker.txt

# 3. 复制项目代码
COPY --chown=10001:10001 . .

# 4. 使用非 root 用户;只把运行时 HITL 目录设为可写并供命名卷持久化
RUN groupadd --gid 10001 auditprobe \
    && useradd --uid 10001 --gid 10001 --create-home --shell /usr/sbin/nologin auditprobe \
    && mkdir -p /app/runtime/hitl \
    && chown -R auditprobe:auditprobe /app /home/auditprobe

# 5. 环境变量(默认值,生产环境通过 docker run -e 覆盖)
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
ENV AUDITPROBE_VERSION=${AUDITPROBE_VERSION}
ENV STREAMLIT_SERVER_PORT=8501
ENV STREAMLIT_SERVER_ADDRESS=0.0.0.0
ENV STREAMLIT_BROWSER_GATHER_USAGE_STATS=false
ENV HITL_ENABLED=true
ENV HITL_AUDIT_DB=/app/runtime/hitl/audit_log.db
ENV EVIDENCE_TRACING_ENABLED=true

USER auditprobe

# 6. 暴露端口
EXPOSE 8501

# 7. 健康检查
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
    CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8501/_stcore/health', timeout=3)" || exit 1

# 8. tini 负责转发 SIGTERM,python -m 确保使用当前镜像环境中的 Streamlit
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["python", "-m", "streamlit", "run", "ui/professional_app.py", "--server.headless=true", "--server.port=8501", "--server.address=0.0.0.0"]