1144 字
3 分钟
为了护住我那几块硬盘:我的 UPS 监控“三部曲
2026-04-01

搞 HomeLab 的人,最后都会殊途同归地买台 UPS。毕竟看着那几块存满了“学习资料”的硬盘,谁也不想在停电时赌一把运气。

但 UPS 买回来后,怎么看状态就成了个问题。为了能随时随地盯一眼电量,我前前后后折腾了三个版本。

🛠️ 从“能看”到“优雅”:三个版本的演进#

v1.0:PVE 备注栏的“暴力补丁”#

最开始的想法特别简单直接:既然我天天盯着 PVE 后台,那把 UPS 信息塞进 PVE 不就行了? 于是我写了个 Python 脚本,定时抓取 upsc 的数据,然后通过 PVE 的 API 强行写进节点的“备注”里。

  • 现状:能看,但丑。备注栏那一堆乱糟糟的字符,每次看都觉得自己像个原始人。

v1 版本 PVE 节点备注展示截图

v2.0:魔改 PVE 的状态面板#

后来不满足于备注栏,我开始打 PVE 源码的主意。通过修改 PVE 的 ExtJS 文件,我强行在宿主机的状态监控页里插了一个 UPS 的展示位。

  • 现状:看着很高级,和系统融为一体。但有个致命伤:只要 PVE 一更新,改动就全没了,得重新修代码,简直是体力活。

v2 版本魔改 PVE 状态页截图

v3.0:独立 Web 版(UPS Web)#

也就是这次要分享的终极方案:不依赖宿主机系统,做一个彻底独立的监控页。 这一次我用 Node.js 重新写了一套逻辑,最核心的一点是:我用纯 JS 实现了 NUT(Network UPS Tools)客户端协议。 这意味着它不再需要你安装任何 upsc 命令,只要能跑 Node 或 Docker 的地方,它就能直接和你的 UPS 服务器对话。

v3 版本独立 Web 监控页截图


🚀 深度看一眼 v3.0:UPS Web#

这个小项目主打的就是 轻量解耦

为什么选它?#

  • 协议级通讯:通过 TCP 直接与 upsd 对话,省去了中间层命令。
  • 配置即时生效:无需翻找后台 config 文件,网页输入 IP 即可。
  • 极端环境适配:当 UPS 进入 OB(电池供电)LB(低电量) 时,整个页面会变为醒目的预警红,连浏览器标签页都会同步闪烁。

电池供电且低电量状态 电池供电且低电量状态(标题栏)


📦 部署指南#

为了方便复刻,我将 v3.0 整理成了标准项目。推荐使用 Docker 部署,以保持环境整洁。

方法一:使用 Docker(推荐)#

为了确保你在网页上修改的配置不会因为容器重启而丢失,请务必挂载配置文件:

# 创建配置存储文件
touch config.json
# 运行容器
docker run -d \
--name ups-web \
-p 8765:8765 \
-v $(pwd)/config.json:/app/config.json \
-e HOST=0.0.0.0 \
-e PORT=8765 \
--restart always \
ups-web

方法二:源码运行#

如果你想直接在 Node.js 环境下跑:

git clone https://github.com/olinll/nut-guard.git
cd nut-guard
npm install
npm start

🔧 技术实现亮点:纯 JS 版 NUT 客户端#

市面上大多数监控都是通过 child_process 调用系统命令,而我选择直接在 Node.js 里构建 TCP 连接。

// 核心逻辑片段:向 NUT Server 请求数据
const client = net.connect({ host: UPS_IP, port: 3493 }, () => {
client.write(`LIST VAR ${UPS_NAME}\n`);
});
client.on('data', (data) => {
// 解析成 JSON 对象供前端调用
const metrics = parseNutData(data.toString());
// ...
});

这种做法不仅减小了镜像体积(无需安装 nut-client),更让数据上报的延迟降到了毫秒级。


⚠️ 安全与避坑提醒#

  1. 权限控制:该项目暂未内置登录鉴权,建议配合 Nginx Proxy Manager 加上 Access List,或者仅在局域网内使用。
  2. 配置冲突:通过 URL 参数 ?ip=10.0.0.1 临时查看时,不会改写 config.json
  3. 持久化:如果是在 PVE 容器(LXC)里跑,记得开启相应的网络权限。

🎬 结语#

从最开始在备注栏抠字,到如今拥有一个独立的监控大屏,这不仅是为了护住那几块硬盘,更是折腾 HomeLab 的乐趣所在。

目前项目已在 GitHub 开源:

olinll
/
nut-guard
Waiting for api.github.com...
00K
0K
0K
Waiting...

代码可以重构,但那份热爱不该被“回收”。

写博客就像往深不见底的井里丢石头,有时候很久都听不到回声。但如果此刻的你正读到这里,说明那颗石头终于撞到了什么。

如果你也曾在这座“赛博荒岛”上停留,哪怕只是为了看一眼那个 UPS 监控的 Bug 怎么解,也请留下你的足迹。哪怕只是发一个 ping,我也能回你一个 pong。

证明一下,除了那些爬虫机器人,这个岛上真的有过人类。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

为了护住我那几块硬盘:我的 UPS 监控“三部曲
https://blog.olinl.com/posts/ups-monitoring-trilogy-nodejs/
作者
顾拾柒
发布于
2026-04-01
许可协议
CC BY-NC-SA 4.0

目录