v0.3.0 · MIT · 自托管

Topophany — 在终端中查看的自托管网络监控

从哪里出发,经由哪条路径,抵达了什么——依据又是什么。

自托管的网络与服务监控,在终端中查看。一个 Go 二进制文件,零依赖;检查没有通过,就不会变绿。

go install github.com/WhitenWhiten/topophany/cmd/topo@latest

01 终端界面

有没有出问题?在哪里?

topo preview 的录屏:真实的 TUI,合成的证据。

~ topo preview 回放 · 140×42
预览模式下 Topophany 终端界面的录像,可在下方按章节选择。

故障来了

按 x,DMIT 线路被中国大陆阻断。只有确认的失败才会变红。

1–9 章节 space 暂停。也可以自己运行 topo preview。

02 语义

证据,而非颜色

没有通过的检查,就不会变绿。没人监控的服务保持 unknown。

默认没有绿色

服务证据状态
●主站Cloudflare ⇢ S1http 200 · 4 秒前由 Cloudflare NRT 应答 · 缓存 DYNAMIC
○家庭面板仅有备注已登记,未监控未配置检查unknown
✖VLESS+Reality 入口DMIT · 洛杉矶tcp 超时 · 6 秒前来自 长沙 MacBook · 3 个样本中 3 个DOWN

健康的行保持安静。没有检查就是 unknown,而不是在线。

观测点是明确的

tcp 超时 ×3 http 200 · 182 ms 长沙 worker · MacBook 洛杉矶 DMIT 入口 纽约 worker · S1 结论 长沙出发的路径故障 · 服务器正常

从一个地方看到的失败,是那条路径的故障,而不是服务器宕机。

边缘作出了应答

访客
Cloudflare · NRT● HTTP 521 · 边缘在线
S1 源站▲ 受影响

CDN 的应答只能证明边缘;只有非缓存的响应才能证明源站。

推测就标为推测

✖ INCIDENTVLESS+Reality 入口DMIT · 洛杉矶

Failed checks
✖ m-exit-dmit-aaitr
Other-observer response evidence
● w-exit-s2-aaitr ● w-exit-s2-qqpr
Hypothesis (not a finding)
source/path-specific interference, filtering or routing fault is possible; blocking authority and untested protocols are not established

事件给出证据,此外的一切都标为假设。

03 架构

一个二进制,三种角色

topo 既是客户端,也是采集器和观测点。不需要 CGO、数据库或外部模块。

  • 个二进制文件客户端、采集器和 worker
  • 个外部 Go 模块只有标准库
  • 种发布构建Linux、macOS、Windows · amd64、arm64
  • 个标签页支持鼠标

两个采集器,不演共识的戏

worker 同时投递给两者,一方离线时先行缓冲。

从设计上就是只读的

没有远程配置 API,也没有远程 shell。拓扑是你审阅过的本地 JSON。

有上限,并且明说

配额用满时,探测报错停止,而不是丢弃证据。

04 探针

它能测量什么

原生探针、代理链,以及针对现有工具的只读适配器。

原生探针

L7
  • HTTP状态码、正文、头部、出口 IP
  • SSHbanner
  • DNSA, AAAA
L6
  • TLS证书校验
L4
  • TCP连接
  • UDPecho、随机 nonce
L3
  • ICMPIPv4

代理链

  • HTTP CONNECT
  • HTTPS CONNECT
  • SOCKS5远程 DNS
  • OpenSSH -W校验主机

只读适配器

  • Mihomo
  • Tailscale
  • WireGuard

边缘与平台

  • CloudflareWorkers, Pages
  • Vercel
  • Supabase

05 安装

一分钟上手

预编译归档,或者一条 go install。

go install github.com/WhitenWhiten/topophany/cmd/topo@latest

需要 Go 1.26.9 或更新版本。

  1. 四处看看

    内置演示。按 x 弄坏点什么。

    topo preview
  2. 启动采集器

    在 127.0.0.1:7447 上运行演示。

    topo init --dir ./demo topo serve --config ./demo/topology.json \ --auth ./demo/auth.json \ --data ./demo/collector-data \ --observer demo
  3. 打开 TUI

    在另一个终端里运行。

    topo --credentials ./demo/credentials.json