From f1e527918f17c83ad46b823220c747d4648269a5 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Mon, 7 Sep 2026 16:35:11 +0800 Subject: [PATCH] =?UTF-8?q?docs(ci):=20runner=20=E8=B5=B0=E5=9F=9F?= =?UTF-8?q?=E5=90=8D=E6=B3=A8=E5=86=8C=20+=20=E5=B1=80=E5=9F=9F=E7=BD=91/?= =?UTF-8?q?=E5=A4=96=E7=BD=91=E6=97=A0=E6=84=9F=E5=88=87=E6=8D=A2=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit daily 代理换成 pangolin 全局 TUN(对 Go 二进制透明,不再掐 act_runner 直连)→ relay 淘汰,runner 统一注册到域名 https://git.51yanmei.com。 git 已在 PANGOLIN_PRIVATE_SPLIT_DOMAINS,靠 dns-system 解析:在家局域网 DNS 覆盖→LAN 直连规则先命中直达 NAS;在外公网锚点→私有域名走隧道→ pangolin1 出口→ali frp→NAS。含 SVG 架构图、机制(clientconfig 三处 注入)、六 workstream、迁移顺序、验证清单、需确认的机器改动。登记进 docs/index.html 实现计划分类。 Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01FEVUXAbFT6bF1Qw27RHWoD --- docs/ci-runner-domain-registration-plan.html | 240 +++++++++++++++++++ docs/index.html | 5 + 2 files changed, 245 insertions(+) create mode 100644 docs/ci-runner-domain-registration-plan.html diff --git a/docs/ci-runner-domain-registration-plan.html b/docs/ci-runner-domain-registration-plan.html new file mode 100644 index 0000000..ef696c8 --- /dev/null +++ b/docs/ci-runner-domain-registration-plan.html @@ -0,0 +1,240 @@ + + + + + +CI Runner 走域名注册 + 局域网/外网无感切换 实现方案 + + + +
+ +

CI Runner 走域名注册 + 局域网/外网无感切换

+

gitea Actions self-hosted runner · 注册地址统一 https://git.51yanmei.com · 复用 pangolin 私有分流(private-split)达成家/外无感 · 2026-09-07

+ +
+一句话:daily 代理已从 Shadowrocket 换成 pangolin(全局 TUN)——TUN 抓所有二进制、不再像 Shadowrocket 的按 App SOCKS 那样掐断 Go 二进制,所以 act_runner 现在能直接连域名relay 淘汰。runner 一律注册到域名 https://git.51yanmei.comgit.51yanmei.com 早已在 pangolin 的 PANGOLIN_PRIVATE_SPLIT_DOMAINS 里,靠 dns-system(底层物理网络 DNS)解析 —— 在家局域网 DNS 覆盖成 192.168.3.200 → 命中「LAN 直连」规则直达 NAS;在外公网 DNS 返回 ali 锚点 182.92.213.171 → 命中「私有域名走隧道」→ 经 pangolin1 出口 → ali frp → NAS。同一个域名、同一份配置,家/外自动切换。 +
+ +
+

✅ 已就绪(本次实测确认,无需改动)

+
    +
  • pangolin 是当前活跃代理com.pangolin.pangolin.PacketTunnel 系统扩展 + pangolin_vpn.app 在跑;无 Shadowrocket。
  • +
  • 域名已可直连:从 runner mac 经 pangolin TUN,GET https://git.51yanmei.com//api/v1/versionHTTP 200(解析 182.92.213.171,~1.8s,走隧道→pangolin1→ali→frp→NAS)。relay 已不再必要。
  • +
  • pangolin 配置已含 git:pangolin1 /etc/pangolin/server.env 第 31 行 PANGOLIN_PRIVATE_SPLIT_DOMAINS=nas,git,win,brain.51yanmei.com零改动
  • +
  • ali 侧外网入口已就绪/etc/nginx/conf.d/git.conf = git.51yanmei.com 443(LE 证书) → proxy_pass 127.0.0.1:3000(frp→NAS),无 IP 白名单(不像 brain 限 103.119.13.48),任意来源可达。
  • +
+
+ +
+

❌ 差在「局域网直达」这条腿(本方案要补的)

