fobe 0.1.5
fobe 0.1.5 — 修复版本:延迟测量改了目标即时生效(真机上「加了目标却永远不出折线」的两个根因)、btrfs 数据卷不再被误判 inode 耗尽而拒绝装 sing-box,外加四处窄屏与标签细节。
升级方式不变:
docker compose pull && docker compose up -d(或改image:钉ghcr.io/fonlan/fobe:0.1.5)。无 schema 变更(仍为 13);协议仅新增一个可选字段,旧 agent 忽略、向后兼容。
延迟测量:目标变更即时下发到在线探针(§13 修订 2026-09-17k)
根因有两层,修完第一层才看见第二层。
① 下发链路只挂在握手上:测量目标此前只随 hello_ack(WS 握手)下发,面板改完 latency_target_ids 后什么都不推——稳定长连接的探针要等下一次重连(可能永远不发生)才换目标列表。现在编辑保存后立即对该节点下发携带目标列表的 latency_config(hub.PushLatencyTargets,与 hello_ack 同源读 TargetsForNode,两个载体不会不一致);删除全局目标同样即时推给仍选中它的节点(先查 NodeIDsForLatencyTarget 再删,FK 级联会抹掉线索);离线探针由下次 hello_ack 兜底。字段语义:latency_config.targets 为 null(全局频率广播的形态)=目标不变,非 null 空数组=清空、真的停测——所以该字段不能加 omitempty,否则「清空」永远到不了 agent。旧 agent 忽略未知字段不受影响。
② 全丢包的目标在详情页"隐身":下发修好后真机仍然"没有新折线"——目标是防火墙拦 ICMP 的地址,107 个样本全部 icmp_ms=-1, loss=1,而前端对没有有效 RTT 点的目标不画线,于是「在测但全丢」与「根本没在测」在面板上无法区分。现在详情页对画不出线的目标显式标注:有样本标「全部丢包 · 目标无回应」(提示换 tcp 类型),无样本标「暂无样本 · 探针离线或尚未开始」。
新增测试:httpapi 假 agent e2e ×2(编辑推送 + 清空语义、删除推送)、agent 单测 ×1(null 不动 / 替换 / 清空三分支)。
agent:btrfs 数据卷不再被误判 inode 耗尽(§5.4 修订 2026-09-17e)
btrfs 等动态分配 inode 的文件系统 statfs 上报 f_files = f_ffree = 0(df -i 显示 0 0,是「无 inode 预算」而不是「用尽」),原判定把 8 GiB 空闲的 btrfs 数据卷判成 0 inode 可用而拒绝安装,面板报 insufficient disk space: 8375 MiB / 0 inodes free。
现在 statfsFree 一并返回总 inode 数:总数为 0 视为该文件系统不跟踪 inode、跳过 inode 半闸(字节闸不变),错误信息也不再展示无意义的 inode 数字;真实耗尽的 ext4/f2fs(总 inode > 0 且空闲 < 100)照旧拒绝。其余平台落回 fail-open stub。
界面细节
- 概览页到期标签按剩余天数分档配色(93bb5ba):≤7 天(含已逾期)红色提醒,>7 天绿色放行;分档判据就是剩余天数本身。
- sing-box 入站表状态列不再折行(88a1400):状态 chip 是 CJK 短词,auto 表格布局会把它压到单字宽折成两行;
td加nowrap,超出宽度交给.table-wrap横向滚动。390px 竖屏实测 chip 单行 56×22。 - 「表格即卡片」四页补上滚动容器(§16 修订 2026-09-17d):设置→服务器列表、审计日志、告警、延迟测量四页把卡片外观直接放在
<table>上,其overflow-x: auto从未生效(overflow 不适用于表格盒),宽行在 390px 竖屏下把表格顶到 min-content 宽(实测页面scrollWidth587 > 390)导致整页左右平移。现在卡片与滚动由外层.card.table-card接管,页面横向溢出归零、桌面端无滚动条;代价与前同——竖屏在卡片内横向滚动看最后一列。
升级注意
- 数据库 schema 无变化(13),从 0.1.2 / 0.1.3 / 0.1.4 均可直升。
- agent 本版有代码改动(空间闸门),版本号随服务端走:探针会按 §5.5 自更新一次(短暂掉线属预期;一两台探针可用
FOBE_AGENT_UPDATE_STAGGER=1s把错峰压成立即)。