monitor

部署

接入节点

单台安装、批量注册,以及 agent 的全部参数。

agent 是一个静态链接的单文件,无运行时依赖,常驻内存几 MiB。它主动连 hub, 所以被监控的机器不需要开放任何端口

只支持 Linux,支持 systemd 和 OpenRC。不提供 Docker 镜像,理由见 Docker 部署

单台安装

在面板 节点 → 添加 填一个名字,然后点这个节点旁边的下载按钮,复制生成的命令:

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

以 root 在目标主机执行。装完几秒钟节点就会在面板里亮起来。

二进制由 hub 转发<hub>/agent/<arch>),节点不需要能连上 GitHub—— 能连上 hub 就能装,IPv6-only 或者出不去的机器也一样。

批量注册

机器多的时候不必一台一台添加。节点 → 批量添加开一个一小时的注册窗口, 期间下面这条命令在任意机器上跑一次,那台机器就带着自己的 hostname 出现在列表里,各自拿到各自的 token:

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

这条命令里没有任何一台机器的凭证,所以可以直接进 for 循环、ansible 或者开机脚本:

for h in node1 node2 node3; do
  ssh "$h" 'curl -fsSL https://hub.example.com/install.sh | sh -s -- \
    --server https://hub.example.com --register <key>'
done
bash

窗口到点自动失效,一个窗口最多注册 100 台。重跑同一条命令不会重复添加—— 机器上已经有 token 就直接沿用。

key 泄露的爆炸半径:在窗口剩下的时间里最多建 100 个节点,每个只能上报它自己那一个节点。 读不到任何已有节点的数据,改不了设置,碰不到面板。代价是面板里多出一批垃圾节点—— 关掉窗口,删掉它们,已经装好的机器不受影响。

安装脚本做的事

  • 识别 systemd 或 OpenRC,写对应的服务定义
  • 二进制装到 /opt/monitor/monitor-agent
  • token 写进 /opt/monitor/agent.env0600不写在服务定义里——那些内容会出现在 systemctl cat 和日志里
  • systemd 单元带一整行加固:DynamicUserNoNewPrivilegesProtectSystem=strictProtectHomePrivateTmpPrivateDevicesRestrictAddressFamiliesMemoryMax=64M

重跑一遍就是升级,也是幂等的。

OpenRC 上 agent 以 root 跑。 DynamicUser 是 systemd 白送的降权,OpenRC 没有对应开关。 两边等价的只有自动重启;token 的存放两边一样(root-only 的 env 文件,不进服务定义,不进日志)。

手动运行

monitor-agent --server https://hub.example.com --token <token>
bash
参数默认说明
--server必填hub 地址,也可用环境变量 MONITOR_SERVER
--token必填节点 token,也可用 MONITOR_TOKEN
--interval1上报间隔(秒),1–3600
--insecure允许明文连远程 hub,见下

明文与 --insecure

agent 和 install.sh拒绝明文连远程 hub,裸主机名默认升级到 https:// / wss://。 token 会明文传输是一半理由;另一半更要紧——安装时下载的那个二进制走同一条未验证的通道, 而它紧接着要以 root 跑起来。

ip:port 部署的 hub 只有明文 HTTP,所以两边都认一个 --insecure。它一次改三件事:

  1. 放行明文到远程 hub
  2. 裸主机名不再升级成 TLS
  3. install.sh 往 stderr 打风险说明,并把 --insecure 写进服务的启动参数

显式写了 https:// 的地址加上 --insecure 也仍然走 TLS——这个开关允许明文,不强制明文

面板不会替你生成带 --insecure 的命令:从 IP 或明文入口进后台时,添加节点、 批量窗口和安装命令一律不可用。要用这个开关,只能自己手工跑脚本,并且清楚自己在做什么。

换 token

节点 → 重新生成 token。旧 token 立刻失效,包括已经连着的那条连接—— hub 会把这个节点踢下线,它拿旧 token 重连会吃到 401。

安装命令随时可以再看一次,token 不会「只显示一次」。

卸载

# systemd
systemctl disable --now monitor-agent
rm -f /etc/systemd/system/monitor-agent.service && systemctl daemon-reload
 
# OpenRC
rc-update del monitor-agent default && rc-service monitor-agent stop
rm -f /etc/init.d/monitor-agent
 
rm -f /opt/monitor/monitor-agent /opt/monitor/agent.env
bash

然后在面板里删掉这个节点。

上报什么

连接建立时上报一次静态信息(Facts):主机名、系统、内核、架构、虚拟化类型、 CPU 型号与核数、内存与硬盘总量、本机 IPv4 / IPv6、agent 版本。

之后每 --interval 秒上报一次指标(Metrics):CPU、负载、内存、swap、硬盘、 网卡收发速率与内核累计计数器、TCP / UDP 连接数、进程数、运行时间、boot_id

字段的权威定义是 agent 源码里的两个 struct,完整说明见架构与协议

agent 不写任何文件,也不记忆任何跨重启的状态。 它只上报此刻内核给出的数字,累加是 hub 的事。