Files
Nexus/docs/design/specs/2026-06-20-btpanel-module-design.md
T
r 82426b1941 feat(btpanel): 独立宝塔模块与 SSH 自动获取 API
新增侧栏「宝塔面板」菜单、代理 API 与连接配置页;通过 SSH 读写子机
api.json 自动写入凭据,5 分钟后台重试,含审计修复、检测缓存与并发锁。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-21 09:13:14 +08:00

79 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 宝塔面板独立模块 — 设计文档
> 日期:2026-06-20
> 状态:已批准实施
## 背景与目标
用户在 Nexus 管理 2000+ 台装宝塔的子机,需要**独立菜单**操作宝塔能力(一键登录、监控、网站/库/任务/服务),**不与**现有服务器页、文件、调度等功能合并 UI。
## 方案选定
| 层 | 方案 |
|----|------|
| 凭据 | 每台 `servers.extra_attrs.bt_panel``base_url``api_key_enc`Fernet)、`verify_ssl` |
| 登录 A1/A5 | 优先 `POST /config?action=set_temp_login`;失败则 SSH `tools.py get_temp_login_ipv4` |
| 其它能力 | 中心 HTTP 代理宝塔 API(签名 + Redis Cookie 复用) |
| 前端 | 新导航分组「宝塔面板」+ 9 个子路由,共享服务器选择器 |
## 功能映射
| 编号 | Nexus 路由 | 宝塔 API / 方式 |
|------|-----------|----------------|
| A1/A5 | `/btpanel/login` | `set_temp_login` / SSH tmp_token |
| B1B3 | `/btpanel/monitor` | `GetSystemTotal` / `GetDiskInfo` / `GetNetWork` |
| C1,C6 | `/btpanel/sites` | `getData sites` / `SiteStart` `SiteStop` |
| C4 | `/btpanel/sites/create` | `AddSite` + `GetPHPVersion` |
| C10 | `/btpanel/domains` | `getData domain` / `AddDomain` / `DelDomain` |
| C15 | `/btpanel/ssl` | 站点 SSL 字段 + `SetSSL` / `apply_cert` |
| D1D4 | `/btpanel/databases` | `getData databases` / `AddDatabase` / `ResDatabasePassword` / `ToBackup` |
| F1 | `/btpanel/crontab` | `GetCrontab`(只读) |
| H1 | `/btpanel/services` | `ServiceAdmin` |
| 配置 | `/btpanel/settings` | 读写 `extra_attrs.bt_panel` |
## 安全
- 所有路由 `Depends(get_current_admin)`
- API Key 仅写入加密字段;响应 `api_key_set: bool`
- 生成登录链接、建站、删库等写操作记 `audit_logs`
- 中心机 IP 须在各子机宝塔 API 白名单;SSH Bootstrap 可自动追加 `limit_addr`(见下节)
## SSH Bootstrap2026-06-20 增补)
子机 Linux 宝塔 API 配置位于 `/www/server/panel/data/api.json`。中心通过 root SSH 执行 `ssh_bootstrap.py`
1. 无面板目录 → `bt_not_installed`(状态 `installing`5min 重试)
2. 读/写 `api.json`:保留 token、开启 API、追加中心 IP 到 `limit_addr`
3. 原子写 + `bt reload`stdout JSON → 加密写入 `api_key_enc` + `base_url`
### 状态机(`extra_attrs.bt_panel`
| `bootstrap_state` | 含义 | 5min 重试 |
|-------------------|------|-----------|
| `pending` | 等待首次/下次 | 是 |
| `installing` | 宝塔尚未装好 | 是 |
| `ready` | 已写入凭据 | 否 |
| `failed` | SSH 认证失败等 | 否 |
| `disabled` | 用户关闭自动 | 否 |
### Background Loop
- `server/background/bt_panel_bootstrap_loop.py`primary worker,默认 300s
- 每轮最多 `BT_PANEL_BOOTSTRAP_BATCH`20)台
- 触发:创建服务器、凭据轮询成功、UI「立即 SSH 获取」、批量 `bt-panel-bootstrap`
### API
| 方法 | 路径 |
|------|------|
| POST | `/api/btpanel/servers/{id}/bootstrap` |
| POST | `/api/btpanel/servers/batch-bootstrap` |
| GET/PUT | `/api/btpanel/settings`(中心 IP、全局开关) |
## 验收
1. 侧栏见独立「宝塔面板」分组及子项,与「运维」分组分离
2. 配置 API 后可一键打开 tmp_token 登录页
3. 各子页选定服务器后能拉取对应宝塔数据或执行操作
4. `pytest tests/test_btpanel*.py` + `vite build` 通过