Skip to content

fobe 0.1.1

Choose a tag to compare

@fonlan fonlan released this 16 Sep 17:19
· 82 commits to main since this release

fobe 0.1.1 — sing-box 配置的所有权交还操作员,附一个 GeoIP 国旗修复。

升级方式不变:docker compose pull && docker compose up -d(或改 image:ghcr.io/fonlan/fobe:0.1.1)。数据库 schema 10 → 11,纯增量迁移,启动前自动快照。

sing-box:config.json 成为唯一真相(§9.3 实现修订 2026-09-17b)

上一版让 fobe「接管一次、之后整份重写」,代价落在操作员身上:他继续用 one-sing.shjq 加入站,下一次收敛(最多 60s)就把它抹掉。本版把这个代价去掉:

  • 探针盘上的 /etc/one-sing/config.json 是唯一真相:agent 每轮(60s + 启动 + 面板刷新命令)只读扫描,文件变了就上报原文;服务端解析后经 Cryptor 加密存档,不再按模板整份重写
  • 编辑 = 读-合并-写PUT /api/nodes/{id}/singbox/configreported_hash,对不上回 409 config_changed;只改被编辑的字段,未建模的选项(sniffpadding_scheme 等)原样保留,缺省凭据继承文件里的值。
  • 手工 jq 加的入站立刻可见:订阅直接按最近上报的文件渲染;新增 POST /api/nodes/{id}/singbox/refresh,不必等下一轮扫描。anytls 证书内容由 agent 按端口上报(文件里只写 certificate_path,客户端要的是 PEM)。
  • 面板:节点编辑页的入站表格可改端口 / tag / 凭据,可新增与删除;原「接管」退化成一次凭据留空的编辑(服务端写入面板自己的全局密码)。

sing-box:发现并接管 one-sing.sh 装好的实例(§9.3 实现修订 2026-09-17)

one-sing.sh 的探针在面板上一直是「未安装」——State.Singbox 只在声明过期望版本后才上报;而一点安装就整份重写配置,脚本加的 anytls / VLESS / SS / Socks 入站当场消失。

  • 识别:探针每轮只读扫描本机布局(二进制 / 配置 / 单元 / 进程),把 config.json 原文随 state 帧上报,不受期望状态开关限制;面板显示运行版本、入站与端口,凭据不出库(面板只拿摘要,快照加密落库)。
  • 接管 POST /api/nodes/{id}/singbox/adopt:脚本的 anytls 端口成为面板入站端口(用全局密码),其余入站作为 extra_inbounds 与模板一起下发;订阅为每台被接管节点展开多条出站,各用自己凭据,REALITY 公钥由私钥现场推导(crypto/ecdh);版本优先用探针正在跑的,缓存里没有则拒绝接管且不写任何东西。
  • 白名单是硬约束:只有 allowedInboundKeys / allowedTLSKeys / allowedRealityKeys 里的键能进 config.json —— 闸门①(sing-box check)是 live 探针上唯一的防线,真机上踩过两次服务级事故。

修复

  • 国旗真正跟随主 IP(§14 实现修订 2026-09-16b):国别判定原本只存在于「重新指认主 IP」那一个分支,于是 hello 路径从不解析国别(新探针一辈子一个灰点)、手动主 IP 只改地址不重算、「查不到就保留旧值」叠加成内网主 IP 留着上一个地址的旗子。现在 hello 与 state 共用一段逻辑,判定顺序 = 主 IP → 上报集里的公网地址(IPv4 优先);手动主 IP 与「清空国家」立刻重算。
  • 编辑页不再把自动识别的国别静默钉成手动:此前保存任何其它字段都会提交 country_code 并置 country_manual=1,自动识别就此失效。只在操作者真的动过国家输入框时才提交;已被钉住的节点在编辑页点「清空国家」即可恢复自动。

升级注意

  • 存量探针会自动跟随到 0.1.1(§5.5:两端注入同一个版本号,探针下载 → sha256 → 旁路自检 → 原地换入)。曾在 Detect() 误判期装过的探针(caps 报 systemd=false,fallback=true)必须人工重装一次才进入自动跟随,此后的版本都不用手动。
  • 镜像仍只发 linux/amd64(agent 产物与 sing-box 缓存按设计就是这个平台)。compose 里 image: ...:latest 若本地已有同名旧镜像不会自动拉,换版后先 docker compose pull

镜像

docker pull ghcr.io/fonlan/fobe:0.1.1

三个 tag 0.1.1 / v0.1.1 / latest 指向同一 manifest,仓库公开 ⇒ 匿名即可拉取。

自 v0.1.0 的完整变更

  • feat(singbox): 配置改为编辑器模型——探针的 config.json 是唯一真相,与 one-sing.sh 共存
  • feat(singbox): 发现并接管 one-sing.sh 装的本机 sing-box(入站 / 端口 / 凭据原样保留)
  • fix(geoip): 国旗真正跟随主 IP——hello 也判国别、内网主 IP 退回公网地址
  • chore(release): web 包版本号对齐 0.1.1

发布前本地预检全绿:gofmt(空)、go vet ./...go test ./...cd web && npm run build,以及本地 linux/amd64 镜像构建与容器烟测。