科学计算正确性: - 修复 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 入库
138 lines
7.3 KiB
Markdown
138 lines
7.3 KiB
Markdown
# DCTS (Distributed Computing TLUSTY/SYNSPEC)
|
||
|
||
> 基于 Rust 构建的高性能分布式恒星大气模型(TLUSTY)与合成光谱(SYNSPEC)网格计算调度系统。
|
||
|
||
---
|
||
|
||
## 💡 项目简介
|
||
|
||
**DCTS** 是专为恒星光谱计算设计的分布式计算控制系统。通过将多维度参数网格(如 Teff, log g, log He, log C, log N, log O)离散化为独立计算点,DCTS 能够在 Master 服务端统一管理任务队列与计算状态,由分布在不同物理节点上的 Worker 离散执行 4 阶段物理收敛链,实现自动化调度、种子传递、发散回退与高吞吐并行计算。
|
||
|
||
---
|
||
|
||
## 🚀 快速开始 (Quickstart)
|
||
|
||
### 1. 编译系统
|
||
```bash
|
||
cd dcts
|
||
cargo build --release
|
||
```
|
||
编译产物位于 `target/release/`:
|
||
- `server`:调度与 API 主服务端
|
||
- `node`:计算节点后台进程
|
||
- `import_results`:历史计算结果导入工具(旧版单机网格结果 → 标记已完成 + 迁移产物树)
|
||
|
||
### 2. 构建前端与启动服务端 (Master & Web Dashboard)
|
||
首先编译前端全域实时网格可视图看班:
|
||
```bash
|
||
cd dashboard && npm install && npm run build && cd ..
|
||
```
|
||
运行后端处理与管理主程序 (Master):
|
||
```bash
|
||
./target/release/server --workflow config.yaml --port 8090
|
||
```
|
||
服务端启动后将通过分级自动绑定监听:
|
||
- **开放调配 RESTful 接口** (`/api/...`): 为算力节点群与客户调控工具开放的高速接口池。
|
||
- **实时监控分析空间**: 指向 `dashboard/dist`,使用通用现代浏览器访问 `http://127.0.0.1:8090/` 即可免额外网关无障碍视见计算态势全局状态台。
|
||
|
||
### 3. 启动计算节点 (Worker)
|
||
在 Worker 节点配置 `.env` 环境变量:
|
||
```env
|
||
DCTS_NODE_ID=node-worker-01
|
||
DCTS_SERVER_URL=http://<MASTER_IP>:8090
|
||
DCTS_MAX_SLOTS=4
|
||
```
|
||
运行节点进程:
|
||
```bash
|
||
./target/release/node
|
||
```
|
||
节点会自动加载 `.env`,与服务端握手注册、下载缺失的基础原子数据与可执行程序,并开始循环 Claim 任务执行计算。
|
||
|
||
---
|
||
|
||
## 🔐 安全与鉴权 (Security & Auth)
|
||
|
||
DCTS 采用**分层鉴权**模型,公网部署务必按下表配置凭据。
|
||
|
||
### 鉴权主体
|
||
|
||
| 主体 | 环境变量 | 用途 | 持有方式 |
|
||
| :--- | :--- | :--- | :--- |
|
||
| **Admin** | `DCTS_ADMIN_TOKEN` | Dashboard 登录、工作流 CRUD、起停计算、节点审批授权 | 人工,Dashboard 输入 |
|
||
| **Node** | _(服务端审批后自动颁发)_ | 心跳、领任务、上报、下载数据 | 节点本地 `.node_token` 文件(权限 600) |
|
||
|
||
> **兼容**:旧变量 `DCTS_AUTH_TOKEN` 仍有效,自动回退用作 Admin 凭据(建议迁移到 `DCTS_ADMIN_TOKEN`)。
|
||
|
||
### 节点注册流程(免凭据申请 + 管理员审批)
|
||
|
||
1. 节点启动时优先读取本地 `runtime/.node_token`;不存在则**免凭据**向 `/api/node/register` 提交注册申请,进入 `pending_approval` 待审批状态。
|
||
2. 管理员在 Dashboard「节点管理」面板点击【同意接入】后,服务端**颁发该节点专属 token**(仅返回一次,DB 只存 SHA-256 hash)。
|
||
3. 节点轮询 `/api/node/check_status` 取回专属 token 并持久化到 `.node_token`(权限 600)。
|
||
4. 后续所有请求携带专属 token;服务端按 token 反查 `node_id` 鉴权。
|
||
5. **重发/停用**:通过 Dashboard「节点凭据管理」面板或下方管理 API 操作。
|
||
|
||
### 节点凭据管理 API(Admin 角色)
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
| :--- | :--- | :--- |
|
||
| GET | `/api/admin/nodes` | 列出全部节点及凭据状态(在线/token 有效/颁发时间) |
|
||
| POST | `/api/admin/nodes/:node_id/approve` | 同意待审批节点的接入申请并颁发 token |
|
||
| POST | `/api/admin/nodes/:node_id/reject` | 拒绝待审批节点的接入申请 |
|
||
| POST | `/api/admin/nodes/:node_id/reissue` | 重新颁发 token,返回新明文(旧 token 立即失效) |
|
||
| POST | `/api/admin/nodes/:node_id/disable` | 停用节点(保持在线但不再分发任务,可恢复) |
|
||
| POST | `/api/admin/nodes/:node_id/enable` | 重新启用被停用的节点 |
|
||
|
||
所有端点要求 Admin token(`Authorization: Bearer <DCTS_ADMIN_TOKEN>`)。被攻陷节点持有的 node token 无权访问这些端点,因此重发/停用始终是管理员主动行为。
|
||
|
||
### 公网部署清单
|
||
|
||
```env
|
||
# .env(服务端配置;计算节点无需任何凭据,免凭据申请后由管理员审批授权)
|
||
DCTS_ADMIN_TOKEN=<强随机值>
|
||
```
|
||
|
||
> TLS/HTTPS:请在容器外部自行配置反向代理(如 Nginx / Caddy / 云负载均衡)终止 TLS,
|
||
> 再将流量转发到本服务的 8090 端口。本服务默认仅监听 HTTP。
|
||
|
||
### 默认安全策略
|
||
|
||
- **CORS**:仅允许同源或本地 Origin(localhost / 127.0.0.1 / [::1])。
|
||
- **请求体限制**:普通 API 10MB,任务上报 256MB。
|
||
- **安全响应头**:CSP / `X-Content-Type-Options` / `X-Frame-Options` / `Referrer-Policy` 默认开启。
|
||
- **审计日志**:所有写操作(POST/PUT/DELETE)记录 `subject + method + path`(不记请求体)。
|
||
- **应急调试**:`DCTS_AUTH_DISABLE=1` 跳过全部鉴权(仅本地,切勿生产)。
|
||
|
||
---
|
||
|
||
## 🏛️ Workspace 核心模块
|
||
|
||
| Crate / Tool | 类型 | 职责说明 | 详细文档 |
|
||
| :--- | :--- | :--- | :--- |
|
||
| [`common`](crates/common/README.md) | Library | 提供底层配置解析、输入文件构造、收敛判定、子进程调用与种子匹配引擎 | [README](crates/common/README.md) |
|
||
| [`server`](crates/server/README.md) | Binary | 基于 Axum 的中央 API 服务端,负责网格生成、节点心跳、任务调度与状态持久化 | [README](crates/server/README.md) |
|
||
| [`node`](crates/node/README.md) | Binary | Worker 节点 Daemon 进程,负责任务抢占、自适应环境预热、计算链执行与产物汇报 | [README](crates/node/README.md) |
|
||
| [`mq`](crates/mq/README.md) | Library | 基于 SQLite 构建的高可靠事务型分布式任务队列引擎 | [README](crates/mq/README.md) |
|
||
| [`dashboard`](dashboard/index.html) | Web UI | 基于 Vite 与原生高交互前端语系创写的分层式恒星网格任务可观测可视化控表空间 | [说明详情](dashboard/package.json) |
|
||
| [`import_results`](tools/import_results/README.md) | Tool CLI | 历史计算结果导入工具(旧版单机网格结果 → 标记已完成 + 迁移产物树) | [README](tools/import_results/README.md) |
|
||
|
||
---
|
||
|
||
## 📚 详细文档导航 (`docs/`)
|
||
|
||
系统技术细节按以下主题组织:
|
||
|
||
- 📐 **[系统架构 (Architecture)](docs/architecture.md)**:Master-Worker 拓扑结构、任务生命周期与心跳机制。
|
||
- 🔗 **[API 参考 (API Reference)](docs/api.md)**:Axum RESTful 接口规格明细与鉴权方式。
|
||
- 💾 **[数据库设计 (Database)](docs/database.md)**:SQLite 数据表结构模式与队列状态机设计。
|
||
- ⚙️ **[物理链设计 (Design)](docs/design.md)**:4 阶段 TLUSTY/SYNSPEC 计算链、冷启动与种子步进(Seed Step)降级重试逻辑。
|
||
- 📦 **[部署运维指南 (Deployment)](docs/deployment.md)**:生产环境部署、Systemd 服务配置、安全令牌与日志管理。
|
||
- 🔧 **[故障排查 (Troubleshooting)](docs/troubleshooting.md)**:常见发散案例分析、僵死进程回收、节点断连恢复。
|
||
- 🤝 **[参与贡献 (Contributing)](docs/contributing.md)**:本地开发环境搭建、规范与测试说明。
|
||
|
||
---
|
||
|
||
## 📄 License & 联系方式
|
||
|
||
- **License**: MIT / Apache-2.0
|
||
- **Maintainers**: TLUSTY High-Performance Computing Workgroup
|