gitea Actions self-hosted runner · 注册地址统一 https://git.51yanmei.com · 复用 pangolin 私有分流(private-split)达成家/外无感 · 2026-09-07
act_runner 现在能直接连域名,relay 淘汰。runner 一律注册到域名 https://git.51yanmei.com;git.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。同一个域名、同一份配置,家/外自动切换。
com.pangolin.pangolin.PacketTunnel 系统扩展 + pangolin_vpn.app 在跑;无 Shadowrocket。GET https://git.51yanmei.com/ 与 /api/v1/version 均 HTTP 200(解析 182.92.213.171,~1.8s,走隧道→pangolin1→ali→frp→NAS)。relay 已不再必要。/etc/pangolin/server.env 第 31 行 PANGOLIN_PRIVATE_SPLIT_DOMAINS=nas,git,win,brain.51yanmei.com。零改动/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),任意来源可达。git.51yanmei.com 都得 182.92.213.171;群晖 DNS Server 套件未安装(/var/packages/DNSServer 不存在)。baize domains.yaml 里 nas/win/git 的「家内覆盖 192.168.3.200 待做」正是此项。可行性已判定→支持(见 §6)。0.0.0.0:443(DSM nginx),需加 git.51yanmei.com→gitea:3000 的反代 + 证书。局域网直达 https://git.51yanmei.com(=192.168.3.200:443)必须它成立。可行性已判定→支持,证书需 DNS-01/同步(见 §6)。nas)、注册到直连公网域名(Shadowrocket 时代坏);jiu 的 mac-runner(id=3)仓库级、经 relay。均待收口成一个用户级 mac runner 走域名。两条腿只有 DNS 解析结果不同驱动分叉:家内被 dns-system 解成私网 IP → 先命中 route 里更靠前的「LAN 直连」;在外解成公网锚点 → 落到「私有域名 → auto(隧道)」。runner 侧完全不感知,永远只认 https://git.51yanmei.com。
核心在 server/internal/httpapi/clientconfig.go,PANGOLIN_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 只是复用它,无新代码。
| # | 工作项 | 动谁 | 状态 |
|---|---|---|---|
| W1 | pangolin 把 git 纳入 private-split | pangolin1 server.env | 已完成 |
| W2 | ali 外网入口(git nginx 443→frp→NAS,开放) | ali | 已就绪 |
| W3 | 家内分光 DNS:git/nas/win → 192.168.3.200 / .88 | NAS(群晖 DNS Server)+ | 已完成 2026-09-07(改法,见 §8) |
| W4 | NAS 443 TLS 反代 git → gitea:3000(+证书) | NAS(DSM 反向代理 + 导入 ali LE 证书) | 已完成 2026-09-07 |
| W5 | runner 收口:1 个用户级 mac runner 走域名;退役 id=3;删 relay | dev mac(launchd)+ gitea | 已完成 2026-09-07 |
| W6 | 验证 + 回写 baize 台账 | — | 待做 |
降级路径(若暂不做 W3/W4):runner 现在就能改注册到域名并删 relay(W5 单独可行)——在家会走「隧道→pangolin1→ali→NAS」的回环路径(实测 ~1.8s/请求,能用但慢)。W3+W4 是把在家这条腿从「回环」优化成「局域网直达(~ms)」,即你要的「局域网域名直接解析成局域网地址」。建议:W5 先落地拿掉 relay,W3/W4 作为随后的直连优化。
目标:局域网内解析 git/nas/win.51yanmei.com → 私网 IP;其余照常公网。方案(二选一):
51yanmei.com(或用「解析区域 + A 记录覆盖」)→ 加 A:git 192.168.3.200、nas 192.168.3.200、win 192.168.3.88;开启 forwarders 把其余查询转公网(223.5.5.5)。DHCP 下发 DNS 指向 NAS——好消息:NAS 本身就是 LAN 的 DHCP 服务器(DhcpServer 套件已装、引擎 dnsmasq、段 .10–.230),在 DSM DHCP 设置里把下发 DNS 改成 192.168.3.200 即可,无需碰路由器。git→192.168.3.200 rewrite,DHCP 下发指向它。免装 DSM DNS Server 套件。注意:装 DNS Server / 改 DHCP 下发 = 机器与网络改动,按规矩先经你确认再动。dns-system(type=local)吃的是 OS resolver → DHCP 下发的 DNS,所以 DHCP 那一步不可省(NAS 既是 DHCP 服务器,这步在 DSM 内完成)。
局域网直达 https://git.51yanmei.com 即打到 192.168.3.200:443,须 NAS 在 443 用 git.51yanmei.com 有效证书反代到 gitea:3000。步骤:
git.51yanmei.com 条目;sudo ss -tlnp | grep :443 看谁占 443。git.51yanmei.com:443 → localhost:3000,勾 HTTP/2、WebSocket;client_max_body_size 0 等价项在 DSM 里放开大包(git push)。git.51yanmei.com 配 LE 证书。家内无 80 端口暴露→用 DNS-01(阿里云 DNS,AK 在 Bitwarden「ali dev」),或从 ali /etc/letsencrypt/live/git.51yanmei.com/ 定期同步导入。绑到反代条目。gitea 的 ROOT_URL 已是 https://git.51yanmei.com(外网就这么跑),Host 头一致,反代到 3000 无需改 gitea。
act_runner 的标签在首次注册即固定,改配置不重注册无效——所以必须重注册。目标态:一个用户级 mac runner。
instance = https://git.51yanmei.com(域名,不是 127.0.0.1:13000,不是 IP),labels mac,self-hosted,macos,name mac。com.yanmei.act-runner(用户级常驻,配置目录 ~/.act_runner_mac_config.yaml);卸载 com.pangolin.act-runner(mac-pangolin-2) 与 com.jiu.act-runner。com.jiu.act-runner 的 start 脚本里附带拉起 ~/bin/tcp_relay.py——runner 走域名后 relay 无用,随该 launchd 一并退休(脚本、plist、13000 监听全清)。mac;如 jiu workflow 用 runs-on: mac 直接兼容,否则补标签)。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 删除。
比预想更简单——无需重注册、无需注册 token:mac-pangolin-2(id=7)本就是用户级、start 脚本本就指向域名,唯一 bug 是 label 错成 nas。根因是当年 Shadowrocket 掐断连接 → act_runner 的 Declare(labels) 从没上报成功。换 pangolin 后连通,做法:
~/.act_runner_pangolin2_config.yaml 的 labels: nas:host → mac:host。launchctl kickstart -k gui/501/com.pangolin.act-runner 重启 → 日志 declare successfully, labels:[mac],并立即接走 pangolin 队列 task 2299。launchctl bootout com.jiu.act-runner+watchdog(连带杀 relay)→ plist 改名 .disabled → repo API 删 id=3(DELETE …/repos/wangjia/jiu/actions/runners/3 = 204)。~/bin/tcp_relay.py / jiu start 脚本 / jiu config 均 .retired;:13000 已释放。现状:单一用户级 mac runner(id=7,com.pangolin.act-runner,label mac,域名直连、无 relay),服务全部 wangjia 仓。回写 baize ci_runners(commit 4b7ffe1)。遗留(非阻塞):label 仍单 mac(可后加 self-hosted/macos);launchd 名仍带 pangolin(拟后续中性化 com.yanmei.act-runner)。在家目前走隧道回环(~1.8s),W3/W4 后转局域网直达。
W3 与 W4 是一对:只做 W3 不做 W4,家内会打到 192.168.3.200:443 但无有效 TLS → 失败;两者同批上。
# 在家(局域网)——应直达私网、无隧道回环 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 接走、跑绿。
「涉及 NAS 先判可行性,别做一半发现一般 nas 不支持」——判定结论:这台 DS925+ 不属于「不支持」的那类。它是 Plus x86 机(x86_64 / DSM 7.3.2),关键能力齐备。
| 能力 | 现状 | 判定 |
|---|---|---|
| NAS 是否 LAN DHCP 服务器 | DhcpServer 套件已装,引擎正是 dnsmasq(dnsmasq-2.x-virtual-dhcpserver),租约段 192.168.3.10–230 | ✅ DNS 下发掌握在自己手里,无需改路由器 |
| DNS Server(分光 A 记录) | 套件未装,但 DS925+/DSM7.3 catalog 支持;另 ContainerManager 已装可跑 AdGuard/dnsmasq 容器 | ✅ 两条路径(官方套件 / 容器)任选 |
| 443 TLS 反代 | 443 由 DSM nginx 持有;DSM Reverse Proxy 已在用(/usr/syno/etc/www/ReverseProxy.json 有条目);gitea 为 3000 上 native 进程(非容器) | ✅ 加一条 SNI vhost git→localhost:3000 即可 |
| 证书签发 | DSM 内置 LE 仅 HTTP-01,家里 git 的 :80 不对公网→一键签不了;acme.sh 未装 | ⚠ 唯一非默认项:走 acme.sh DNS-01(阿里云 DNS,AK 在 Bitwarden「ali dev」) 或同步 ali 已有 LE 证书(cron scp+DSM 导入,最省) |
判定:W3 + W4 均可行。唯一 caveat 是证书需 DNS-01 或同步(非 DSM 一键 LE),但两条路都成熟、不阻塞。DHCP 已由 NAS(dnsmasq) 承担、ContainerManager 与 Reverse Proxy 都在——不存在「一般 nas 不支持」的情形。
未证实项(需 sudo 才能读,不阻塞判定):ReverseProxy.json 具体条目、certificate 目录内容、DHCP 当前下发的 DNS 指向谁。落地时一并处理。
| 项 | 属于 | 需要你 |
|---|---|---|
| 用户级 runner 注册 token(网页 Create new Runner 取) | W5 | 提供 token |
| 装群晖 DNS Server + 改路由器 DHCP DNS | W3 | 确认动手(装套件+改网络) |
| NAS DSM 反向代理 + 证书(DNS-01 或同步 ali 证书) | W4 | 确认动手 / 或授权 sudo 让我先证实现状 |
卸载 com.jiu.act-runner / com.pangolin.act-runner、删 relay | W5 | 确认(会短暂影响 jiu CI,直到新 runner 接管) |
相关台账:~/code/baize/data/hosts.yaml ci_runners 段(relay_note、mac runner state)+ domains.yaml(nas/win/git「家内覆盖 待做」)。W3/W5 落地后回写。
curl https://git.51yanmei.com/api/v1/version 从 runner mac 经 pangolin:http=200 ip=192.168.3.200 time=0.025s,证书受信。runner 重启后 declare successfully、无 no such host。
git.51yanmei.com 条目从 HTTP:80 改 HTTPS:443,目的地仍 localhost:3000。/etc/letsencrypt/live/git.51yanmei.com/ 的 LE 证书(cert/privkey/chain)导入 DSM,绑到该反代服务。(我这边拉私钥被安全闸拦,改由用户在自己终端拉取 + DSM GUI 导入。)原计划「NAS 接管 DHCP、下发 .200 当 DNS」失败——根因:家里网关是 华为 Q2S 路由器,带防私接 DHCP,把 NAS(dnsmasq,绑 :67 正常)发出的 DHCP 应答全丢,客户端永远拿不到 NAS 租约(华为 DHCP 关掉后 mac 也 DISCOVER 不到 NAS→一度 No-IP,靠重开华为 DHCP 兜底恢复)。NAS 不是路由器、改不了这个。
改成的可行方案:
synopkg install_from_server DNSServer):给 git/nas/win.51yanmei.com 各建单主机主区(只对这三名字权威→私网 IP)+ named.options.user.conf 加 forwarders{223.5.5.5;119.29.29.29} 转发其余。故 pay/jiu/api 等兄弟子域照常公网。192.168.3.200(macOS 按网络记,出门用别的网 DNS、不受影响)。别的家里设备不动(它们不需要 git 覆盖)。NAS 的 DhcpServer 已停,华为继续当 DHCP。dig 通但 curl no-such-host)→ sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder;runner 再 launchctl kickstart -k 重启。已知/待办:① 只有 runner mac 走直达(本就够用,它才是 CI 需要的),非全网分光。② DNS=.200 仅设在家里 Wi-Fi;若 mac 换网上不了网就删这条。③ NAS DhcpServer 已 stop,如需永久别开机自启可在 DSM「DHCP Server」取消勾选。④ 台账真相源:baize domains.yaml『家内分光』note;NAS 详细運維归 ~/code/nas。
关联:私有服务 ACL 设计 · 私有服务 ACL 实现计划 · 控制面 TLS(Tunnel 前置) · ← 文档索引