+
    +
  • 无家内分光 DNS:全网(含在家)解析 git.51yanmei.com 都得 182.92.213.171;群晖 DNS Server 套件未安装/var/packages/DNSServer 不存在)。baize domains.yaml 里 nas/win/git 的「家内覆盖 192.168.3.200 待做」正是此项。
  • +
  • NAS 443 是否为 git 供 TLS 反代未证实:NAS 监听 0.0.0.0:443,但需 sudo 才能确认是否有 git.51yanmei.comgitea:3000 的反代 + 有效证书。局域网直达 https://git.51yanmei.com(=192.168.3.200:443)必须它成立。
  • +
  • runner 侧仍是旧的坏配置:mac-pangolin-2(gitea_id=7)标签错(nas)、注册到直连公网域名(Shadowrocket 时代坏);jiu 的 mac-runner(id=3)仓库级、经 relay。均待收口成一个用户级 mac runner 走域名
  • +
+
+ +

0 · 目标架构(一张图)

+
+ + + + + + + + + runner mac + act_runner + pangolin TUN + → git.51yanmei.com + + + + 私有分流判定 + DNS 劫持 → dns-system + (底层物理网络 DNS) + + + + 在家 · 局域网 + + 群晖 DNS Server + git → 192.168.3.200 + 命中「LAN 直连」规则 + + NAS 192.168.3.200 + :443 反代(LE证书) → gitea:3000 + 直达,无隧道 · ~ms + + + + + 在外 · 公网 + + 公网 DNS + git → 182.92.213.171 + 命中「私有域名走隧道」 + + pangolin1 + 隧道出口 + 103.119.13.48 + + ali nginx + :443 → frp + → NAS:3000 + + + + +
+

两条腿只有 DNS 解析结果不同驱动分叉:家内被 dns-system 解成私网 IP → 先命中 route 里更靠前的「LAN 直连」;在外解成公网锚点 → 落到「私有域名 → auto(隧道)」。runner 侧完全不感知,永远只认 https://git.51yanmei.com

+ +

1 · 为什么无感切换成立(机制,已在代码里且有测试)

+

核心在 server/internal/httpapi/clientconfig.goPANGOLIN_PRIVATE_SPLIT_DOMAINS 非空时注入三处,顺序即优先级

+ + + + + +
#位置作用
DNS server dns-system(type=local,line 370-373)私有域名不走公共 DNS(223.5.5.5/8.8.8.8),改用底层物理网络 DNS——在家=路由器/NAS 下发的局域网 DNS(含覆盖),在外=所在网络 DNS(公网记录)。
DNS rule {domain: 私有域名, server: dns-system}(line 383-385)把私有域名的解析定向到 ①。排在 geosite-cn 之前,优先级最高。
route rule {domain: 私有域名, outbound: auto}(line 239-242)+ 前置 LAN 直连 {ip_cidr:[10/8,172.16/12,192.168/16,127/8], outbound:direct}(line 230-233)在家:DNS 解出私网 IP → LAN 直连规则先命中(更靠前)→ 直达 NAS,不进隧道。在外:解出公网 IP → 落到私有域名规则 → auto(隧道) → pangolin1 出口。dns.reverse_mapping=true 补回域名元数据,使按 IP 发起的连接仍能命中该规则。
+

这正是 私有服务 ACL 设计 / 实现计划 已落地的家庭内网穿透机制(nas/win/brain 同款)。git 只是复用它,无新代码

+ +

2 · 分项实现(workstreams)

+ + + + + + + + +
#工作项动谁状态
W1pangolin 把 git 纳入 private-splitpangolin1 server.env已完成
W2ali 外网入口(git nginx 443→frp→NAS,开放)ali已就绪
W3家内分光 DNS:git/nas/win → 192.168.3.200 / .88NAS(装 DNS Server)+ 路由器 DHCP待做
W4NAS 443 TLS 反代 git → gitea:3000(+证书)NAS(DSM 反向代理)待证实/建
W5runner 收口:1 个用户级 mac runner 走域名;退役 id=7/id=3;删 relaydev mac(launchd)+ gitea待做
W6验证 + 回写 baize 台账待做
+ +
+

降级路径(若暂不做 W3/W4):runner 现在就能改注册到域名并删 relay(W5 单独可行)——在家会走「隧道→pangolin1→ali→NAS」的回环路径(实测 ~1.8s/请求,能用但慢)。W3+W4 是把在家这条腿从「回环」优化成「局域网直达(~ms)」,即你要的「局域网域名直接解析成局域网地址」。建议:W5 先落地拿掉 relay,W3/W4 作为随后的直连优化。

