Files
DCTS/docker-compose.yml
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

81 lines
3.2 KiB
YAML

# =============================================================================
# DCTS (Distributed Computing TLUSTY/SYNSPEC) Docker Compose 容器集群部署编排
# =============================================================================
#
# 快速启动:
# 1. docker compose up -d --build
# 2. 访问 Dashboard 控制台: http://localhost:8090
#
# 增加/减少计算节点:
# 每个物理设备部署一个 node 容器(多 slot 并行由 DCTS_MAX_SLOTS 控制),
# 通过修改本文件 node 服务的 image / env 或在多台设备上分别运行实现分布式计算。
#
# 停止集群:
# docker compose down
# =============================================================================
services:
# ─── 1. DCTS 主控/Web 节点 (Server + Dashboard) ─────────────────────────────
server:
build:
context: .
dockerfile: Dockerfile.server
image: dcts-server:latest
container_name: dcts-server
restart: unless-stopped
# 开发/内网模式:直接暴露 8090。
# 公网模式(--profile public)下由 proxy 容器接管 443,此处端口暴露建议关闭或改为 127.0.0.1。
ports:
- "${DCTS_PORT:-8090}:8090"
env_file:
- .env
environment:
- DCTS_PORT=8090
- TZ=Asia/Shanghai
- DCTS_DB_PATH=/app/data/dcts.db
- DCTS_QUEUE_DB_PATH=/app/data/dcts_queue.db
- DCTS_SEEDS_DIR=/app/data/seeds
- DCTS_BACKUP_DIR=/app/data/backups
- DCTS_ASSETS_DIR=/app/assets
- LOG_DIR=/app/data/logs
- DCTS_LOG=info,server=debug
volumes:
- ./assets:/app/assets:ro
- ./workflows:/app/workflows:ro
- ./data:/app/data
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:8090/healthz"]
interval: 15s
timeout: 5s
retries: 3
start_period: 10s
# ─── 2. DCTS Fortran 计算 Worker 节点 ──────────────────────────────────────
node:
build:
context: .
dockerfile: Dockerfile.node
image: dcts-node:latest
container_name: dcts-node
restart: unless-stopped
env_file:
- .env
environment:
- TZ=Asia/Shanghai
- DCTS_SERVER_URL=${DCTS_SERVER_URL:-http://dcts-server:8090}
- DCTS_MAX_SLOTS=${DCTS_MAX_SLOTS:-4}
- DCTS_HEARTBEAT_SEC=${DCTS_HEARTBEAT_SEC:-15}
- LOG_DIR=${LOG_DIR:-/app/data/logs}
- DCTS_LOG=${DCTS_LOG:-info,node=debug}
# 完整计算结果归档目录:科学产物(.spec/.cont/.iden/各阶段快照/日志)落盘位置,
# 上报成功后从沙盒拷贝至此避免丢失。挂载在 ./data 下,已随卷持久化。
# DCTS_ARCHIVE_DIR 为旧名,向后兼容回退(node 代码优先读 DCTS_RESULT_DIR)。
- DCTS_RESULT_DIR=${DCTS_RESULT_DIR:-${DCTS_ARCHIVE_DIR:-/app/data/result}}
volumes:
# 注:不再挂载 ./assets —— node 经 include_bytes! 嵌入 tlusty/synspec 二进制 +
# 从 server /api/data/* 下载原子数据文件,从不读取 /app/assets,挂载它纯属搬运
# 2.1GB 空数据、浪费磁盘与带宽。
- ./data:/app/data