baa-conductor

git clone 

commit
7138a3e
parent
c5e007b
author
im_wower
date
2026-03-22 00:15:05 +0800 CST
Clarify public vs Tailscale internal routing
2 files changed,  +91, -10
M DESIGN.md
+86, -10
  1@@ -340,9 +340,20 @@ VPS 不持有 leader 真相。
  2 - Firefox 插件 -> 可见状态 badge
  3 - Firefox 插件 -> 如有需要,访问隐藏 `dispatch`
  4 
  5-## 6. 域名与二级域名布局
  6+## 6. 域名、二级域名与内网地址布局
  7 
  8-本节定义推荐的二级域名布局。
  9+本节定义推荐的双通道布局:
 10+
 11+- 公网流量走二级域名,经 VPS Nginx 转发
 12+- 内网与节点间流量直接走 Tailscale `100.x` 地址
 13+
 14+这里明确不依赖 MagicDNS 名称。
 15+
 16+原因:
 17+
 18+- 当前环境里 ClashX 会和 MagicDNS 产生 DNS 接管冲突
 19+- 即使 tailnet 已开启 MagicDNS,也不把 `*.ts.net` 作为生产配置依赖
 20+- 内网配置统一写死到 Tailscale IPv4 地址,避免本机 DNS 状态影响运行
 21 
 22 ## 6.1 必需的公网域名
 23 
 24@@ -381,23 +392,57 @@ VPS 不持有 leader 真相。
 25 
 26 名字可以不同,但设计上要求有一个稳定的、前置 D1 的 HTTP API 域名。
 27 
 28-## 6.2 现有域名
 29+## 6.2 必需的内网地址
 30+
 31+当前推荐直接使用这些 Tailscale 地址:
 32+
 33+- `mini` -> `100.71.210.78`
 34+- `mac` -> `100.112.239.13`
 35+- `racknerd-ff37952` -> `100.68.201.85`
 36+
 37+用途:
 38+
 39+- `mini <-> mac` 的节点间控制流量
 40+- conductor 到 peer conductor 的探活、状态读取、受保护节点 API
 41+- worker、status、运维脚本等内部调用
 42+- VPS Nginx 到 mini/mac 的 upstream 回源
 43+
 44+规则:
 45+
 46+- 生产配置中不写 `mini.tail0125d.ts.net`
 47+- 生产配置中不写 `mbp.tail0125d.ts.net`
 48+- 不要求业务机器开启 `accept-dns`
 49+- 只要求它们加入同一个 tailnet 且 `100.x` 地址可达
 50+
 51+如果未来 Tailscale 地址变化:
 52+
 53+- 先更新中央配置
 54+- 再更新 VPS Nginx upstream
 55+- 最后重载相关进程
 56+
 57+## 6.3 现有域名
 58 
 59 这些域名已经存在,继续沿用:
 60 
 61 - `led.makefile.so` -> `baa-hand`
 62 - `s.makefile.so` -> `baa-shell`
 63 
 64-## 6.3 推荐 DNS 策略
 65+## 6.4 推荐 DNS 策略
 66 
 67 - `conductor.makefile.so` -> VPS 公网 IP
 68 - `mini-conductor.makefile.so` -> VPS 公网 IP
 69 - `mac-conductor.makefile.so` -> VPS 公网 IP
 70 - `control-api.makefile.so` -> Cloudflare Worker 自定义域
 71 
 72-之后由 VPS 把节点专属域名再转发到 Tailscale 地址。
 73+之后由 VPS 把节点专属域名再转发到 Tailscale `100.x` 地址。
 74+
 75+额外说明:
 76 
 77-## 6.4 建议的 DNS 记录
 78+- 公网 DNS 不承载 tailnet 内部寻址
 79+- tailnet 内部寻址直接用 `100.x`
 80+- 不使用 MagicDNS 名称做回源或服务发现
 81+
 82+## 6.5 建议的 DNS 记录
 83 
 84 推荐 DNS 记录如下:
 85 
 86@@ -415,8 +460,9 @@ VPS 不持有 leader 真相。
 87 - 如果 VPS 走 Cloudflare 代理,所有相关 host 的代理模式要保持一致
 88 - `control-api.makefile.so` 最好留在 Cloudflare 内部,让 D1 访问保持本地化
 89 - mini 和 mac 不应该直接暴露在公网,节点专属域名仍然应该经过 VPS
 90+- tailnet 内部机器间调用不要再绕回这些公网域名
 91 
 92-## 6.5 TLS 策略
 93+## 6.6 TLS 策略
 94 
 95 推荐 TLS 模式:
 96 
 97@@ -448,6 +494,14 @@ VPS 上的 Nginx 提供:
 98 
 99 真实 leader 由 D1 lease 决定。
