fobe 0.1.8
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.language(zh-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_gone时protocols为空——运行中的配置已经不给答案了,面板不猜。
面板与终端
- 基础设置页轻卡片两两成对改田字布局,黑名单与会话两块合并进同一张安全卡(§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 跟随服务端版本,本次会自更新一次(短暂掉线属预期)。
- 通知的时区渲染依赖镜像自带
tzdata(deploy/Dockerfile.server已装);不用容器部署时需保证宿主机有 tzdata,否则解析不到的时区会被拒写。 - 唯一必填环境变量仍为无(compose 默认拉
ghcr.io/fonlan/fobe)。