Skip to content

fobe 0.1.8

Choose a tag to compare

@fonlan fonlan released this 19 Sep 07:03
· 32 commits to main since this release

fobe 0.1.8

自 v0.1.7 以来的 8 个提交:通知文案改人读版面并支持语言/时区、审计日志改标准页码分页、面板从 WS 连接源地址观测 NAT 探针的真实公网 IP、详情页新增 sing-box 状态卡与全量入站表格;另有订阅协议列、设置页版面重排与手机终端回看历史修复。

通知文案与语言/时区(design §15)

  • 文本消息改人读版面:Telegram 与飞书共用的 notify.MessageText 不再是「kind slug + RFC3339 + 原始 JSON」,改成 emoji 严重度 + 人类可读标题(node_offline🔴 fobe · Probe offline,恢复态带 (recovered),测试消息 🔔 fobe · Test notification),下面接逐条人读字段:字节转 KB/MB/GB、时间转 YYYY-MM-DD HH:MM:SS <时区>mode/direction 转 Inbound/Outbound、集群告警的 nodes 最多列 8 台后收成 +N more。未知 kind 与未知字段仍原样列出(新告警类型不会静默消失)。
  • 新增 notify.languagezh-CN/en-US,缺省 en-US)与 notify.timezone(IANA 名,缺省 UTC),在「设置 → 通知」里切换。两者都按每次投递惰性读取,改完下一条告警即生效、不用重启;写入严格校验(未知语言 → bad_notify_language、解析不了的时区 → bad_timezone),§17 导入同样丢弃这两类值——静默存下一个解不开的时区,看上去就像「已经设置好了」。投递侧读不出来时回落 UTC,绝不因为一个时区值挡住告警。
  • 线上契约未动:通用 Webhook 的 JSON 线格式与 alerts.payload 的存法一字未改(那是给机器读的),面板告警页仍按 kind_* 文案显示。

审计日志标准分页(design §4.4/§16)

  • 审计页此前只拉最新 200 条,更早的记录在面板上没有任何入口。现在做标准页码分页:默认每页 20 条,底部下拉可切 20/50/100/200(记在 localStorage),并给出总数、「第 x / y 页」、首/中/末页码按钮与「跳至第 N 页」;GET /api/audit?limit=&page= 返回 {entries, total, page, limit},越界页码在服务端收敛到最后一页并在响应里回显实际页(否则改小每页条数后手里的页码会指向空表)。
  • 代价说清楚:页码与跳页必须有 COUNT(*) + OFFSET,而这张表从不清理——行数越多计数与深翻越慢,且窗口不稳(审计行随时在追加,翻页时可能重复或漏掉一两行)。keyset 游标能消掉后者但给不出页码与跳页,「标准分页」这个交互本身就标着这个价码。

探针真实公网 IP 观测(design §14)

  • 阿里云等云厂商的公网 IP 是网关侧 NAT,网卡上只有 VPC 私网地址,agent 只枚举网卡所以永远报不出公网地址。现在改用面板已经看到的那条路:/ws/agent 升级时经 XFF 信任链解析连接源地址,当且仅当探针上报集里没有任何公网地址时,把该地址以 scope=public 并入 node_ips 并作为主 IP 指认的候选。
  • 三条边界:私网/CGNAT 源地址不并入(不当公网冒充);探针一旦自己报出公网地址即恢复「上报集全归 agent 所有」,观测行随本次全量上报退场;手动主 IP 照旧优先(指认前查 manual_primary,查询失败按「可能有钉」保守处理)。
  • 顺带收益:GeoIP 国旗对纯 NAT 探针也能自动命中了;重指认守卫同时放宽一条——存储的主 IP 仍在上报集内但不是当前候选、且无手动钉时也重指,不再保留被旧版写偏的值。无 wire 变更,观测行只活在服务端库里。

详情页(design §16)

  • sing-box 运行状态卡片:sing-box 已启用时在基本信息网格里多一张状态卡(未安装/安装中/运行中/异常/已回滚),last_error 作副标题,异常与回滚在详情页一眼可见;版本号从「AnyTLS 端口」卡片移到这张卡。
  • 全量入站表格:列出探针 config.json 里全部监听(多个 anytls、vless/socks 混合、one-sing.sh 接管的入站一视同仁),不再是「只显示面板托管的那一个端口」;数据源 node_singbox_inbounds,只含 port/type/tag/status、无凭据,旧 agent 未上报过 config 时整卡不渲染。
  • 延迟卡片上移到「近 7 天指标」之前,且只在节点勾选了延迟目标时渲染——没开启测量的节点不再收到一张指向「去新建目标」的空卡片。
  • AnyTLS 端口卡片删除:入站表格就位后它没有存在价值(表格已把每个监听一行行列全),node_singbox.port 列本身不动(卸载/重装回圈与订阅兜底仍读它)。入站表格按「参考资料」定位沉到页面最底部。
  • 详情页头部新增「编辑」按钮直达 /settings/servers/{id};概览卡片 IP 加一键复制(与设置→服务器列表同款交互)。

订阅(design §10.2)

  • GET /api/subscriptions/{id}/entries 每行新增 protocols(该入口渲染成的线上协议 anytls/vless/…),订阅入口列表因此多一列协议。口径取自探针上报的 config.json(正在运行的配置是唯一准绳,不读管理态列):直连行 = 该端口入站的 type,中转行恒为 anytls,文件未上报时由管理态端口+证书对兜底;该行标 inbound_goneprotocols 为空——运行中的配置已经不给答案了,面板不猜

面板与终端

  • 基础设置页轻卡片两两成对改田字布局,黑名单与会话两块合并进同一张安全卡(§16)。
  • 手机触摸滚动终端回看历史(§11):xterm 6 起 .xterm-viewport 成了空盒子、滚动由 JS 做,手机上没有任何可被浏览器 pan 的滚动盒,手指一拖就整页翻、历史永远回不去。现在由 terminalTouchScroll.ts 把单指竖直拖动按实测行高换算成 scrollLines()(松手带衰减惯性),且只在缓冲区该方向真能滚时才接管手势(两端把拖动还给页面),只认单指——不用 touch-action: none 一刀切,那会连页面一起锁死。

升级注意

  • 无数据库 schema 变更(仍为 15,schema.sql 本次未动);无 wire 变更internal/protocol 未动),旧版 agent 无需重装即可继续工作。
  • 镜像只发 linux/amd64;探针按 §5.5 跟随服务端版本,本次会自更新一次(短暂掉线属预期)。
  • 通知的时区渲染依赖镜像自带 tzdatadeploy/Dockerfile.server 已装);不用容器部署时需保证宿主机有 tzdata,否则解析不到的时区会被拒写。
  • 唯一必填环境变量仍为无(compose 默认拉 ghcr.io/fonlan/fobe)。