Skip to content

Latest commit

 

History

History
102 lines (80 loc) · 5.69 KB

File metadata and controls

102 lines (80 loc) · 5.69 KB

Tailscale Node Monitor

English | 简体中文

Tailscale Dashboard

简洁的 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(显示对端端点);否则有 Relayrelay(显示 DERP 区域,如 via SIN);本机自身 → local

桌面悬浮小组件(widget/)

无需浏览器的桌面常驻小窗,显示每个节点的基础信息(状态灯、主机名、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   # 运行

快速开始

接入数据

  1. Tailscale 后台 生成一个 API access tokentskey-api-...)。
  2. 复制配置模板并填入(Windows PowerShell):
     Copy-Item .env.example .env
    
    编辑 .env,至少填 TS_API_KEYTS_TAILNET 可留 -)。
  3. 启动后端:运行 widget\NodeWidget.exe,右键菜单勾选「打开控制面板」(内置后端,绑定 127.0.0.1 仅本机访问)。
  4. 浏览器打开 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_KEYlocal 模式下禁用)。支持 *、用户邮箱、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 报错)。