科学计算正确性: - 修复 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 入库
62 lines
2.4 KiB
Docker
62 lines
2.4 KiB
Docker
# =============================================================================
|
|
# DCTS Worker Node Dockerfile — Fortran (gfortran/BLAS/LAPACK) + Node Runner
|
|
# =============================================================================
|
|
|
|
# ─── Stage 1: Rust Node Worker 二进制编译 ────────────────────────────────────
|
|
FROM rust:1.94-alpine AS node-builder
|
|
|
|
# 国内(CN)网络构建时传 --build-arg USE_MIRRORS=1 切换 apk 源;默认关闭避免境外构建失败。
|
|
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
|
|
COPY Cargo.toml Cargo.lock ./
|
|
COPY crates/ ./crates/
|
|
COPY tools/ ./tools/
|
|
COPY assets/tlusty_static assets/synspec_static ./assets/
|
|
RUN cargo build --release -p node && \
|
|
cp /app/target/release/node /usr/local/bin/dcts-node
|
|
|
|
# ─── Stage 2: 精简 Debian 运行环境镜像 (包含完整 glibc + libmvec + libgfortran) ─
|
|
#
|
|
# ⚠️ 重要:运行镜像必须为 glibc 系(debian/ubuntu),不可换 alpine/musl。
|
|
# assets/tlusty_static 与 synspec_static 是 gfortran/glibc 动态链接的 ELF(依赖
|
|
# libgfortran.so.5 / libmvec.so.1 / ld-linux-x86-64.so.2),在 musl 上无法执行。
|
|
# 若误改为 alpine 基础镜像,嵌入的二进制会以 "No such file or directory" 失败。
|
|
FROM debian:bookworm-slim
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
libgfortran5 \
|
|
ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/*
|
|
|
|
# 创建非 root 账号管理运行
|
|
RUN groupadd -g 65532 dcts && useradd -u 65532 -g dcts -s /bin/bash dcts
|
|
|
|
WORKDIR /app
|
|
|
|
COPY --from=node-builder /usr/local/bin/dcts-node /app/
|
|
|
|
RUN mkdir -p /app/data /app/data/logs /app/data/runtime /app/data/work /app/data/result /app/assets && \
|
|
chown -R dcts:dcts /app
|
|
|
|
USER dcts
|
|
|
|
ENV DCTS_SERVER_URL=http://dcts-server:8090
|
|
ENV DCTS_MAX_SLOTS=4
|
|
ENV DCTS_HEARTBEAT_SEC=15
|
|
ENV DCTS_RUNTIME_DIR=/app/data/runtime
|
|
ENV DCTS_WORK_DIR=/app/data/work
|
|
# node 完整计算结果归档目录(光谱/连续谱/各阶段产物)。旧名 DCTS_ARCHIVE_DIR 向后兼容回退。
|
|
ENV DCTS_RESULT_DIR=/app/data/result
|
|
ENV DCTS_ASSETS_DIR=/app/assets
|
|
ENV LOG_DIR=/app/data/logs
|
|
|
|
VOLUME ["/app/data"]
|
|
|
|
ENTRYPOINT ["/app/dcts-node"]
|