# Nexus 6.0 — 首次部署验证清单

**用途**：**首次部署到 staging / 生产** 时逐项勾选（非日常开发阻塞）。  
**环境**：目标域名（如 `api.synaglobal.vip`）或本地 WSL 全链路联调。

> **2026-05-23**：项目仍在开发、**尚未部署**，无 API Key 轮换包袱。清单在 **first deploy** 时使用；开发阶段以 `pytest tests/test_security_unit.py` 为主。

---

## 0. 首次部署前

- [ ] 通过 **install 向导** 生成全新 `API_KEY` / `SECRET_KEY`（勿用压测脚本或文档示例）
- [ ] 确认 `web/app/vendor/` 已随仓库部署（或运行 `python scripts/sync_frontend_vendor.py`）
- [ ] `supervisorctl restart nexus` + `nginx -s reload`（含 `deploy/nginx_https.conf` 中 `/ws/` 专用 access_log）
- [ ] 确认 `web/app/vendor/*.js` 可被 Nginx/`/app/` 静态访问（返回 200）

---

## 1. 认证与会话

| # | 步骤 | 预期 |
|---|------|------|
| 1.1 | 未登录访问 `GET /api/servers/` | **401**（全局 JWT 中间件） |
| 1.2 | `POST /api/auth/login` 正确密码 | 200 + `access_token` |
| 1.3 | 带 Bearer 访问 `GET /api/auth/me` | 200 + 用户名 |
| 1.4 | 修改密码后旧 access_token | **401** |
| 1.5 | 安装完成后 `POST /api/install/init-db` | **403**；`GET /api/install/status` 仍可用 |

---

## 2. 前端静态资源（F2e-06）

| # | 步骤 | 预期 |
|---|------|------|
| 2.1 | 浏览器打开 `/app/index.html`，Network 无 `cdn.jsdelivr.net` | 仅 `/app/vendor/*` |
| 2.2 | 仪表盘样式、Alpine 交互正常 | 侧栏、统计卡片可点 |
| 2.3 | `/app/settings.html` TOTP 二维码 | qrious 本地脚本加载成功 |
| 2.4 | `/app/terminal.html` WebSSH | xterm 本地脚本 + 终端可连 |

---

## 3. 告警与 Telegram（见 `alert-push-policy.md`）

| # | 步骤 | 预期 |
|---|------|------|
| 3.1 | 子机 CPU 超阈值 | Telegram 收到告警；**浏览器无声音** |
| 3.2 | 指标恢复 | Telegram 恢复通知 |
| 3.3 | 仪表盘 WS 连接 | 仅刷新运行状态/统计，无告警列表弹窗 |
| 3.4 | 人为断开 MySQL 30s+ | Telegram 固定文案「MySQL 连接异常」；**不含**连接串 |

---

## 4. Agent 与子机

| # | 步骤 | 预期 |
|---|------|------|
| 4.1 | 错误 API Key 心跳 | 401 |
| 4.2 | 子机 `alert_thresholds` 与中心 settings 一致 | 加急心跳与中心告警同步 |
| 4.3 | 子机 `/exec/kill` 非本进程 pid | **404** |

---

## 5. WebSSH

| # | 步骤 | 预期 |
|---|------|------|
| 5.1 | `POST /api/auth/webssh-token` + `server_id` | 200 + 短票 |
| 5.2 | 用该票连 `/ws/terminal/{server_id}` | 终端正常 |
| 5.3 | 同一票连其他 `server_id` | 关闭码 **4003** |

---

## 6. 脚本执行

| # | 步骤 | 预期 |
|---|------|------|
| 6.1 | 执行含 `rm -rf` 的脚本 | **400** 危险命令拦截 |
| 6.2 | 长任务进度 | HTTP 轮询（非 WS 换票） |
| 6.3 | 重试任务 | 新 execution id + 响应含 `parent_execution_id` |

---

## 7. 守护与健康

| # | 步骤 | 预期 |
|---|------|------|
| 7.1 | `GET /health` | 200 |
| 7.2 | `kill` Python 进程 | Supervisor 自动拉起 |
| 7.3 | cron `health_monitor.sh` | 连续失败后重启 + Telegram（文案无敏感信息） |

---

## 签署

| 角色 | 姓名 | 日期 | 备注 |
|------|------|------|------|
| 运维 | | | |
| 开发 | | | |
