82426b1941
新增侧栏「宝塔面板」菜单、代理 API 与连接配置页;通过 SSH 读写子机 api.json 自动写入凭据,5 分钟后台重试,含审计修复、检测缓存与并发锁。 Co-authored-by: Cursor <cursoragent@cursor.com>
3.3 KiB
3.3 KiB
宝塔面板独立模块 — 设计文档
日期: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 |
| B1–B3 | /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 |
| D1–D4 | /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 Bootstrap(2026-06-20 增补)
子机 Linux 宝塔 API 配置位于 /www/server/panel/data/api.json。中心通过 root SSH 执行 ssh_bootstrap.py:
- 无面板目录 →
bt_not_installed(状态installing,5min 重试) - 读/写
api.json:保留 token、开启 API、追加中心 IP 到limit_addr - 原子写 +
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、全局开关) |
验收
- 侧栏见独立「宝塔面板」分组及子项,与「运维」分组分离
- 配置 API 后可一键打开 tmp_token 登录页
- 各子页选定服务器后能拉取对应宝塔数据或执行操作
pytest tests/test_btpanel*.py+vite build通过