为家里所有设备配置 UPS 监控,NUT 服务器搭建笔记
为家里所有设备配置 UPS 监控,NUT 服务器搭建笔记
dong4j前言
说实话,我被 UPS 电源监控搞得快烦死了。
自从给家里整了套 UPS 后,就面临一个很现实的问题:家里设备越来越多,怎么让所有设备都能知道 UPS 的状态?
一开始我只是简单地把 NAS 接到 UPS 上,想着至少 NAS 能安全关机就行。但慢慢地问题就来了:
- NAS 确实能安全关机,但其他设备呢? - 正在下载的服务器、正在编码的视频工作站…
- 无法提前预警 - UPS 快没电了,其他设备还在正常工作,突然断电就懵了
- 手动管理太麻烦 - 每台设备都要单独配置,而且不同的系统配置方法还不一样
最尴尬的是有一次,UPS 已经开始最后的关机倒计时了,我还在旁边悠闲地刷视频,结果”啪”一下,全屋断电…
这时候我意识到,我需要的是一个统一的 UPS 监控方案。
NUT 是什么?
在网上查了一圈,发现了一个叫 NUT (Network UPS Tools) 的开源项目。说实话,这个名字一开始我还以为是坚果相关的工具,后来才发现是 Network UPS Tools 的缩写…
NUT 的核心理念很简单:让 UPS 成为网络设备。
传统的 UPS 配置是:
- UPS → USB/串口 → 单台设备
而 NUT 的配置是:
- UPS → 服务器(NUT Server) → 网络 → 所有设备(NUT Clients)
这样,任何支持 NUT 协议的设备都能通过局域网获取 UPS 状态,包括:
- 📊 UPS 负载百分比
- 🔋 电池剩余容量
- ⏱️ 预计剩余时间
- 📡 UPS 电压、频率等详细信息
群晖 NAS 作为 NUT 服务器
我家里的 DS923+ 很自然就成了 NUT 服务器的首选。毕竟 NAS 通常是 24/7 开机,而且已经通过 USB 连接着 UPS。
Linux 客户端配置
先从最常用的开始,家里的几台 Ubuntu 服务器都需要监控 UPS:
1 | # 安装 NUT 客户端 |
这里的 MODE=netclient 很关键,告诉 NUT 这是客户端模式,会通过网络连接 NUT 服务器。
1 | # 配置 UPS 监控 |
这里有个小细节:我把默认的关机命令换成了自定义的脚本。为什么呢?
因为直接关机太粗暴了!我想要在关机前做一些收尾工作:
- 给手机发送通知
- 关闭一些重要服务
- 记录关机日志
启动服务并测试:
1 | systemctl start nut-client && systemctl status nut-client && systemctl enable nut-client |
如果看到 UPS 的详细信息输出,说明连接成功了!
监控和日志
为了让监控更直观,我还加了日志和通知:
1 | # 查看 UPS 关机日志 |
这个通知脚本很有意思,我用它来:
- 给手机发 Telegram 通知(UPS 即将关机)
- 记录关机原因和剩余电量
- 清理临时文件
- 优雅关闭 Docker 容器
这样即使我不在家,也能知道家里的电源状况。
macOS 客户端配置
我主力用的 MacBook 当然也不能落下。macOS 配置其实更简单:
1 | # 通过 Homebrew 安装 |
设置客户端模式:
1 | MODE=netclient |
然后配置监控:
1 | # 复制监控配置模板 |
添加监控配置:
1 | MONITOR ups@192.168.31.2 1 monuser secret slave |
启动 NUT 服务后,macOS 的菜单栏就会显示电池图标,实时显示 UPS 状态。
遇到的坑:群晖 5 客户端限制
正当我为所有设备都配置好 NUT 而沾沾自喜时,问题来了…
群晖的 WebUI 只允许最多 5 个客户端连接!
我家里的设备可远远超过 5 台:
- 3 台 Ubuntu 服务器
- 2 台 MacBook
- 1 台 Windows 工作站
- 1 台 OpenWrt 软路由
- 还有各种测试设备…
第 6 台设备连接时,直接就被拒绝了!
一开始我还以为是配置问题,反复检查用户名密码,确认无误后才发现是群晖的硬性限制。
突破限制的方法
说实话,一开始我都想放弃群晖了,准备专门用一台 Linux 当 NUT 服务器。
但后来发现,群晖的 NUT 服务器功能其实是完整的,只是 WebUI 做了限制。我们可以直接修改底层配置文件!
群晖的 NUT 配置都在 /usr/syno/etc/ups 目录中,我们需要修改 synoups.conf 文件:
1 | ups_mode="usb" |
关键在于 ups_acl 这个配置项。WebUI 只能设置 5 个 IP,但我们可以直接编辑这个文件,把所有需要监控的设备 IP 都加上。
⚠️ 重要提醒:
- 每次修改完需要重启 NUT 服务
- 群晖系统更新可能会覆盖这个配置
- IP 格式必须是
IP|结尾
用户认证信息
群晖 NUT 服务器的默认认证信息可以在 upsd.users 文件中找到:
1 | # 默认用户名密码 |
当然,为了安全起见,建议修改默认密码。不过家里环境,默认密码也还好。
我的配置总结
经过这一番折腾,现在家里的网络环境是这样的:
1 | UPS (USB) |
所有设备都能:
- ✅ 实时监控 UPS 状态
- ✅ 接收低电量预警
- ✅ 自动安全关机
- ✅ 详细的日志记录
再也没有出现过突然断电的尴尬了!
我的收获和思考
这次折腾 NUT 服务器的经历,让我有了几点感悟:
1. 标准化协议的价值
说实话,以前我总觉得厂商自己的生态系统就够用了。群晖有自己的 UPS 监控,Windows 有自己的 UPS 管理…
但真正用起来才发现,标准化协议才是王道。NUT 虽然是开源项目,但几乎所有主流系统都支持,这种统一性带来的便利是厂商生态无法比拟的。
就像 USB 接口一样,正因为有了统一标准,我们才能随便插设备。
2. 家用网络的演进
回想起来,家里的网络需求已经从简单的”能上网”变成了”需要协同工作”:
- 第一阶段:路由器+电脑,能上网就行
- 第二阶段:NAS 存储,数据集中管理
- 第三阶段:UPS 监控,设备协同关机
- 现在:完整的 HomeLab 生态系统
这种演进也反映了我们对可靠性的要求越来越高。以前断电就断电,现在连意外断电都要优雅地处理。
3. 开源软件的灵活性
群晖的限制让我深刻体会到开源软件的优势。
如果是纯商业方案,遇到 5 客户端限制,我可能只能:
- 购买更贵的版本
- 换其他厂商的产品
- 或者忍气吞声
但因为 NUT 是开源的,而且群晖底层用的是标准 NUT,我可以通过修改配置文件来突破限制。这种灵活性是纯商业方案很难提供的。
4. 自动化思维的转变
这次配置让我对自动化有了新的认识。
以前我觉得自动化就是”写脚本自动完成重复操作”。但现在觉得,真正的自动化是让系统自己感知状态并做出合理响应。
UPS 监控就是很好的例子:
- 系统自己感知电源状态
- 根据电量自动调整行为
- 在关键时刻自动执行保护措施
这种感知→分析→决策→执行的全流程,才是自动化的精髓。
后续的改进计划
虽然现在系统已经很稳定了,但我还想做几个改进:
- Web 界面:写个简单的 Web 页面,显示所有设备的电源状态
- 统计分析:记录断电频率、UPS 使用情况,评估是否需要升级
- 手机通知:完善通知机制,支持更多平台(微信、钉钉等)
- 自动测试:定期模拟断电测试,确保所有客户端正常工作
这些改进会让整个系统更加完善,也为家里其他自动化项目提供参考。
最后想说的话
折腾 NUT 这件事看似很小,但对我影响挺大的。
它让我明白了几个道理:
- 可靠性是基础:不管多牛的系统,突然断电都是灾难
- 标准化很重要:不要被厂商绑定,选择开放标准
- 动手能力是关键:遇到问题不要慌,总有解决办法
现在每当看到家里所有设备都能优雅应对停电时,我都有种小小的成就感。这种通过自己动手解决问题带来的满足感,是买现成产品无法替代的。
如果你也在为类似的问题烦恼,希望这篇文章能帮到你。有什么问题或者更好的建议,欢迎交流!


















