# Nexus 6.0 — 全站功能清单（SSOT）

> **更新**: 2026-05-23  
> **读者**: 产品、运维、接续开发的 AI  
> **HTML 版**: [`docs/Nexus-功能说明书.html`](../Nexus-功能说明书.html)  
> **接续开发**: [`AI-HANDOFF-2026-05-23.md`](AI-HANDOFF-2026-05-23.md)

---

## 0. 全站页面地图（18 页）

| 页面 | 路径 | 功能摘要 |
|------|------|----------|
| 安装向导 | `/app/install.html` | 无 `.env` 时 5 步安装中心机 |
| 登录 | `/app/login.html` | JWT + TOTP + 防暴破 |
| 仪表盘 | `/app/index.html` | 统计、WebSocket 刷新、告警计数 |
| 服务器 | `/app/servers.html` | CRUD、详情、Agent 安装/升级、时钟漂移 |
| 资产管理 | `/app/assets.html` | Platform / Node 树 |
| 文件管理 | `/app/files.html` | SSH 浏览、删/改名/建目录 |
| 推送 | `/app/push.html` | rsync 批量、dry-run 预览、历史 |
| 脚本库 | `/app/scripts.html` | 脚本 CRUD、直接执行、$DB_* |
| 执行历史 | `/app/script-executions.html` | 停止/重试/日志/卡住检测 |
| 凭据 | `/app/credentials.html` | DB 凭据 + 密码预设 |
| 定时调度 | `/app/schedules.html` | Cron 推送 **或** 脚本执行 |
| 重试队列 | `/app/retries.html` | 推送失败指数退避重试 |
| 命令日志 | `/app/commands.html` | WebSSH 会话/命令 + **推送日志** |
| 告警中心 | `/app/alerts.html` | 告警历史、统计、时间过滤 |
| 审计 | `/app/audit.html` | 操作审计、时间/用户/类型过滤 |
| 设置 | `/app/settings.html` | 品牌、阈值、Telegram、TOTP、IP 白名单 |
| WebSSH | `/app/terminal.html` | xterm.js 终端（独立页） |

共享：`layout.js`（侧栏）、`api.js`（JWT、toast、全局搜索）

---

## 1. 网络与通道模型

| 通道 | 端口 | 用途 |
|------|------|------|
| 子机 → 中心 | **443 出站** | Agent 心跳、长任务完成回调 |
| 中心 → 子机 | **22 入站** | 推送、文件、**脚本**、手动健康检查、Agent 安装/升级 |
| 子机本机 | **127.0.0.1:8601** | Agent HTTP（可不暴露公网） |

---

## 2. 认证与访问控制

- JWT 登录 / 刷新 / 登出（`POST /api/auth/*`）
- TOTP：启用、禁用、**重绑**（设置页）
- 登录防暴破：5 次/15 分钟 → 429
- 会话：8 小时无操作退出；刷新令牌重用检测
- **登录 IP 白名单**：总开关、手动 IP、**代理订阅 URL 解析**（2h 自动刷新）、与登录防暴破联动
- WebSSH 专用短票：`POST /api/auth/webssh-token`（绑定 server_id）

**不可改密钥**（仅 `.env`）：`SECRET_KEY`、`API_KEY`、`ENCRYPTION_KEY`、`DATABASE_URL`

---

## 3. 仪表盘（index.html）

- 服务器总数 / 在线 / 离线 / 告警中（Redis 实时）
- WebSocket：告警/恢复时**刷新统计**（浏览器不响铃、不弹告警列表）
- 最近推送记录摘要

---

## 4. 告警中心（alerts.html）— 新增模块

- MySQL `alert_logs` 持久化告警与恢复记录
- 列表：按服务器、类型、是否恢复、**日期范围**分页
- 统计：近 N 日 Top 服务器、按日计数
- API：`GET /api/alert-history/`、`GET /api/alert-history/stats`

**实时告警路径**：Agent 心跳超阈值 → Redis + WebSocket Pub/Sub + Telegram（5 分钟防抖）

---

## 5. 服务器管理（servers.html）

- 分页列表；Redis 覆盖 `is_online`、`system_info`、**时钟漂移**（warn/crit 徽章）
- CRUD：SSH 密钥/密码（Fernet）、`platform_id`/`node_id`、`target_path`、`agent_port`
- 每机 **Agent API Key**（`nxs-*`，一次性展示）
- **Agent 安装**：复制 curl 命令 / **一键 SSH 远程安装**（实时日志）
- 安装后 **轮询在线状态**
- **Agent 升级**：`POST /api/servers/{id}/upgrade-agent`（SSH 拉 agent.py + restart）
- **健康检查**：`POST /api/servers/check`（**SSH 探测**，非 8601）
- 详情：系统信息、同步日志、WebSSH 入口
- 推送：`POST /api/servers/push`；日志：`GET /api/servers/logs`

