Spot Monitor

安装

接入节点

agent 只支持 Linux,x86_64 与 aarch64,systemd 与 OpenRC 都可以。二进制由 hub 转发(<hub>/agent/<arch>),机器能连上 hub 就能装,不需要能访问 GitHub。

单台安装

节点页点「添加节点」填一个名字,再点这一行的安装按钮(下载图标),复制弹窗里的命令:

curl -fsSL https://hub.example.com/install.sh | sh -s -- \
  --server https://hub.example.com --token <token>
bash

以 root 在被监控的机器上执行,几秒后节点在面板里上线。安装命令随时可以再打开,token 不是只显示一次。

软路由、PVE 宿主机这类转发流量的机器,装之前先看流量统计。

安装选项

弹窗里只有一项可调:

选项命令参数说明
上报间隔--interval <秒>1–3600,默认 1

弹窗每次打开都从默认的 1 开始,不会读回机器上正在用的值,所以重装要么在弹窗里填上原来的间隔,要么自己在命令里带 --interval。

想限制统计的网卡,agent 认 --iface 和 MONITOR_IFACE,但弹窗和安装脚本都没有这一项,要手工改配置文件,见流量统计。

批量安装

节点页点「批量添加」,开一个一小时的注册窗口,复制弹窗里的命令:

curl -fsSL https://hub.example.com/install.sh | sh -s -- \
  --server https://hub.example.com --register <key>
bash

窗口开着时,这条命令在任意机器上以 root 执行一次,那台机器就以自己的 hostname 出现在节点列表里,各自拿到各自的 token。命令里没有任何一台机器的凭证,所有机器共用同一条;弹窗里没有安装选项,这一批都按默认的 1 秒上报。

  • 一个窗口有效一小时,最多注册 100 台。过期或用满后开新窗口,复制新命令
  • 节点名取各台机器的 hostname,装完在面板上改
  • 重跑不会重复添加:机器上已有的 token 还指向同一个 hub 时,脚本直接沿用,窗口关了也一样
  • 节点在面板上删掉后,机器上的 token 已经作废,而脚本仍然沿用本地缓存、不会重新注册,那台机器会一直连不上:先删掉机器上的 /opt/monitor/agent.env,再在窗口开着时重跑,才会注册成一个新节点
  • 装好之后升级用安装命令重跑,不要再执行这一条:注册 key 是一次性的

发到每台机器

按你平时怎么登录这些机器来选:

  • 逐台粘贴:登上每台机器,粘贴,回车
  • SSH 客户端广播:不少 SSH 客户端能把一条命令同时发给选中的多台机器,菜单里常叫「批量执行」「发送到所有会话」「广播输入」,执行一次即可
  • 开机脚本:机器还没创建时,在服务商创建机器的页面把命令填进开机执行的脚本(「启动脚本」「User data」「cloud-init」等),第一行写 #!/bin/sh。个别机器开机时网络还没通、没有出现的,登上去再执行一次
  • 终端循环:见下文

登录用户不是 root 的,把 | sh 换成 | sudo sh。每台输出的最后一行以 monitor-agent installed 开头即成功,节点随即出现在节点页。

hub 同时最多转发 4 份二进制,超出的一律立刻返回 503,安装脚本不会重试,所以机器很多时要错开时间,或分批执行。

key 泄露的影响范围:窗口剩下的时间里最多新建 100 个节点,每个只能上报自己,读不到已有节点的数据,也改不了设置。关掉窗口,删掉多出来的节点即可,已装好的机器不受影响。

终端循环

在自己的电脑上用一个循环逐台登录执行。分三步:准备名单,设置免密登录(只做一次),执行。

1. 准备名单

新建文本文件 hosts.txt,一行一台机器的 IP 或域名,不留空行。已经装过的机器留在里面也没关系,脚本会沿用它的 token:

203.0.113.10
203.0.113.11
hk-01.example.com

放在用户主目录里(Windows 是 C:\Users\你的用户名,macOS 和 Linux 是 ~),新开的终端默认就在那里。Windows 用记事本保存时,注意文件名别变成 hosts.txt.txt。

2. 免密登录(只做一次)

把自己电脑的公钥放到每台机器上,每台输一次 root 密码。已经能用密钥登录的跳过这一步。

  • ssh-keygen 问 Overwrite (y/n)? 说明已经有密钥,回答 n
  • 第一次连某台机器会问 Are you sure you want to continue connecting,输入 yes
  • Windows 10、11 自带 ssh 和 ssh-keygen,在开始菜单里打开 PowerShell 即可

macOS / Linux:

# 还没有密钥的先生成一把,提问一路回车
ssh-keygen -t ed25519
# 把公钥放到名单里的每台机器上,每台问一次 root 密码
for h in $(cat hosts.txt); do ssh-copy-id "root@$h"; done
bash

Windows(PowerShell):

# 还没有密钥的先生成一把,提问一路回车
ssh-keygen -t ed25519
# 把公钥放到名单里的每台机器上,每台问一次 root 密码
foreach ($h in Get-Content hosts.txt) {
  Get-Content $HOME/.ssh/id_ed25519.pub |
    ssh "root@$h" "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
}
powershell