100 
101+它也不承载大部分内网控制流量。
102+
103+正确分工:
104+
105+- 浏览器、Claude 网页、管理页面 UI 走公网二级域名
106+- mini/mac 之间的内部控制流量直接走 Tailscale `100.x`
107+- VPS 只作为公网入口,不作为内网总线
108+
109 ## 7.2 Nginx Upstream 设计
110 
111 推荐 upstream:
112@@ -475,6 +529,8 @@ upstream mac_conductor_direct {
113 - `100.71.210.78` 是 `mini`
114 - `100.112.239.13` 是 `mac`
115 - `4317` 是 conductor 本地 HTTP 端口
116+- upstream 使用 Tailscale IPv4 地址,不使用 `*.ts.net` 名称
117+- 这样可以绕开 ClashX 与 MagicDNS 的 DNS 接管冲突
118 
119 ## 7.3 Nginx Server Block
120 
121@@ -574,9 +630,17 @@ mini 和 mac 不应该直接对公网开放 conductor 端口。
122 
123 推荐访问模型:
124 
125-- VPS 通过 Tailscale 或 WireGuard 访问 mini 和 mac
126-- 只有 VPS 去访问 conductor HTTP API
127-- 运维人员要访问 mini/mac 时,通过 SSH 或受保护的直连节点域名
128+- 浏览器、人类运维、Claude 网页、管理 UI -> 公网二级域名 -> VPS -> Tailscale upstream
129+- mini 和 mac 的 daemon / worker / 脚本 -> 直接访问 Tailscale `100.x`
130+- 只有需要公网暴露的入口才经过 VPS
131+- 运维人员要访问 mini/mac 时,可通过 SSH、Tailscale `100.x`,或受保护的直连节点域名
132+
133+内网建议:
134+
135+- `mini` 本机调用本机 conductor:`http://127.0.0.1:4317`
136+- `mini` 调 `mac`:`http://100.112.239.13:4317`
137+- `mac` 调 `mini`:`http://100.71.210.78:4317`
138+- VPS Nginx upstream 也直接写这两个 `100.x`
139 
140 ## 7.6 完整的 Nginx 模式
141 
142@@ -2119,7 +2183,10 @@ conductor 的示例参数:
143 BAA_CONDUCTOR_HOST=mini
144 BAA_CONDUCTOR_ROLE=primary
145 BAA_CONTROL_API_BASE=https://control-api.makefile.so
146+BAA_CONDUCTOR_PUBLIC_BASE=https://conductor.makefile.so
147 BAA_CONDUCTOR_LOCAL_API=http://127.0.0.1:4317
148+BAA_CONDUCTOR_PRIVATE_BASE=http://100.71.210.78:4317
149+BAA_CONDUCTOR_PEER_BASE=http://100.112.239.13:4317
150 BAA_RUNS_DIR=/Users/george/code/baa-conductor/runs
151 BAA_WORKTREES_DIR=/Users/george/code/baa-conductor/worktrees
152 BAA_LOGS_DIR=/Users/george/code/baa-conductor/logs
153@@ -2133,6 +2200,14 @@ mac 上至少需要不同的变量:
154 - `BAA_CONDUCTOR_HOST`
155 - `BAA_CONDUCTOR_ROLE`
156 - `BAA_NODE_ID`
157+- `BAA_CONDUCTOR_PRIVATE_BASE`
158+- `BAA_CONDUCTOR_PEER_BASE`
159+
160+说明:
161+
162+- `BAA_CONTROL_API_BASE` 仍然指向 Cloudflare Worker,自身不走 Tailscale
163+- 节点间与内网调用统一使用 `BAA_CONDUCTOR_PRIVATE_BASE` / `BAA_CONDUCTOR_PEER_BASE`
164+- 不要把 `mini.tail0125d.ts.net` 或 `mbp.tail0125d.ts.net` 写进运行配置
165 
166 ## 28. 安全模型
167 
168@@ -2219,6 +2294,7 @@ leader 应:
169 - 公网入口失效
170 - 公网域名无法再直接做运维操作
171 - 只要 mini 与 mac 还能访问 `control-api.makefile.so`,内部调度仍可继续
172+- 只要 tailnet 还通,运维仍可通过 Tailscale `100.x` 直达节点
173 
174 推荐处理:
175 
M ops/nginx/baa-conductor.conf
+5, -0
 1@@ -6,6 +6,9 @@
 2 # 说明:
 3 # - conductor.makefile.so 作为统一入口,走 mini 主、mac 备的 upstream
 4 # - mini-conductor.makefile.so 与 mac-conductor.makefile.so 直连单节点 upstream
 5+# - 所有 upstream 都直接写 Tailscale 100.x 地址
 6+# - 不使用 mini.tail0125d.ts.net / mbp.tail0125d.ts.net 等 MagicDNS 名称
 7+# - 这样可以避开 ClashX 与 MagicDNS 的 DNS 接管冲突
 8 # - 证书路径使用 Let's Encrypt 默认目录,若走 Cloudflare Origin Cert 请替换为实际文件路径
 9 
10 map $http_upgrade $connection_upgrade {
11@@ -14,7 +17,9 @@ map $http_upgrade $connection_upgrade {
12 }
13 
14 upstream conductor_primary {
15+    # mini 主节点,使用 Tailscale IPv4 私网地址回源
16     server 100.71.210.78:4317 max_fails=2 fail_timeout=5s;
17+    # mac 备用节点,使用 Tailscale IPv4 私网地址回源
18     server 100.112.239.13:4317 backup;
19     keepalive 32;
20 }