Repository navigation
v1.10.0:渠道账号按钮、探测进度、macOS sing-box、Docker 无头(#126 #117 #127 #79) - #129
Merged
Merged
Conversation
面板改版时把 Qoder / CodeArts / WorkBuddy 的账号卡搬进了渠道弹窗
(.chan-pane[data-chan=…]),但三个绑定函数还留着旧守卫:
const card = $("#ca-card");
if(!card || card.dataset.bound) return;
这三个 id 在 index.html 里早已不存在,守卫恒为假,于是整块 handler 一次都没
绑定过——退出登录 / 优先使用 / 停用 / 授权登录都渲染得出来,点了没反应,只有
Zen 车道的滑块(走 paintLanePane 的委托绑定)正常。
改为指向真实常驻的账号池容器:#qoder-pool / #ca-body / #wb-accounts。
同场加一条静态防线 panel_ids_test.go:脚本里每个 $("#id") 必须在同一份 HTML
里有对应的 id="…" 声明,否则测试红。这类「守卫永远为假」的错误对直接驱动
handler 的测试不可见,只能静态比对。
一轮「重新探测」是几十次上游调用、能跑好几分钟,而面板的全部反馈只是一个 在转的按钮——用户分不清「在跑」和「卡住」。 Lane 记 probeDone / probeTotal:分母在轮次开始时和模型列表一起固定(Kilo 行 从名单就能判定、不出网,所以不计入分母),每测完一个 +1,轮次结束统一归零。 /admin/api/state 输出这两个数,面板工具栏显示「已探测 12/35 · 正在测 xxx」, 按钮同时变「探测中…」。 模型的刷新签名带上这两个数,否则 1s 轮询按「输入没变就不重画」跳过,进度条 会永远停在第一格。
#123 里真正缺的是一件事:模型探不到、但手动点名调用能用的那些,用户得有个 办法把 id 拿走粘进别的 Agent。卡片和列表行的操作区各加一个「复制 id」,复用 面板已有的 data-copy 委托,不新增绑定。
下载器把三处平台判断都写死成 Windows:资产名 windows-amd64.zip、归档里的 sing-box.exe、可执行文件落点 <home>/bin/sing-box.exe。而 SagerNet 只给 Windows 发 zip、其余平台发 tar.gz——于是 macOS 上「下载 sing-box」必然失败,且一个手动 装好的二进制也从来不会被找到,因为 BinaryPath 只探 exe 那个名字。 新增 singbox.go 把平台判断收成一张表,三处共用: - 资产后缀:windows → -<os>-<arch>.zip,其余 → -<os>-<arch>.tar.gz - 归档解压:zip 与 tar.gz 两条路径,按资产名判断格式,都支持归档内的嵌套目录 - 落点:只有 Windows 带 .exe 解压走 tmp → rename,避免半拷贝的二进制被下一次健康检查当成坏安装。 设置页文案从「sing-box.exe 路径」改为「sing-box 路径」,并说明 macOS 可以直接 填本机已装的可执行文件。
此前的「无头」只是运行时不开窗口:二进制仍然链着 GTK / WebView2 / appindicator,CGO_ENABLED=0 交叉编译直接失败(systray.go: undefined: nativeLoop),所以容器里根本起不来,PR #108 那份 Dockerfile 也就落不了地。 窗口与托盘的每个平台文件加上 && !headless,新增两处 headless 空实现; main.go 的启动日志标出这是无头构建,容器运维一眼能看出拉到的是哪个二进制。 新增 Dockerfile / docker-compose.yml / .github/workflows/headless.yml: - 镜像多阶段构建,tag headless + CGO_ENABLED=0,alpine 运行层带 HEALTHCHECK 打 /healthz - compose 只映射 8787 与 /data 卷;面板仍是 loopback-only - CI 每次 PR 跑 linux/darwin/windows 五个目标的交叉编译矩阵并 docker build 一次, GUI 构建仍留在 release.yml 实测:五个目标 CGO_ENABLED=0 全部编译通过;无头二进制起来后 GET /healthz → {"ok":true,"service":"zen-gate"},/admin/api/state 正常返回。
headless 标签把窗口与托盘整块编译出去,所以容器与 NAS 里能直接跑。README 补上 三种用法(docker compose / docker build / 裸 CGO_ENABLED=0 交叉编译)、数据卷与 端口,以及「面板仍是 loopback-only,映射出去的是 /v1」这件事,免得有人以为 端口一开就能从外面进管理页。
公告窗口沿用仓库既定的滚动长度:加一条、掉最旧一条(10-06 那条 v1.3.6 已过 34 条窗口)。
This was referenced Nov 2, 2026
Closed
Open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
这一版修什么
三个「点了没反应 / 装了没生效」的手感问题,外加一个新的部署方式。
1. 渠道账号按钮点了没反应(#126)
面板改版时账号卡搬进了渠道弹窗
.chan-pane[data-chan=…],但三个绑定函数还拿已经删掉的旧卡片 id 当守卫:于是「退出登录 / 优先使用 / 停用 / 授权登录」渲染得出来、点了没反应。守卫改为真实常驻的账号池容器(
#qoder-pool/#ca-body/#wb-accounts)。同场加静态防线
panel_ids_test.go:脚本里每个$("#id")必须在同一份 HTML 里声明过,否则go test直接红。这类「守卫永远为假」的错误对直接驱动 handler 的测试不可见,只能静态比对。2. 全量探测有了进度(#117)
Lane记probeDone / probeTotal:分母在轮次开始时与模型列表一起固定(Kilo 行不出网,不计入),每测完一个 +1,结束归零。/admin/api/state输出这两个数,面板显示「已探测 12/35 · 正在测 xxx」。刷新签名带上它们,否则 1s 轮询会按「输入没变」跳过重画。3. macOS 也能一键装 sing-box(#127)
下载器三处写死 Windows:资产名
windows-amd64.zip、归档里的sing-box.exe、落点<home>/bin/sing-box.exe。SagerNet 只给 Windows 发 zip,其余平台发tar.gz—— 所以 macOS 上必然失败,手动装好的二进制也永远找不到。新增
singbox.go把平台判断收成一张表(资产后缀 / 归档格式 / 可执行名),三处共用;zip 与 tar.gz 都支持归档内嵌套目录;落盘走 tmp → rename。设置页文案同步改为「sing-box 路径」。4. Docker 与无头部署(#79)
PR #108 的「无头」只是运行时不开窗口:二进制仍链着 GTK / WebView2 / appindicator,
CGO_ENABLED=0交叉编译直接失败(systray.go: undefined: nativeLoop),容器里起不来。这里把窗口与托盘的每个平台文件加上
&& !headless,新增两处空实现,GUI 依赖整块编译出去;附 Dockerfile / docker-compose.yml / CI 交叉编译矩阵。实测:
linux/amd64、linux/arm64、darwin/amd64、darwin/arm64、windows/amd64五个目标CGO_ENABLED=0全部通过;无头二进制起来后GET /healthz → {"ok":true,"service":"zen-gate"},/admin/api/state正常返回probeDone/probeTotal。5. 顺手:模型 id 一键复制(#123 的实际诉求)
卡片与列表行操作区各加「复制 id」,复用已有
data-copy委托。验证
go vet ./...go vet -tags headless ./...go test -count=1 ./...同场
announcements.json加 v1.10.0 公告(滚动窗口:加一条、掉最旧一条)0ae4c0b落地);PR feat: 无头模式 + /healthz + Docker 部署 (#79) #108 只需保留 Docker 部分,现在已由本 PR 完成