baa-conductor

git clone 

baa-conductor / coordination / tasks / done
im_wower  ·  2026-03-22

T-022-ops-automation.md

  1---
  2task_id: T-022
  3title: Nginx 与 Cloudflare DNS 自动化
  4status: done
  5branch: feat/T-022-ops-automation
  6repo: /Users/george/code/baa-conductor
  7base_ref: main@458d7cf
  8depends_on:
  9  - T-008
 10write_scope:
 11  - ops/nginx/**
 12  - docs/ops/**
 13  - scripts/ops/**
 14updated_at: 2026-03-22
 15---
 16
 17# T-022 Nginx 与 Cloudflare DNS 自动化
 18
 19## 目标
 20
 21把当前的 Nginx 配置和 Cloudflare DNS 管理推进到“有脚本辅助同步和部署”的程度,减少手工改记录、手工改配置的步骤。
 22
 23## 本任务包含
 24
 25-`scripts/ops/**` 下补 Cloudflare DNS 管理脚本
 26- 把当前公网域名与内网 Tailscale `100.x` 的关系写成可执行模板
 27- 补 Nginx 部署/校验辅助脚本或分发模板
 28- 收口 `docs/ops/**` 中的操作步骤
 29
 30## 本任务不包含
 31
 32- 实际修改线上 DNS 记录
 33- 实际重载线上 Nginx
 34- 修改 control-api-worker、conductor-daemon、status-api 代码
 35
 36## 建议起始文件
 37
 38- `ops/nginx/baa-conductor.conf`
 39- `ops/nginx/includes/*.conf`
 40- `docs/ops/README.md`
 41- `scripts/ops/`
 42
 43## 交付物
 44
 45- DNS 辅助脚本
 46- Nginx 校验/部署辅助脚本或模板
 47- 对应运维文档收口
 48
 49## 验收
 50
 51- 如果新增 shell 脚本:`bash -n scripts/ops/*.sh`
 52- `git diff --check`
 53- 文档与脚本中的域名 / Tailscale `100.x` 方案一致
 54
 55## 更新要求
 56
 57完成时更新 frontmatter 的:
 58
 59- `status`
 60- `base_ref`
 61- `updated_at`
 62
 63并补充下面这些内容:
 64
 65## files_changed
 66
 67- `coordination/tasks/T-022-ops-automation.md`
 68- `docs/ops/README.md`
 69- `ops/nginx/templates/baa-conductor.conf.template`
 70- `ops/nginx/templates/includes/direct-node-auth.conf.template`
 71- `scripts/ops/baa-conductor.env.example`
 72- `scripts/ops/cloudflare-dns-plan.mjs`
 73- `scripts/ops/cloudflare-dns-plan.sh`
 74- `scripts/ops/lib/ops-config.mjs`
 75- `scripts/ops/nginx-sync-plan.mjs`
 76- `scripts/ops/nginx-sync-plan.sh`
 77
 78## commands_run
 79
 80- `git worktree add /Users/george/code/baa-conductor-T022 -b feat/T-022-ops-automation 458d7cf`
 81- `npx --yes pnpm install`
 82- `chmod +x scripts/ops/*.sh scripts/ops/*.mjs`
 83- `bash -n scripts/ops/*.sh`
 84- `node --check scripts/ops/cloudflare-dns-plan.mjs`
 85- `node --check scripts/ops/nginx-sync-plan.mjs`
 86- `node --check scripts/ops/lib/ops-config.mjs`
 87- `scripts/ops/cloudflare-dns-plan.sh --env scripts/ops/baa-conductor.env.example`
 88- `scripts/ops/nginx-sync-plan.sh --env scripts/ops/baa-conductor.env.example --check-repo --bundle-dir .tmp/ops/baa-conductor-nginx`
 89- `git diff --check`
 90- `git commit -m "feat(ops): add nginx and cloudflare dns automation helpers"`
 91- `git push -u origin feat/T-022-ops-automation`
 92
 93## result
 94
 95- 新增 `scripts/ops/baa-conductor.env.example`,把公网域名、VPS 公网 IP、Tailscale `100.x` 回源和 Nginx 安装路径收口到一份可执行 inventory 模板
 96- 新增 `scripts/ops/cloudflare-dns-plan.{mjs,sh}`,可渲染目标 DNS 记录、可选用 Cloudflare GET API 对比现网,并输出预览用的 `curl` shell 脚本,但默认不写线上 DNS
 97- 新增 `scripts/ops/nginx-sync-plan.{mjs,sh}``ops/nginx/templates/**`,可按 inventory 渲染 Nginx 配置、检查仓库默认配置是否漂移,并打出包含 `deploy-on-vps.sh` 的部署 bundle
 98- `docs/ops/README.md` 已改为 inventory 驱动的运维流程说明,覆盖 DNS 计划、Nginx bundle、VPS 分发、证书与验证步骤
 99
100## risks
101
102- 本次没有连接真实 Cloudflare zone;`--fetch-current` 和预览 shell 仍需在填入真实 Zone ID / token 后做一次人工核对
103- 本次没有在真实 VPS 上执行 `deploy-on-vps.sh`、`nginx -t` 或 `systemctl reload nginx`;证书路径、权限和 systemd 服务名仍需线上确认
104- 真实 inventory 预计放在仓库外,若运维人员绕开 inventory 手工改 Nginx 或 DNS,模板与线上状态仍可能漂移
105
106## next_handoff
107
108- 在仓库外复制并填写 `scripts/ops/baa-conductor.env.example`,补上真实 VPS 公网 IP、Cloudflare Zone ID 与证书路径
109- 导出 `CLOUDFLARE_API_TOKEN` 后运行 `scripts/ops/cloudflare-dns-plan.sh --fetch-current --emit-shell ...`,审阅差异和预览脚本
110- 运行 `scripts/ops/nginx-sync-plan.sh --env <real-env> --bundle-dir <dir>`,把 bundle 分发到 VPS,先执行 `sudo ./deploy-on-vps.sh`,确认 `nginx -t` 后再显式执行 `sudo ./deploy-on-vps.sh --reload`
111
112开始时建议直接把 `status` 改为 `in_progress`113
114做完并推送后:
115
116- 如果等待整合,改为 `review`
117- 如果确认结束,改为 `done`