**未实现**：CSV 批量导入

---

## 6. 资产管理（assets.html）

- Platform 模板 CRUD
- Node 树形分组 CRUD
- SSH 会话列表、命令日志查询（与 commands.html 数据同源）

API：`/api/assets/platforms`、`/api/assets/nodes`、`/api/assets/ssh-sessions`、`/api/assets/command-logs`

---

## 7. WebSSH（terminal.html）

- xterm.js + Koko 协议 + asyncssh 连接池
- `webssh-token` 15 分钟、**绑定 server_id**（越权关闭码 4003）
- 全屏、自动 resize
- 会话与命令写入 `ssh_sessions` / `command_logs`

**未实现**：断线自动重连（需刷新页面）

---

## 8. 命令日志（commands.html）

- **会话视图**：WebSSH 会话列表、过滤
- **命令视图**：逐条命令、危险命令高亮
- **推送日志视图**：rsync 批量推送历史、分页、服务器/状态/模式/触发源过滤

---

## 9. 批量推送（push.html）

- SyncEngineV2：`sync_files` rsync-over-SSH
- 模式：增量 / 全量(--delete) / 校验和 / inplace
- 分批 50、并发 10；失败 → `push_retry_jobs`
- **dry-run 预览**（方案 D）：首台 `--dry-run --stats`，可选 `-v` 前 200 行
- 推送历史列表

API：`POST /api/sync/files`、`POST /api/sync/preview`

---

## 10. Sync 引擎其他能力（API，部分无独立页）

| 模式 | API | 说明 |
|------|-----|------|
| 命令批量 | `POST /api/sync/commands` | SSH 批量执行命令 |
| 配置推送 | `POST /api/sync/config` | 批量写配置项 |
| 配置回滚 | `POST /api/sync/config/rollback` | 回滚 |
| SFTP | `POST /api/sync/sftp` | 上传/下载 |
| 目录浏览 | `POST /api/sync/browse` | 文件页也用 |
| 文件操作 | `POST /api/sync/file-ops` | 删/改名/mkdir |

---

## 11. 脚本与执行历史

### 脚本库（scripts.html）

- 脚本 CRUD（分类：ops/deploy/check/cleanup）
- **直接执行命令**（无需入库）
- 批量选机执行；危险命令中心拦截（400）
- **执行通道：SSH 22**（结果 `channel: ssh`）
- $DB_* 凭据替换（中心替换后 SSH 下发）

### 执行历史（script-executions.html）

- 列表 / 详情 / 停止 / 重试 / 标记卡住
- 长任务：nohup + 子机 `curl` 回调 `POST /api/agent/script-callback`
- Redis 热数据 2h + 60s 刷 MySQL

API：`POST /api/scripts/exec`、`GET /api/scripts/executions/*`

---

## 12. 远程文件管理（files.html）

- SSH `ls -la` 浏览、面包屑、目录优先排序
- 删除文件/目录、重命名、新建目录（confirm/二次确认）

**未实现**：上传、在线预览、树形侧栏

---

## 13. 定时调度（schedules.html）

- **类型**：`push`（文件推送）或 `script`（脚本执行）
- 5 字段 Cron；`schedule_runner` 60s 检查；仅 Primary Worker
- 脚本调度：关联 `script_id` 或内联 `script_content`、超时、长任务标志

---

## 14. 凭据管理（credentials.html）

- **数据库凭据**：MySQL/PG 等，Fernet 加密，供 $DB_*
- **密码预设**：SSH 密码模板（推送场景）

脚本页也可管理 DB 凭据（`/api/scripts/credentials`）

---

## 15. 重试队列（retries.html）

- 推送失败自动入队；`retry_runner` 5 分钟指数退避
- 手动立即重试 / 删除任务

---

## 16. 全局搜索

- 侧栏搜索框：`GET /api/search/` 跨服务器/脚本/凭据/调度

---

## 17. 系统设置（settings.html）

