45 lines
1.8 KiB
Markdown
45 lines
1.8 KiB
Markdown
|
|
# IP 服务器自动补全站点域名 — 设计
|
|||
|
|
|
|||
|
|
**日期**: 2026-06-24
|
|||
|
|
|
|||
|
|
## 背景与目标
|
|||
|
|
|
|||
|
|
部分子机 SSH 地址(`servers.domain`)登记为 IP,列表「地址」列无法展示可点击站点链接。运维曾用手工脚本写 `extra_attrs.site_url`;需每日自动补全。
|
|||
|
|
|
|||
|
|
**目标**:北京时间每天 23:30,对「domain 为 IP 且尚无站点域名」的服务器 SSH 探测 nginx 站点名,写入 `extra_attrs.site_url`(不改 SSH 连接字段)。
|
|||
|
|
|
|||
|
|
## 方案对比
|
|||
|
|
|
|||
|
|
| 方案 | 优点 | 缺点 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| A. SSH 读 Baota/nginx vhost | 与 detect-path 一致,无面板依赖 | 需 SSH 凭据 |
|
|||
|
|
| B. 宝塔 API list_sites | 结构化 | 需先 bootstrap 面板凭据,覆盖不全 |
|
|||
|
|
| C. 仅读 target_path 推断 | 无 SSH | 大量机器 target_path 仍为默认 |
|
|||
|
|
|
|||
|
|
**选定 A**:复用现有 SSH 池与 batch job 框架;target_path 仅作优选 hint。
|
|||
|
|
|
|||
|
|
## 数据模型
|
|||
|
|
|
|||
|
|
- **输入**:`Server.domain` 为 IPv4/IPv6;`resolve_server_site_host(server)` 为空。
|
|||
|
|
- **输出**:`extra_attrs.site_url = "<hostname>"`(裸域名,与现有运维脚本一致)。
|
|||
|
|
- **不修改**:`domain`(SSH 仍走 IP)。
|
|||
|
|
|
|||
|
|
## 接口与任务
|
|||
|
|
|
|||
|
|
- 新 batch op:`detect-domain`
|
|||
|
|
- 新后台 loop:`ip_domain_detect_loop`(60s 轮询 cron)
|
|||
|
|
- 配置:`IP_DOMAIN_DETECT_ENABLED`(默认 true)、`IP_DOMAIN_DETECT_CRON`(默认 `30 23 * * *`)
|
|||
|
|
|
|||
|
|
## 安全与性能
|
|||
|
|
|
|||
|
|
- 远程命令经 `shlex.quote`;只读 nginx 配置。
|
|||
|
|
- 并发沿用 batch `CONCURRENCY=5`;每日 Redis 去重一次。
|
|||
|
|
- 仅 primary worker 执行。
|
|||
|
|
|
|||
|
|
## 验收标准
|
|||
|
|
|
|||
|
|
1. cron `30 23 * * *` 在北京时间 23:30 触发一次 batch。
|
|||
|
|
2. IP-only 且无 site_url 的服务器被纳入;已有 site_url 的跳过。
|
|||
|
|
3. 成功探测后列表 `#/servers` 地址列 IP 下出现可点击域名。
|
|||
|
|
4. pytest 覆盖 cron、候选筛选、命令构建。
|