+
+ +

W3 · 家内分光 DNS 你确认/我执行

+

目标:局域网内解析 git/nas/win.51yanmei.com → 私网 IP;其余照常公网。方案(二选一):

+ +

注意:装 DNS Server / 改 DHCP = 机器与网络改动,按规矩先经你确认再动。dns-system(type=local)吃的是 OS resolver → 路由器 DHCP 下发的 DNS,所以 DHCP 那一步不可省。

+ +

W4 · NAS 443 为 git 供 TLS 反代 你确认/我执行

+

局域网直达 https://git.51yanmei.com 即打到 192.168.3.200:443,须 NAS 在 443 用 git.51yanmei.com 有效证书反代到 gitea:3000。步骤:

+
    +
  1. 证实现状(需 sudo,你在 NAS 上跑或授权我):看 DSM「控制面板 → 登录门户 → 高级 → 反向代理」是否已有 git.51yanmei.com 条目;sudo ss -tlnp | grep :443 看谁占 443。
  2. +
  3. :DSM 反向代理新建 git.51yanmei.com:443localhost:3000,勾 HTTP/2、WebSocket;client_max_body_size 0 等价项在 DSM 里放开大包(git push)。
  4. +
  5. 证书:DSM「安全性 → 证书」为 git.51yanmei.com 配 LE 证书。家内无 80 端口暴露→用 DNS-01(阿里云 DNS,AK 在 Bitwarden「ali dev」),或从 ali /etc/letsencrypt/live/git.51yanmei.com/ 定期同步导入。绑到反代条目。
  6. +
+

gitea 的 ROOT_URL 已是 https://git.51yanmei.com(外网就这么跑),Host 头一致,反代到 3000 无需改 gitea。

+ +

W5 · runner 收口到域名 + 删 relay 我执行(经你确认)

+

act_runner 的标签在首次注册即固定,改配置不重注册无效——所以必须重注册。目标态:一个用户级 mac runner

+
    +
  1. 取用户级注册 token:gitea 网页 头像 → Settings → Actions → Runners → Create new Runner(用户级 reg-token 的 API 端点本版本 404,只能网页取)。你提供
  2. +
  3. 注册新 runner:instance = https://git.51yanmei.com域名,不是 127.0.0.1:13000,不是 IP),labels mac,self-hosted,macos,name mac
  4. +
  5. launchd 收敛:新建 com.yanmei.act-runner(用户级常驻,配置目录 ~/.act_runner_mac_config.yaml);卸载 com.pangolin.act-runner(mac-pangolin-2) 与 com.jiu.act-runner
  6. +
  7. 删 relaycom.jiu.act-runner 的 start 脚本里附带拉起 ~/bin/tcp_relay.py——runner 走域名后 relay 无用,随该 launchd 一并退休(脚本、plist、13000 监听全清)。
  8. +
  9. gitea 退役旧 runner:删 mac-pangolin-2(id=7) 与 mac-runner(id=3)。jiu 仓的 job 由新用户级 mac runner 接管(标签 mac;如 jiu workflow 用 runs-on: mac 直接兼容,否则补标签)。
  10. +
+ +
+

⚠️ relay 到底还要不要(结论)

+

relay(tcp_relay.py 127.0.0.1:13000 → NAS 192.168.3.200:3000)当初只为绕开 Shadowrocket 拦 act_runner 这个 Go 二进制的直连(Python 进程不被 Shadowrocket 拦)。现在 daily 代理是 pangolin 全局 TUN,TUN 不做按-App 拦截、对 Go 二进制透明,实测域名直连 200 通。relay 已淘汰,随 W5 删除。

+
+ +

3 · 迁移顺序(依赖)

+
    +
  1. W5 先行(可独立):runner 改注册到域名 + 删 relay。此刻在家走回环(能跑绿),先把「多头 + relay + 坏标签」这堆乱账清掉。
  2. +
  3. W4:NAS 443 反代 + 证书(先证实、再补建)。
  4. +
  5. W3:家内分光 DNS + DHCP 指向 NAS。W3 生效后,家内解析即翻私网 IP,runner/所有设备访问 git/nas/win 自动走局域网直达。
  6. +
  7. W6:验证(见下)+ 回写 baize(DNS 覆盖落地、relay 退役、runner 台账更新)。
  8. +