| 模块 | 功能 |
|------|------|
| 品牌 | system_name、title |
| 监控 | CPU/内存/磁盘阈值 |
| 连接 | redis_url、pool_size |
| Telegram | Token、Chat ID、**测试发送**、**getUpdates 解析 Chat ID** |
| 告警开关 | 各类型 Telegram 通知独立开关 |
| 安全 | 改密码、TOTP 启用/禁用/重绑、API Key 二次验证查看 |
| 登录白名单 | 开关、订阅 URL、手动 IP 列表、解析预览 |

配置三写：安装时 `.env` + `settings` 表 + `web/data/config.php`（PHP 兼容）

---

## 18. 审计日志（audit.html）

- 全站 CUD 与关键操作写入 `audit_logs`
- 过滤：**日期起止**、管理员用户名、操作类型（分组下拉）
- 分页 50 条/页

**未实现**：导出 CSV/JSON（已否决）

---

## 19. 安装向导（install.html）

- 无 `.env` → 安装模式（其他 API 503）
- 步骤：环境 → DB/Redis → 管理员/品牌 → 完成
- 生成密钥、写三处配置、Nginx 模板、cron 提示
- 完成后 install API 锁定（403）

---

## 20. 子机 Agent（web/agent/）

| 能力 | 说明 |
|------|------|
| 心跳 | 60s → `POST /api/agent/heartbeat`；变化>10% 或超阈值加急 |
| 时钟漂移 | `agent_time` vs 中心；warn/crit + Telegram |
| IP 白名单 | `allowed_ips` 限制访问 Agent HTTP |
| 安装 | `install.sh`：python3.12 venv、127.0.0.1:8601 |
| 端点 | `/health`、`/exec*`（中心脚本已改 SSH，子机端点保留） |

---

## 21. 后台任务（仅 Primary Worker）

| 任务 | 间隔 | 文件 |
|------|------|------|
| heartbeat_flush | 10min | Redis → MySQL |
| self_monitor | 30s | Redis/MySQL/WS 自检 |
| schedule_runner | 60s | Cron 调度 |
| retry_runner | 5min | 推送重试 |
| ip_allowlist_refresh | 2h | 订阅 IP 刷新 |
| script_execution_flush | 60s | 执行记录刷盘 |
| asyncssh 清理 | 60s | 空闲 SSH 连接 |

---

## 22. 三层守护

1. Supervisor — 进程崩溃重启  
2. Python self_monitor — 30s，Redis/MySQL 异常 Telegram  
3. Shell `health_monitor.sh` — 1min，连续 3 次 `/health` 失败重启  

---

## 23. 未实现（待开发）

| 功能 | 优先级 |
|------|--------|
| WebSSH 断线重连 | P1 |
| 服务器 CSV 批量导入 | P1 |
| Agent upgrade 与 venv install 对齐 | P1 |
| 仪表盘历史趋势图 | P2 |
| 远程文件上传 / 内容预览 | P2 |
| 宝塔 API 监控增强 | 可选 |
| Agent mTLS | 可选 |

---

## 24. 已否决（不做）

文件编辑器、RBAC、移动端、会话录像、审计导出、邮件报告、Redis Cluster、Docker（当前阶段）

---

## 25. 标准与验收（必查 · 与团队同等严谨）

| 文档 | 路径 |
|------|------|
| **标准转接包（全量）** | [`standards-transfer-package.md`](standards-transfer-package.md) |
| 开发验收 L0～L5 | [`development-acceptance-standard.md`](development-acceptance-standard.md) |
| 系统开发标准 | [`standards/system-development-standard.md`](../../standards/system-development-standard.md) |
| 逐行审计 v2 | [`standards/line-walk-audit-standard-v2.md`](../../standards/line-walk-audit-standard-v2.md) |
| 审计原则 | [`standards/audit-core-principles.md`](../../standards/audit-core-principles.md) |
| Cursor 规则 | `.cursor/rules/*.mdc`（含 `audit-line-review.mdc`） |

**逐行审查**：8 步/文件、Closure 全表、FINDING 必须 `文件:行号`、单回复 ≤5 文件 — **不可降级**。

| 层级 | 说明 |
|------|------|
| L0 | 完美实现 + 全部 mdc + system-development-standard |
| L2 | `pytest` + `wsl_integration_smoke.sh` |
| L3 | 逐行 DoD（同 standards-transfer-package §2） |
| L4 | 脚本 T-SE、告警策略、T1～T5 |
| L5 | `production-verification-checklist.md` |

---

## 26. 待验证（非功能缺失）

- 首次部署 E2E：`docs/project/production-verification-checklist.md`
- 脚本 T-SE1～8：`docs/project/script-execution.md`
- WSL 代码向：`docs/project/wsl-integration-test.md`
