# 管理员渠道模型真实性探针服务。
# Node 24：内建 TypeScript strip-types，node:sqlite，无需外部依赖。
# 不引入任何外部 npm 依赖（无 package.json）；检测核心为 vendor 内 MIT 代码。
FROM node:24.10.0-slim@sha256:b8d2197aff9129d16c801a3e3e1b2a873c4946480f5a310f38056df2268c38d9

WORKDIR /app

# 只复制运行所需内容：源码、vendor、参考库数据。
COPY server/src ./src
COPY server/vendor ./vendor
COPY server/data ./data
# 带 channel-probe 薄补丁的前端构建产物（由 scripts/build-frontend.sh 生成）。
# 若未构建，镜像仍可运行：/panel 返回明确 PANEL_MISSING，业务 API 不受影响。
COPY public ./public

# 非 root 运行；数据目录可写（挂载卷）。
RUN groupadd -g 10001 probe && useradd -u 10001 -g probe -M -s /usr/sbin/nologin probe \
 && mkdir -p /data && chown -R probe:probe /app /data
USER probe

ENV PROBE_DATA_DIR=/data \
    PROBE_LISTEN_HOST=0.0.0.0 \
    PROBE_LISTEN_PORT=3001 \
    PROBE_PANEL_DIR=/app/public/panel \
    PROBE_STATIC_PREFIX=/panel \
    NEW_API_URL=http://127.0.0.1:3000 \
    PROBE_EXPECTED_VERSION=v1.0.0-rc.46

EXPOSE 3001

# relay 令牌通过挂载的只读文件提供（PROBE_RELAY_TOKEN_FILE），绝不写入镜像。
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
  CMD node -e "fetch('http://127.0.0.1:'+(process.env.PROBE_LISTEN_PORT||3001)+'/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"

ENTRYPOINT ["node", "--no-warnings", "src/main.ts"]
