Montray —— 用于 systemd 服务健康状态的托盘图标工具
摘要
Montray 是一款轻量级的开源托盘图标工具,用于监控 systemd 服务以及自定义的命令行检查。它采用基于 Go 的后端服务器配合 Rust/Slint 桌面 UI,可在本地和远程机器上提供通知与健康状态显示。
查看缓存全文
缓存时间: 2026/10/06 09:22
dimonomid/montray
来源:https://github.com/dimonomid/montray
Montray 正在监视你的服务
Montray 是一个轻量级的系统托盘图标监控工具,用于监视 systemd 服务以及任何可以从命令行检查的内容,支持本地和远程机器。
Montray 演示
项目历史
问题:我不喜欢 Linux 在 systemd 服务出问题时不通知我。2021 年,我的 Syncthing 服务坏了好几周,我后来才发现——注意到我的文件严重不同步之后,而同步起来一点也不愉快。Systemd 明明知道它坏了,却没有告诉我。这可不行。
我的 certbot 服务也曾经悄悄停止工作,导致证书无法续期,还有其他类似的情况。
而且,我不想为了这么简单的任务搞什么企业级监控:我只想要一个非常轻量的应用,带一个简单的图标,始终存在于托盘中:绿色表示一切正常,闪烁的黄色/红色表示有东西坏了。就这么简单。
不久之后,我想让同一个图标不只用于 systemd 服务,还能用于任意的命令行检查,例如检查磁盘空间是否充足、RAID 是否健康,或者其他任何东西。
概览
本项目有两个主要部分:
montray-server,一个用 Go 编写的后台服务:运行在某台机器上,检查其健康状态,并通过简单的只读 WebSocket API 提供当前的异常事件;montray-ui,一个用 Rust + Slint 编写的桌面应用:连接到一个或多个montray-server,接收它们的数据,显示托盘图标,发送桌面通知,并提供原生 GUI。
所以 montray-server 是一个服务端(也可以在本地运行),而 montray-ui 是一个客户端,例如运行在笔记本电脑上。如果我们有一台笔记本电脑和两台服务器,典型的部署结构如下:
flowchart LR
subgraph laptop["笔记本电脑"]
localServer["montray-server"] --> desktop["montray-ui"]
end
subgraph server1["服务器 1"]
server1Monitor["montray-server"]
end
subgraph server2["服务器 2"]
server2Monitor["montray-server"]
end
server1Monitor --> desktop
server2Monitor --> desktop
Montray Server 会报告异常事件,每个事件包含:
- 一个 key,例如
systemd.my-service或free-space.exec-result - 一个状态:
warning或error
这些事件是根据 Montray Server 的配置生成的。详情参见配置 Montray Server。
Montray UI 会将这些事件汇总起来。对于每个事件,它还会在 key 前加上该服务器对应的 ID(例如 my-server,这个 ID 在 Montray UI 的配置中指定),于是 key 就变成 my-server.systemd.myservice。
详情参见配置 Montray UI。
如果发生了异常事件,而我们只是想先确认一下、稍后再处理,可以在 UI 中将其“小睡“(snooze),这样图标就不会一直烦人,之后它会自动恢复提醒。
托盘图标显示的是当前最差的未被小睡的状态:
- 灰色:初始状态未知;
- 绿色:一切正常;
- 品红闪烁:Montray UI 自身存在内部连接或隧道错误;
- 黄色闪烁:至少有一个警告;
- 红色闪烁:至少有一个错误。
安装快速开始(Linux)
监视本地机器
安装 montray-server 和 montray-ui 以监视本机健康状态的最简单方式如下:
首先,从 GitHub(https://github.com/dimonomid/montray/releases/latest)下载最新的预编译二进制文件,例如 montray-server-x.y.z_linux_amd64.tar.gz 和 montray-ui-x.y.z_linux_amd64.tar.gz,然后解压。你会得到两个可执行文件:montray-server 和 montray-ui。
然后:
# 设置监控服务并启动它。如果尚未安装,这也会将 montray-server
# 安装到 /usr/local/bin 下。
sudo ./montray-server setup
# 将桌面应用安装到系统级:
sudo install -m 755 montray-ui /usr/local/bin/montray-ui
# 让桌面应用创建其默认配置、自启动项和应用启动器:
montray-ui setup
# 启动桌面应用(Montray Server 已在运行中):
montray-ui
现在你应该能看到一个托盘图标,点击它即可打开 UI。重启电脑后,它会自动启动。
监视远程机器
如果你还有一台个人服务器,也想用桌面上的同一个界面来监视它,那么在每台这样的远程机器上执行与上述相同的步骤,但只需安装 montray-server(不需要在服务器上安装 montray-ui)。
在服务器上运行 montray-server 之后,我们需要让本地的 Montray UI(montray-ui)指向它。默认情况下,Montray Server 只监听 127.0.0.1,因此我们无法从笔记本电脑直接访问它。
假设你已经通过公钥认证(即无需密码即可 ssh)访问你的服务器,那么最简单的方式是建立一条 SSH 隧道,Montray UI 对此有方便的支持:打开配置文件 ~/.config/montray-ui/montray-ui.yml,在 wsClient.servers 数组中再添加一项,如下所示(至少调整你的服务器主机名和用户名)。这一项中没有 addr 字段:对于结构化的 SSH 隧道,Montray UI 会在 127.0.0.1 上自动分配一个可用端口。如果固定本地转发端口对你有用,你仍然可以指定一个显式的回环 addr 及你选择的端口。
- id: myserver # 该服务器的任意唯一 ID。
tunnel:
ssh:
host: myserver.com # TODO:你的实际服务器主机名
user: myuser # TODO:你的实际 ssh 用户
port: 22 # 如果使用非默认 ssh 端口,请修改
remoteServerAddr: 127.0.0.1:41990 # Montray Server 的监听端口
然后通过右键点击托盘图标并选择“Restart and reload configuration(重启并重新加载配置)“来重启 Montray UI(montray-ui)。打开 UI 并确认服务器列表中现在也包含了你新添加的远程服务器。
SSH 隧道并不是访问远程服务器的唯一方式;Montray UI 还支持 TLS 和 Bearer Token 认证。详情参见安全文档。
配置
默认配置(由 sudo montray-server setup 写入 /etc/montray-server.yml)如下:如果任何 systemd 服务处于失败状态,则为警告(托盘图标会闪烁黄色)。如果根分区的剩余空间不足 100 MiB,则为错误(托盘图标会闪烁红色)。其他情况下一切正常(托盘图标为绿色)。
配置文件中包含注释和示例,所以可以看一看并动手试试;也可以查看配置 Montray Server文档。例如,我喜欢明确列出我特别关注的服务,比如 Syncthing,并将任何非 active 的状态都配置为错误而非警告。这包括手动停止的服务——如果是出于某种原因手动停止的,我希望闪烁的图标一直烦我,直到服务重新运行为止。另外我还添加了一些自定义的 exec 检查。
别忘了重启 Montray Server 的 systemd 服务以使更改生效:
sudo systemctl restart montray-server.service
非 Linux 操作系统支持
到目前为止,Montray 只在 Linux 上测试过。不过,客户端(montray-ui)应该也能在 Windows 和 MacOS 上运行,因此你可以在这些系统上运行它并监视你的远程 Linux 服务器,但不太适合监视本机。
即使 montray-server 在技术上也能在非 Linux 系统上运行,但显然 systemd 在那些系统上没有意义,那时唯一有用的检查就是 exec:只是定期轮询某个脚本,于是我们就失去了开箱即用的系统级服务监控,实用性因此有限。如果能为 Windows 和 MacOS 实现类似 systemd 的检查会很棒,但我不太使用这些系统,难以测试。欢迎提交 PR。
开发
构建
你需要 Go (https://go.dev/) 1.26 和 Rust (https://www.rust-lang.org/tools/install) 1.92 或更高版本。
在 Ubuntu 上,安装用于构建和运行 montray-ui 的原生依赖:
sudo apt-get install -y gcc libfontconfig-dev libxkbcommon-x11-0
gcc 用于编译原生 Rust 依赖,libfontconfig-dev 提供 Slint 字体栈所需的 Fontconfig 开发文件,libxkbcommon-x11-0 则由 Slint/winit 在应用运行于 X11 环境下时加载。
准备好后,要同时构建 montray-server 和 montray-ui:
make
只构建其中一个:
make montray-server
make montray-ui
构建 Montray UI 的调试版二进制文件(与 release 相比,构建更快):
make montray-ui-debug
将构建好的二进制文件安装到 /usr/local/bin:
sudo make install-montray-server
sudo make install-montray-ui
旧版 Go 客户端(提供本地 Web UI)不在默认构建范围内。在 Ubuntu 上使用 make montray-ui-legacy 构建它时,还需要额外安装 libgtk-3-dev 和 libayatana-appindicator3-dev。
运行测试
测试套件使用与上述相同的 Go 和 Rust 构建要求。此外还需要当前的 Node.js (https://nodejs.org/) LTS 版本,用于旧版客户端的 JavaScript 测试。由于 go test ./... 会编译旧版 GTK 客户端,因此在 Ubuntu 上也需要其原生依赖:
sudo apt-get install -y libgtk-3-dev libayatana-appindicator3-dev
然后:
make test
只运行 montray-ui 的 Rust 测试:
cargo test --manifest-path cmd/montray-ui/Cargo.toml
两个原生窗口几何相关的测试在常规套件中被忽略,因为它们需要真实的 X11 会话和窗口管理器。无头环境无法准确测试窗口定位、最大化、隐藏和恢复。请将它们作为单独的命令显式运行:
cargo test --manifest-path cmd/montray-ui/Cargo.toml native_startup_restores_geometry_and_maximized_state -- --ignored
cargo test --manifest-path cmd/montray-ui/Cargo.toml native_hide_show_preserves_normal_geometry_while_maximized -- --ignored
它们必须分开运行,因为 Slint 的 GUI 平台在每个测试进程中只能初始化一次。将两个测试一起运行会导致第二个测试因平台初始化原因而失败,而不是因为几何问题。
截图
Montray 正常 Montray 警告
文档
相似文章
使用 Healthchecks.io 监控 SystemD 服务
本文介绍如何通过集成 Healthchecks.io 来监控 systemd 服务,利用 OnSuccess 和 OnFailure 钩子在服务状态变化时向其发送 ping 请求,并提供代码示例以及改进日志记录的相关更新。
Show HN: 用 Go 语言编写的轻量级 Linux VPS 系统监控工具
vpsmon 是一款用 Go 语言编写的轻量级 Linux VPS 系统监控工具,提供网页界面实时监控 CPU、内存、交换空间、磁盘、网络、系统运行时间和进程数量。
/monitor by Firecrawl
Firecrawl 推出 /monitor 工具,当网页发生变化时通知 AI 代理。
展示给HN:Sigabrt.dev – 一款带有SSH TUI的cronjob监控工具
Sigabrt是一个定时任务监控服务,当计划任务未能正常ping时发送邮件警报,并具备SSH终端界面用于状态管理。
Mnara
Mnara 是一款 macOS 系统监控工具,可直接在菜单栏中显示 Mac 的实时指标。