279 lines
9.0 KiB
Markdown
279 lines
9.0 KiB
Markdown
# 14 domainCheck 正式上线前最终检查单
|
||
|
||
## 一、使用场景
|
||
|
||
本文档用于正式上线前最后一次收口。
|
||
|
||
适用前提:
|
||
|
||
- 代码已更新到最新版本
|
||
- Linux 测试服已完成基础联调
|
||
- PostgreSQL 已执行过 `domainCheck/init_database.py`
|
||
- `domaincheck-api` 与 `domaincheck-worker` 已按 `systemd` 托管
|
||
|
||
如果当前仍处于“新机器首次部署”,请先回看:
|
||
|
||
- `docs/05_domainCheck_Linux部署清单.md`
|
||
- `domain-api/deploy/linux/README.md`
|
||
- `docs/13_domainCheck_Linux测试服交接文档.md`
|
||
|
||
如果后续进入“国外控制面 + 大陆执行面 + 多 Worker 扩容”阶段,请直接补充阅读:
|
||
|
||
- `docs/16_domainCheck_多机检测与跨地域部署设计.md`
|
||
- `domain-api/deploy/multi-region/README.md`
|
||
|
||
如果当前已经进入“大陆 controller + 海外 control”双地域正式联调,还应额外确认:
|
||
|
||
- 大陆 `controller` 节点的 `/etc/default/domaincheck-worker`
|
||
- `NODE_ROLE=control`
|
||
- 大陆 `domaincheck-sync-agent`
|
||
- 已启动并稳定运行
|
||
- 海外控制面 `runtime/sync-summary`
|
||
- 能看到 `detect_result_batches`
|
||
|
||
如果当前已经切到“海外单脑控制面统一驾驶”模式,建议同时配套阅读:
|
||
|
||
- `docs/25_domainCheck_海外单脑控制面上线收口总表.md`
|
||
- `docs/23_domainCheck_终局运维架构设计_海外单脑控制面.md`
|
||
- `docs/24_domainCheck_NodeAgent协议与ReleaseHub设计.md`
|
||
|
||
## 二、上线前必须确认的结论
|
||
|
||
上线前至少要确认下面这些结论同时成立:
|
||
|
||
- `domaincheck-api` 为 `active (running)`
|
||
- `domaincheck-worker` 为 `active (running)`
|
||
- `/health` 返回 `worker_mode=linux-systemd`
|
||
- `/api/v1/runtime/preflight` 返回 `ok=true`
|
||
- `smoke test` 返回 `ok=true`
|
||
- 运行中心里的 `start_worker / stop_worker / restart_api` 控制链路可用
|
||
- 导入、筛选、批量更新、导出四条核心业务链路至少各回归一次
|
||
- 诊断包可正常导出
|
||
|
||
## 三、正式上线前执行顺序
|
||
|
||
### 0. 先跑一遍统一上线总检
|
||
|
||
如果当前已经进入“海外单脑控制面 + 多地域 / Node Agent”这条正式链路,建议先跑:
|
||
|
||
```bash
|
||
cd /www/wwwroot/getDomain/domain-api
|
||
bash domain-api/deploy/multi-region/drive_ops_center.sh go-live-check http://127.0.0.1:8100 http://152.53.37.118:8100 summary
|
||
```
|
||
|
||
期望:
|
||
|
||
- `go_live_status` 为 `ready` 或至少没有新的 `blocking_reasons`
|
||
- `stack_status` 不为 `blocked`
|
||
- `route_surface_complete=true`
|
||
- `launchpad_status` 不为 `blocked`
|
||
- 如果当前已经纳管执行节点,则 `remote_access_ready` 不应长期为 `0`
|
||
- `next_step_action_code` / `operator_title` 应能直接说明当前第一优先动作
|
||
- 如果 `log_sync_enabled=true`,则要额外看 `log_sync_state`、`log_sync_covered_nodes`
|
||
|
||
如果这里已经出现 `bootstrap_run / run_acceptance`,说明当前上线前仍有节点接管缺口,应先收口首个缺口节点,再继续下面的业务核验。
|
||
|
||
建议这样理解总检输出:
|
||
|
||
- `blocking_reasons` 只放真正会阻断上线的项,例如 `remote_agent_ready=0`
|
||
- `warnings` 表示还能继续联调,但现在还不适合直接宣称“全部收口”
|
||
- `recommended_commands.next_step` 就是当前最值得优先执行的一条命令
|
||
- `recommended_commands.log_sync_logs` / `recommended_commands.log_sync_inspection` 用来补远端参与节点的日志观测
|
||
|
||
### 1. 核对服务状态
|
||
|
||
```bash
|
||
systemctl status domaincheck-api --no-pager -l
|
||
systemctl status domaincheck-worker --no-pager -l
|
||
```
|
||
|
||
期望:
|
||
|
||
- 两个服务都为 `active (running)`
|
||
- `domaincheck-worker` 不再循环重启
|
||
|
||
如果当前是大陆 controller 节点,还要补一条:
|
||
|
||
```bash
|
||
systemctl status domaincheck-sync-agent --no-pager -l
|
||
```
|
||
|
||
期望:
|
||
|
||
- `domaincheck-sync-agent` 为 `active (running)`
|
||
- 不循环重启
|
||
|
||
### 2. 核对健康接口
|
||
|
||
```bash
|
||
curl http://127.0.0.1:8100/health
|
||
curl http://127.0.0.1:8100/api/v1/runtime/preflight
|
||
curl http://127.0.0.1:8100/api/v1/runtime/readiness
|
||
curl http://127.0.0.1:8100/api/v1/runtime/status
|
||
```
|
||
|
||
期望:
|
||
|
||
- `/health` 返回 `status=ok`
|
||
- `/health` 返回 `worker_mode=linux-systemd`
|
||
- `/runtime/preflight` 返回 `ok=true`
|
||
- `/runtime/readiness` 不应返回 `blocking`
|
||
- `/runtime/status` 返回 `worker.running=true`
|
||
|
||
如果当前已经接入跨地域同步,还建议补看:
|
||
|
||
```bash
|
||
curl http://127.0.0.1:8100/api/v1/runtime/sync-summary
|
||
```
|
||
|
||
期望:
|
||
|
||
- 返回里能看到 `detect_result_batches`
|
||
- 至少能区分:
|
||
- `synced`
|
||
- `projected`
|
||
- `failed`
|
||
- 若大陆 `sync-agent` 已接上,则最近执行过的检测任务不应长期停留在 `projected`
|
||
|
||
当前 `runtime/preflight` 还会额外展示:
|
||
|
||
- RedisBloom 是否安装,若未安装会明确提示“降级为普通缓存”
|
||
- `detect_jucha` / `detect_juziseo` 是否启用
|
||
- 若启用了付费检测,对应本地 cookie 文件是否已就绪
|
||
|
||
当前 `detect/status` / `runtime/status` 还会明确展示代理运行态:
|
||
|
||
- `代理正常`
|
||
- `降级直连`
|
||
- `等待代理`
|
||
|
||
解释:
|
||
|
||
- `降级直连` 表示代理池暂时无可用代理,但当前允许直连兜底,任务不会因此中断
|
||
- `等待代理` 表示代理池无可用代理,且当前未允许直连,这会直接影响检测吞吐或导致步骤失败
|
||
|
||
当前还补充了两类更细的诊断语义:
|
||
|
||
- `proxy_runtime_reason=supplier_empty_pool`
|
||
- 表示代理源最近都返回了正常 HTTP 响应,但原始代理数为 `0`
|
||
- 这类问题更偏向供应侧空池,不是程序拉取失败
|
||
- `dependency_alerts`
|
||
- 表示外部依赖站点当前存在可观测异常
|
||
- 例如 `web.archive.org` 拒连、超时、连接池异常等
|
||
|
||
当前免费检测链路中的外部依赖异常还采用了“降级继续”策略:
|
||
|
||
- 例如 `时光机 / 站长之家 / 爱站 / 百度 / 360` 这类外部站点出现明显网络波动、拒连、超时
|
||
- 系统会优先记录为步骤级 `degraded`
|
||
- 并将域名置为 `待人工复核`
|
||
- 同时继续执行后续检测步骤,避免把整条任务链路直接污染成 `检测失败`
|
||
|
||
### 3. 跑正式服务态 smoke test
|
||
|
||
```bash
|
||
cd /opt/domaincheck/domain-api/deploy/linux
|
||
python3 smoke_test.py --base-url http://127.0.0.1:8100
|
||
```
|
||
|
||
如需把 Web 首页一起纳入检查:
|
||
|
||
```bash
|
||
python3 smoke_test.py --base-url http://127.0.0.1:8100 --web-url http://127.0.0.1
|
||
```
|
||
|
||
期望:
|
||
|
||
- 输出中 `ok=true`
|
||
|
||
### 4. 回归运行中心控制动作
|
||
|
||
建议至少各执行一次:
|
||
|
||
- `start_worker`
|
||
- `stop_worker`
|
||
- `restart_api`
|
||
|
||
期望:
|
||
|
||
- `stop_worker` 后,`runtime/status` 中 `worker.running=false`
|
||
- `start_worker` 后,`runtime/status` 中 `worker.running=true`
|
||
- `restart_api` 调用返回成功,随后 API 能重新恢复
|
||
|
||
说明:
|
||
|
||
- 当前 Linux 正式服务态已改为 `systemctl --no-block restart domaincheck-api`
|
||
- 因此 `restart_api` 会先返回成功,再由 `systemd` 异步完成 API 切换
|
||
|
||
### 5. 回归核心业务链路
|
||
|
||
建议至少确认下面 4 条:
|
||
|
||
- 导入域名成功,且会落到 `domains`
|
||
- 导入后自动创建 `detect_tasks`
|
||
- 筛选接口 `/api/v1/domains` 返回正常
|
||
- 批量更新后数据库字段与页面展示一致
|
||
- 导出任务可创建、导出文件可下载
|
||
|
||
如果时间紧,最小回归顺序建议为:
|
||
|
||
1. 导入一份小样本
|
||
2. 查看导入任务结果
|
||
3. 查看域名列表
|
||
4. 执行一次批量更新
|
||
5. 生成一次 TXT 或 CSV 导出
|
||
|
||
## 四、建议保留的上线证据
|
||
|
||
正式上线前,建议至少保留下面这些结果:
|
||
|
||
- `systemctl status domaincheck-api --no-pager -l`
|
||
- `systemctl status domaincheck-worker --no-pager -l`
|
||
- `journalctl -u domaincheck-api -n 200 --no-pager`
|
||
- `journalctl -u domaincheck-worker -n 200 --no-pager`
|
||
- `systemctl status domaincheck-sync-agent --no-pager -l`
|
||
- `journalctl -u domaincheck-sync-agent -n 200 --no-pager`
|
||
- `/health` 返回
|
||
- `/api/v1/runtime/preflight` 返回
|
||
- `/api/v1/runtime/sync-summary` 返回
|
||
- `smoke_test.py` 输出
|
||
- 一份最新诊断包
|
||
|
||
诊断包导出命令:
|
||
|
||
```bash
|
||
cd /opt/domaincheck/domain-api/deploy/linux
|
||
bash collect_diagnostics.sh /opt/domaincheck
|
||
```
|
||
|
||
## 五、当前可接受的非阻断项
|
||
|
||
以下项目目前已确认不会阻断正式服务运行:
|
||
|
||
- Redis 未安装 Bloom 模块时,会降级为普通缓存
|
||
- `worker` 在 `QT_QPA_PLATFORM=offscreen` 下无头运行
|
||
- 付费检测默认关闭时,不要求本机预置 `jucha` / `juziseo` cookie 文件
|
||
|
||
这些项可以在后续优化阶段继续增强,但不应再作为当前上线阻塞条件。
|
||
|
||
## 六、仍建议继续观察的项
|
||
|
||
以下内容不属于当前功能阻断,但上线后建议继续观察:
|
||
|
||
- 真实代理池可用率
|
||
- 代理为空时是否长期停留在 `降级直连`
|
||
- Wayback 首次全量检测耗时
|
||
- 长时间运行下的 Worker 稳定性
|
||
- 真实业务数据量上升后的数据库与导出耗时
|
||
|
||
## 七、最终上线判定
|
||
|
||
如果下面三类检查都通过,就可以视为已经具备正式上线条件:
|
||
|
||
- 服务状态检查通过
|
||
- 核心接口与 `smoke test` 通过
|
||
- 核心业务链路回归通过
|
||
|
||
一句话判定:
|
||
|
||
> 当前项目已经完成开发、Linux 测试服联调、正式服务态验证和关键日志降噪;剩余工作主要是正式环境发布与上线后观察,不再是功能性大修。
|