English | 简体中文
简洁的 Tailscale 节点监控看板
widget/— 桌面悬浮小组件 NodeWidget,内置控制面板后端。archive/— 存档:Python 版后端server.py、独立 AI 状态小卡片 AiWidget(不再维护,详见archive/README.md)。
- 概览统计:总数 / 在线 / 离线 / 出口节点 / 密钥即将过期 / 可升级。
- 节点卡片:状态、系统、版本、IP、标签、连接路径、延迟 + 延迟趋势折线图、rx/tx 流量。
- 节点详情弹窗:点卡片弹出——FQDN、IPv4/IPv6、归属用户、系统发行版、版本/更新、连接与延迟趋势、流量、最近握手、密钥过期倒计时、出口/子网路由(已启用 vs 待审批)、SSH、各 DERP 区域延迟。
- 运维预警:密钥 ≤7 天标黄、≤3 天标红;可升级节点打 update 角标;节点掉线/恢复/新增时右下角弹窗提示。
- 搜索 / 筛选:按主机名 / IP / 系统 / 标签搜索;全部 / 在线 / 离线 / 出口节点 快捷筛选。
- 多语言:工具栏右侧切换 English / 简体中文 / 日本語 / Deutsch / Français / Español 。
- 互访高亮:悬浮设备卡片时按 tailnet ACL 策略高亮可互通的设备——绿
⇄双向、琥珀→悬浮设备可访问它、蓝←它可访问悬浮设备。点卡片右下角的准星按钮进入聚焦:网格只留该设备与其相关设备(按 双向 → 出 → 入 排序);Esc / 聚焦栏 / 再点按钮退出。
| source | 条件 | 内容 |
|---|---|---|
live |
配置了 TS_API_KEY |
Admin API 设备列表 + 本机 tailscale status --json 叠加真实 direct/relay 路径 |
local |
无 API Key,但本机装了 tailscale 且已连接 | 仅用本机 tailscale status --json(有 direct/relay,无延迟数值) |
路径判定(来自本机视角):CurAddr 非空 → direct(显示对端端点);否则有 Relay → relay(显示 DERP 区域,如 via SIN);本机自身 → local。
无需浏览器的桌面常驻小窗,显示每个节点的基础信息(状态灯、主机名、IP、direct/relay、延迟 + 迷你延迟趋势线、离线时长)。直角窗口。
- 零依赖:C# + Windows 自带 .NET Framework 4.8 编译,
widget\build.cmd一键构建出单个NodeWidget.exe(~19KB,内存 ~35MB,空闲 CPU≈0) - 数据源自动降级:优先读仪表盘后端
/api/nodes;后端未运行时直接调tailscale status --json;都不可用显示离线 - 交互:左键拖动移动;右键菜单——总在最前 / 钉在桌面(常驻所有窗口之下、壁纸之上,二者互斥)/ 隐私模式(打码主机名和 IP)/ 语言(6 语,默认英语)/ 立即刷新 / 打开控制面板 / 退出
- 位置和开关记忆在 exe 旁的
widget.ini
cd widget
build.cmd # 编译
NodeWidget.exe # 运行
- 在 Tailscale 后台 生成一个 API access token(
tskey-api-...)。 - 复制配置模板并填入(Windows PowerShell):
编辑
Copy-Item .env.example .env.env,至少填TS_API_KEY(TS_TAILNET可留-)。 - 启动后端:运行
widget\NodeWidget.exe,右键菜单勾选「打开控制面板」(内置后端,绑定 127.0.0.1 仅本机访问)。 - 浏览器打开 http://localhost:8787。
| 变量 | 说明 | 默认 |
|---|---|---|
TS_API_KEY |
Tailscale API token,必填 | — |
TS_TAILNET |
Tailnet 名称,- 表示默认 |
- |
PORT |
监听端口 | 8787 |
TS_DETECT_EXIT |
检测出口节点(读取 advertisedRoutes,无额外请求) |
1 |
TS_CACHE_TTL |
/api/nodes 缓存秒数 |
5 |
TS_CA_BUNDLE |
自定义/企业根证书 PEM 路径(TLS 拦截代理环境用,仅 archive/server.py 支持) |
— |
TS_INSECURE |
1 关闭 TLS 校验,仅调试用(不安全) |
0 |
- 延迟:来自 Admin API 的
clientConnectivity(到 DERP 的延迟),无对应数据时显示—。local模式下无延迟数值。 - 连接方式:来自本机
tailscale status --json,是本机到该节点的路径视角(换一台机器运行结果会不同)。未接入本机 CLI 时显示n/a。 - online 判定:优先用
connectedToControl,其次online,兜底用lastSeen新鲜度(5 分钟内)。 - TLS 拦截环境:内置后端走 Windows 系统证书库,代理根证书装入系统后即可正常校验。
- 互访高亮:前端对 ACL 策略的简化求值(经后端
/api/acl代理获取,需TS_API_KEY;local模式下禁用)。支持*、用户邮箱、group:、tag:、autogroup:member/tagged/self、IPv4/CIDR、hosts别名;端口不参与判定(任一端口可达即算可访问)。不支持的选择器(角色类 autogroup、ipset:、posture、via)按不匹配处理——只会漏判,不会误判。
GET /api/nodes 返回:
{
"source": "live",
"tailnet": "your-org.ts.net",
"nodes": [
{
"host": "ts-gateway-01",
"os": "linux",
"ip": "100.64.0.1",
"status": "online",
"lastSeen": null,
"conn": null,
"latency": 8,
"tags": ["server", "exit-node"],
"exit": true,
"version": "1.78.1"
}
]
}source 可能为 live(真实数据)、local(仅本机 CLI)、error(未配置 Key 或 API 报错)。