+

W3 与 W4 是一对:只做 W3 不做 W4,家内会打到 192.168.3.200:443 但无有效 TLS → 失败;两者同批上。

+ +

4 · 验证清单(W6)

+
# 在家(局域网)——应直达私网、无隧道回环
+dig +short git.51yanmei.com            # 期望 192.168.3.200
+curl -sS -o /dev/null -w "%{remote_ip} %{time_total}\n" https://git.51yanmei.com/api/v1/version
+                                       # 期望 ip=192.168.3.200,time≈ms 级
+
+# 在外(手机热点/换网)——应回落公网锚点、经隧道
+dig +short git.51yanmei.com            # 期望 182.92.213.171
+curl ... /api/v1/version               # 200,ip=182.92.213.171
+
+# runner 状态
+launchctl list | grep act-runner       # 只剩 com.yanmei.act-runner
+lsof -i :13000                         # 空(relay 已死)
+
+

gitea 网页 Runners:只余 windows(id=8) / mac(新,用户级) / nas(id=2,实例级不动)。触发一次 pangolin build-macos 确认被 mac runner 接走、跑绿。

+ +

5 · 需要你拍板 / 提供的(机器改动,先确认再动)

+ + + + + + +
属于需要你
用户级 runner 注册 token(网页 Create new Runner 取)W5提供 token
装群晖 DNS Server + 改路由器 DHCP DNSW3确认动手(装套件+改网络)
NAS DSM 反向代理 + 证书(DNS-01 或同步 ali 证书)W4确认动手 / 或授权 sudo 让我先证实现状
卸载 com.jiu.act-runner / com.pangolin.act-runner、删 relayW5确认(会短暂影响 jiu CI,直到新 runner 接管)
+

相关台账:~/code/baize/data/hosts.yaml ci_runners 段(relay_note、mac runner state)+ domains.yaml(nas/win/git「家内覆盖 待做」)。W3/W5 落地后回写。

+ +
+

关联:私有服务 ACL 设计 · 私有服务 ACL 实现计划 · 控制面 TLS(Tunnel 前置) · ← 文档索引

+ +
+ + diff --git a/docs/index.html b/docs/index.html index fb7ba33..79d9511 100644 --- a/docs/index.html +++ b/docs/index.html @@ -146,6 +146,11 @@
阅读版;执行真相源 docs/superpowers/plans/2026-07-05-cicd.md(含 checkbox)。三期 11 任务:Phase1 基座+官网+服务端(无签名可立即上线,服务端固化 F3/F4 备份/迁移/回滚) → Phase2 Android(接 release keystore 签名,解锁下载链接) → Phase3 macOS 公证 dmg + Windows 安装包。runner 混合 nas/mac/windows;密钥已建(对齐 jiu)。设计见 cicd-design.html。
docs/cicd-plan.html · 真相源 docs/superpowers/plans/2026-07-05-cicd.md
+ +
CI Runner 走域名注册 + 局域网/外网无感切换 HTML
+
daily 代理已从 Shadowrocket 换成 pangolin 全局 TUN(对 Go 二进制透明,不再掐 act_runner 直连)→ relay 淘汰,runner 一律注册到域名 https://git.51yanmei.com。git 早在 PANGOLIN_PRIVATE_SPLIT_DOMAINS,靠 dns-system 解析:在家局域网 DNS 覆盖成 192.168.3.200 → LAN 直连规则先命中直达 NAS;在外公网锚点 182.92.213.171 → 私有域名走隧道 → pangolin1 出口 → ali frp → NAS。已就绪(pangolin配置/ali入口/域名实测200);待补 W3 家内分光 DNS(群晖 DNS Server+DHCP)+W4 NAS 443 TLS 反代+W5 runner 收口成一个用户级 mac runner 并删 relay。机制复用私有服务 ACL。
+
docs/ci-runner-domain-registration-plan.html
+
设备 & 会话管理 + 每设备流量归因 实现计划(P1–P6)HTML
阅读版;执行真相源为 docs/superpowers/plans/2026-06-29-device-session-management.md(含 checkbox)。P1 设备注册打通 → P2 sessions表+在线/最后登录 → P3 强制退出/清除 → P4 每设备流量 → P5 2FA信任(future) → P6 UI重做。