为家里所有设备配置 UPS 监控,NUT 服务器搭建笔记

random-pic-api

前言

说实话,我被 UPS 电源监控搞得快烦死了。

自从给家里整了套 UPS 后,就面临一个很现实的问题:家里设备越来越多,怎么让所有设备都能知道 UPS 的状态?

一开始我只是简单地把 NAS 接到 UPS 上,想着至少 NAS 能安全关机就行。但慢慢地问题就来了:

  1. NAS 确实能安全关机,但其他设备呢? - 正在下载的服务器、正在编码的视频工作站…
  2. 无法提前预警 - UPS 快没电了,其他设备还在正常工作,突然断电就懵了
  3. 手动管理太麻烦 - 每台设备都要单独配置,而且不同的系统配置方法还不一样

最尴尬的是有一次,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
2
3
4
5
6
# 安装 NUT 客户端
apt install nut

# 配置 NUT 客户端模式
# /etc/nut/nut.conf
MODE=netclient

这里的 MODE=netclient 很关键,告诉 NUT 这是客户端模式,会通过网络连接 NUT 服务器。

1
2
3
4
5
6
7
# 配置 UPS 监控
# /etc/nut/upsmon.conf
MONITOR ups@192.168.31.2 1 monuser secret slave

# 关机命令设置
#SHUTDOWNCMD "/sbin/shutdown -h +0"
SHUTDOWNCMD "/usr/local/bin/ups-shutdown-notify.sh"

这里有个小细节:我把默认的关机命令换成了自定义的脚本。为什么呢?

因为直接关机太粗暴了!我想要在关机前做一些收尾工作:

  • 给手机发送通知
  • 关闭一些重要服务
  • 记录关机日志

启动服务并测试:

1
2
3
4
systemctl start nut-client && systemctl status nut-client && systemctl enable nut-client

# 测试连接
upsc ups@192.168.31.2

如果看到 UPS 的详细信息输出,说明连接成功了!

监控和日志

为了让监控更直观,我还加了日志和通知:

1
2
3
4
5
# 查看 UPS 关机日志
tail -100f /var/log/ups_shutdown.log

# 我的自定义关机脚本
/usr/local/bin/ups-shutdown-notify.sh

这个通知脚本很有意思,我用它来:

  1. 给手机发 Telegram 通知(UPS 即将关机)
  2. 记录关机原因和剩余电量
  3. 清理临时文件
  4. 优雅关闭 Docker 容器

这样即使我不在家,也能知道家里的电源状况。

macOS 客户端配置

我主力用的 MacBook 当然也不能落下。macOS 配置其实更简单:

1
2
3
4
5
6
# 通过 Homebrew 安装
brew install nut

# 复制配置文件模板
cp /opt/homebrew/etc/nut/nut.conf.sample /opt/homebrew/etc/nut/nut.conf
code /opt/homebrew/etc/nut/nut.conf

设置客户端模式:

1
MODE=netclient

然后配置监控:

1
2
3
# 复制监控配置模板
cp /opt/homebrew/etc/nut/upsmon.conf.sample /opt/homebrew/etc/nut/upsmon.conf
code /opt/homebrew/etc/nut/upsmon.conf

添加监控配置:

1
2
MONITOR ups@192.168.31.2 1 monuser secret slave
SHUTDOWNCMD "/usr/local/bin/ups-shutdown-notify.sh"

启动 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
2
3
4
5
ups_mode="usb"
ups_wait_time="45"
ups_enabled="yes"
ups_safeshutdown="yes"
ups_acl="192.168.31.119|192.168.31.118|192.168.31.117|192.168.31.9|192.168.31.4|192.168.31.5|"

关键在于 ups_acl 这个配置项。WebUI 只能设置 5 个 IP,但我们可以直接编辑这个文件,把所有需要监控的设备 IP 都加上。

⚠️ 重要提醒:

  1. 每次修改完需要重启 NUT 服务
  2. 群晖系统更新可能会覆盖这个配置
  3. IP 格式必须是 IP| 结尾

