Montray —— 用于 systemd 服务健康状态的托盘图标工具

Lobsters Hottest 工具

摘要

Montray 是一款轻量级的开源托盘图标工具,用于监控 systemd 服务以及自定义的命令行检查。它采用基于 Go 的后端服务器配合 Rust/Slint 桌面 UI,可在本地和远程机器上提供通知与健康状态显示。

<p><a href="https://lobste.rs/s/gveu0c/montray_tray_icon_for_systemd_service">评论</a></p>
查看原文
查看缓存全文

缓存时间: 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 服务

Lobsters Hottest

本文介绍如何通过集成 Healthchecks.io 来监控 systemd 服务,利用 OnSuccess 和 OnFailure 钩子在服务状态变化时向其发送 ping 请求,并提供代码示例以及改进日志记录的相关更新。

/monitor by Firecrawl

Product Hunt

Firecrawl 推出 /monitor 工具,当网页发生变化时通知 AI 代理。

Mnara

Product Hunt

Mnara 是一款 macOS 系统监控工具,可直接在菜单栏中显示 Mac 的实时指标。