3. 执行

把要执行的命令填进去。批量安装用窗口里的 --register 命令;升级用另一条对全队通用的命令,见批量升级 agent。

macOS / Linux:

# 要在每台机器上执行的命令
cmd='curl -fsSL https://hub.example.com/install.sh | sh -s -- --server https://hub.example.com --register <key>'
# 逐台登录执行;某台失败时打一行「!! 地址 失败」,其余照常
for h in $(cat hosts.txt); do
  ssh -o BatchMode=yes "root@$h" "$cmd" || echo "!! $h 失败"
done
bash

Windows(PowerShell):

# 要在每台机器上执行的命令
$cmd = "curl -fsSL https://hub.example.com/install.sh | sh -s -- --server https://hub.example.com --register <key>"
# 逐台登录执行;某台失败时打一行「!! 地址 失败」,其余照常
foreach ($h in Get-Content hosts.txt) {
  ssh -o BatchMode=yes "root@$h" $cmd
  if ($LASTEXITCODE -ne 0) { Write-Host "!! $h 失败" }
}
powershell

循环一台接一台,每台几秒,一百台也就几分钟。登录用户不是 root 的:把 root@ 换成你的用户名,| sh 换成 | sudo sh;sudo 要输密码的,再在 ssh 后面加 -t,每台会问一次 sudo 密码。

会用 ansible 的可以并行执行,hosts.txt 直接当清单,-m raw 不要求目标机装 Python:

# 20 台一起装;连不上的标 UNREACHABLE,出错的标 FAILED
ansible all -i hosts.txt -u root -f 20 -m raw -a \
  'curl -fsSL https://hub.example.com/install.sh | sh -s -- --server https://hub.example.com --register <key>'
bash

并行度别开太高:hub 同时只转发 4 份二进制,超出的机器直接收到 503。

升级

agent 不自动更新。要升级在每台机器上执行一次升级命令:

curl -fsSL https://hub.example.com/install.sh | sh -s -- --upgrade
bash
  • 从这台机器自己的 /opt/monitor/agent.env 读 token 与 hub 地址,命令里没有任何凭证,所有机器共用同一条
  • 沿用已有的上报间隔与统计网卡;不会新建节点,也不消耗注册窗口
  • 已经是最新版的机器再执行一遍也没关系
  • 下载失败时机器照旧运行原来的版本;新版装上后起不来,自动换回原来的版本
  • 没装过 agent 的机器直接报错,并提示去面板取安装命令,不会变成新节点

这条命令同时发给很多台的做法(逐台粘贴、SSH 客户端广播、终端循环、ansible)见批量升级 agent;面板的更新页会列出还没升级的节点,并给出这条命令。

换发 token

打开节点的安装弹窗,在换发凭证一栏点「换发」。旧 token 立即失效,已经连着的 agent 会被断开,拿旧 token 重连时得到 401。只在 token 可能泄露时使用。

换发后用这个节点弹窗里的新命令重装。不要跑批量安装的命令:它认不出换发前的 token,会另建一个节点,原节点连同历史数据留在面板上一直显示离线。

报错对照

安装和升级执行的是同一个脚本,报错也相同:

输出里看到原因怎么办
unknown option: --iface安装脚本不认这个参数用 MONITOR_IFACE 改机器上的配置,见流量统计
the hub refused the registration key: the window may have closed,注册窗口已关闭或过期,key 不对,或者一个窗口已经注册满 100 台在面板上重新开窗口,复制新命令再执行
this machine is already registered; keeping its token不是报错:沿用本机已有的 token无
refusing plaintext http://hub 地址是 http://,而且不是回环地址换成 https://;确实没有 TLS 就在命令末尾加 --insecure
run as root登录用户不是 root把 | sh 换成 | sudo sh
this installer needs systemd or OpenRC机器上两种 init 都没有换一台,或先装 systemd / OpenRC
unsupported architecture: …不是 x86_64 或 aarch64没有对应的 agent 二进制
interval must be from 1 to 3600--interval 越界改成 1–3600
curl: (22) The requested URL returned error: 502hub 从 GitHub 下载 agent 失败面板设置页填 GitHub 代理,再重新执行
curl: (22) The requested URL returned error: 503同时下载的机器太多,超过 hub 的 4 份上限错开时间分批执行,脚本不会自动重试
curl: (6) Could not resolve host 等机器连不上 hub查域名解析、防火墙,或节点只有 IPv6 而 hub 没有 IPv6 入口

下载失败时脚本在停掉旧 agent 之前就退出:升级失败的机器照旧运行原来的版本,安装失败的机器也不会在面板上留下空节点(下载在注册之前)。

用 ICMP 监控的话:agent 以无特权的 monitor-agent 用户运行,ICMP 需要宿主机允许非特权回显(net.ipv4.ping_group_range)或给服务 CAP_NET_RAW,IPv6 的 ICMP 需要后者。建任务前可以先跑 monitor-agent --ping 1.1.1.1 确认。详见延迟与丢包。

在 GitHub 上修改这一页最后更新 2026-10-02