Files
DCTS/Dockerfile.server
T
fmq c8fd24b120 feat(all): 科学计算正确性修复、调度竞态消除、节点优雅退出、安全加固与收敛分析重构
科学计算正确性:
- 修复 Fortran 无-E 科学记数法(指数≥100 时 E 被挤掉,如 -1.35+118)导致
  发散行被静默跳过、误判收敛的 bug;扩展大气无效检测覆盖 Inf 与 *** 溢出标记
- 种子匹配改为 CNO 有向距离(富金属方向重罚 4×、贫金属方向轻罚 1×),
  基于 1191 个真实种子配对回测标定,回测净改善 314 个点
- GridAxisValue 反序列化拒绝非法文本(不再静默 NaN);chmax≤0 显式报错
- ions 行宽列宽对齐真实 fort.5 格式

调度与队列竞态:
- 原子选点(IMMEDIATE 事务 SELECT+UPDATE)消除并发调度重复派发 (#5)
- 调度互斥锁 + 冷启动优先策略(SeedStep 仅作失败后救援,不再正常路径热启动)
- 毒消息 dead_letter 标记防出队死循环;clear_queue 保留 claimed 行 (#6)
- 孤儿 running 点回收兜底;stale_sec 默认 7800→21600s(3 倍超时缓冲)

节点生命周期:
- SIGTERM+SIGINT 双信号监听(修复 Docker stop 发 SIGTERM 不触发优雅退出)
- SlotGuard RAII 防活动 slot 泄漏;子进程超时增加二级 30s wait 防 Fortran hang
- SeedStep 种子下载 fail-fast + 沙盒私有副本解耦 LRU 清理竞争
- reqwest Client 增加连接/请求超时;启动清理残留 task_* 沙盒

安全加固:
- 节点注册 registration_secret 二次凭据 (H8),恒定时间比对防时序旁路
- token 缓存 generation 机制消除 reissue 后旧 token TOCTOU 复活窗口
- 新增 /api/auth/logout 服务端 session 即时撤销;fail-closed 鉴权启动策略
- 前端 token 迁移 sessionStorage;YAML 高亮改 DOM API 消除 XSS 注入面
- 备份文件权限收紧 0600;点表动态值全面 escapeHtml

前端 Dashboard:
- 收敛性分析从热力图重构为 Parallel Sets 平行集合图(6 维+状态轴,手写 SVG 零依赖)
- 进度曲线横轴改为真实时间(服务端 now 锚定,停滞期诚实留白);轮询指数退避
- 移除 imported 收敛途径分类,导入点按实际途径 cold_run/seed_step 归类
- 初始化时 /api/auth/check 校验 token;401 toast 提示替代静默 reload

服务端恢复与工具链:
- 启动恢复 initializing 态工作流;默认工作流 INSERT-only 不覆盖 API 编辑
- body limit 分层(10MB 不再截断 256MB report);multipart 显式错误处理
- 嵌入二进制原子写(tmp+rename)防半写损坏
- import_results 判定收敛途径透传 success_method;conv.json 格式对齐本项目
- push_import_results.sh 退出码修复 + .bat UTF-8 BOM + scp 上传
- Docker USE_MIRRORS 默认关闭;移除无用 assets 挂载;删除 hosts.ini 入库
2026-08-01 17:01:40 +08:00

88 lines
3.0 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =============================================================================
# DCTS Server Dockerfile — Multi-stage Build (Server + Frontend Dashboard)
# =============================================================================
# ─── Stage 1: 前端静态资源构建 ────────────────────────────────────────────────
FROM node:22-alpine AS frontend-builder
# 国内(CN)网络构建时传 --build-arg USE_MIRRORS=1 切换 npm 源;默认关闭避免境外构建失败。
ARG USE_MIRRORS=0
WORKDIR /app/dashboard
RUN if [ "$USE_MIRRORS" = "1" ]; then \
npm config set registry https://registry.npmmirror.com; \
fi
COPY dashboard/package.json dashboard/package-lock.json* ./
RUN npm install
COPY dashboard/ ./
RUN npm run build
# ─── Stage 2: Rust 服务端编译 (Alpine/musl 静态编译) ─────────────────────────
FROM rust:1.94-alpine AS backend-builder
ARG USE_MIRRORS=0
RUN if [ "$USE_MIRRORS" = "1" ]; then \
sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories; \
fi
RUN apk add --no-cache musl-dev g++ make cmake pkgconfig sqlite-dev openssl-dev openssl-libs-static
WORKDIR /app
ENV SKIP_DASHBOARD_BUILD=1
COPY Cargo.toml Cargo.lock ./
COPY crates/ ./crates/
COPY tools/ ./tools/
COPY workflows/ ./workflows/
COPY --from=frontend-builder /app/dashboard/dist ./dashboard/dist
RUN cargo build --release -p server && \
cp /app/target/release/server /usr/local/bin/dcts-server
# ─── Stage 3: 最小化生产运行镜像 ─────────────────────────────────────────────
FROM alpine:3.21
ARG USE_MIRRORS=0
RUN if [ "$USE_MIRRORS" = "1" ]; then \
sed -i 's|dl-cdn.alpinelinux.org|mirrors.aliyun.com|g' /etc/apk/repositories; \
fi
RUN apk add --no-cache ca-certificates tzdata sqlite
# 创建非 root 账号管理运行
RUN addgroup -g 65532 -S dcts && adduser -u 65532 -S dcts -G dcts
WORKDIR /app
COPY --from=backend-builder /usr/local/bin/dcts-server /app/
COPY --from=frontend-builder /app/dashboard/dist ./dashboard/dist
COPY workflows/ ./workflows/
RUN mkdir -p /app/data /app/data/logs /app/data/seeds /app/assets && \
chown -R dcts:dcts /app
USER dcts
EXPOSE 8090
ENV DCTS_PORT=8090
ENV DCTS_DB_PATH=/app/data/dcts.db
ENV DCTS_QUEUE_DB_PATH=/app/data/dcts_queue.db
ENV DCTS_SEEDS_DIR=/app/data/seeds
ENV DCTS_BACKUP_DIR=/app/data/backups
ENV DCTS_ASSETS_DIR=/app/assets
ENV LOG_DIR=/app/data/logs
VOLUME ["/app/data"]
# 健康检查走不走鉴权的 /healthz(启用 admin token 后 /api/status 返回 401
# 会令容器被误判不健康而反复重启)。与 docker-compose.yml 的 healthcheck 保持一致。
HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \
CMD wget -q --spider http://127.0.0.1:8090/healthz || exit 1
ENTRYPOINT ["/app/dcts-server"]