用户认证信息

群晖 NUT 服务器的默认认证信息可以在 upsd.users 文件中找到:

1
2
# 默认用户名密码
monuser:secret

当然,为了安全起见,建议修改默认密码。不过家里环境,默认密码也还好。

我的配置总结

经过这一番折腾,现在家里的网络环境是这样的:

1
2
3
4
5
6
7
8
9
                 UPS (USB)

群晖 DS923+ (NUT Server)

局域网 (192.168.31.x)

┌─────────────┬─────────────┬─────────────┐
│ Linux 服务器 │ macOS 设备 │ Windows PC │
└─────────────┴─────────────┴─────────────┘

所有设备都能:

  • ✅ 实时监控 UPS 状态
  • ✅ 接收低电量预警
  • ✅ 自动安全关机
  • ✅ 详细的日志记录

再也没有出现过突然断电的尴尬了!

我的收获和思考

这次折腾 NUT 服务器的经历,让我有了几点感悟:

1. 标准化协议的价值

说实话,以前我总觉得厂商自己的生态系统就够用了。群晖有自己的 UPS 监控,Windows 有自己的 UPS 管理…

但真正用起来才发现,标准化协议才是王道。NUT 虽然是开源项目,但几乎所有主流系统都支持,这种统一性带来的便利是厂商生态无法比拟的。

就像 USB 接口一样,正因为有了统一标准,我们才能随便插设备。

2. 家用网络的演进

回想起来,家里的网络需求已经从简单的”能上网”变成了”需要协同工作”:

  • 第一阶段:路由器+电脑,能上网就行
  • 第二阶段:NAS 存储,数据集中管理
  • 第三阶段:UPS 监控,设备协同关机
  • 现在:完整的 HomeLab 生态系统

这种演进也反映了我们对可靠性的要求越来越高。以前断电就断电,现在连意外断电都要优雅地处理。

3. 开源软件的灵活性

群晖的限制让我深刻体会到开源软件的优势。

如果是纯商业方案,遇到 5 客户端限制,我可能只能:

  • 购买更贵的版本
  • 换其他厂商的产品
  • 或者忍气吞声

但因为 NUT 是开源的,而且群晖底层用的是标准 NUT,我可以通过修改配置文件来突破限制。这种灵活性是纯商业方案很难提供的。

4. 自动化思维的转变

这次配置让我对自动化有了新的认识。

以前我觉得自动化就是”写脚本自动完成重复操作”。但现在觉得,真正的自动化是让系统自己感知状态并做出合理响应

UPS 监控就是很好的例子:

  • 系统自己感知电源状态
  • 根据电量自动调整行为
  • 在关键时刻自动执行保护措施

这种感知→分析→决策→执行的全流程,才是自动化的精髓。

后续的改进计划

虽然现在系统已经很稳定了,但我还想做几个改进:

  1. Web 界面:写个简单的 Web 页面,显示所有设备的电源状态
  2. 统计分析:记录断电频率、UPS 使用情况,评估是否需要升级
  3. 手机通知:完善通知机制,支持更多平台(微信、钉钉等)
  4. 自动测试:定期模拟断电测试,确保所有客户端正常工作

这些改进会让整个系统更加完善,也为家里其他自动化项目提供参考。

最后想说的话

折腾 NUT 这件事看似很小,但对我影响挺大的。

它让我明白了几个道理:

  • 可靠性是基础:不管多牛的系统,突然断电都是灾难
  • 标准化很重要:不要被厂商绑定,选择开放标准
  • 动手能力是关键:遇到问题不要慌,总有解决办法

现在每当看到家里所有设备都能优雅应对停电时,我都有种小小的成就感。这种通过自己动手解决问题带来的满足感,是买现成产品无法替代的。

如果你也在为类似的问题烦恼,希望这篇文章能帮到你。有什么问题或者更好的建议,欢迎交流!