我用推送通知替换了所有服务器邮件提醒——现在我真的会去看它们了
我的离网电力系统总是有多种方式提醒我当某些事情需要注意或当我快要没电时。问题是,在各种不同公司的MPPT充电控制器和电池监控器之间,我的通知从四面八方传来。
这意味着我不断错过通知,要么是因为电子邮件随着所有的新闻通讯和垃圾邮件一起消失,要么是因为蓝牙除了在家里外几乎没用。我不想再建立另一个仪表板,更绝对不想再收到更多的电子邮件。
我需要像真正警报一样运行的电源警报,所以我将家庭运营服务器连接到 ntfy,写了一些脚本来处理它们,并立即开始接收警报,直接通过 ntfy 发送到我的手机。
我停止向那些我本来就打算忽略的地方发送警报
警报工作正常,但它们最终到了错误的地方
电力系统和监控设备并不是我未能及时对警报做出反应的原因。我的 Victron 设备已经提供了多种方式让我了解情况,包括电池状态、活动输入和充电水平。问题在于这些警告是通过电子邮件发送的,而且速度太慢。
电子邮件适合处理我可以稍后处理的事情。但对于任何需要立即关注的事情,它绝对是糟糕的。如果电网断电,或者我对电池组施加了过多负荷,这类事件的警报不应该停留在我的收件箱里。它需要立即、响亮地通过推送通知发送到我的手机上。
为什么不使用仪表板呢?我喜欢仪表板,但像 Grafana 这样的仪表板只有在你记得去查看它的时候才有用。使用警报的整个意义就是我不需要去查看。这就是为什么把所有重要的电源事件转移到 ntfy 更有意义的原因。此外,由于我的家庭运维服务器已经通过本地 Postfix 邮件服务器处理电子邮件通知,编写脚本并通过 ntfy 发送这些通知也不是什么麻烦事。
ntfy 是让我的服务器正确发送通知的最简单方法
任何能够发送 HTTP 请求的东西都可以发送推送通知
Ntfy(发音:“notify”)非常适合创建更好的提醒系统,因为它已经可以与我设置的内容配合使用。ntfy 背后的概念也非常简单,以至于它可以轻松用作各种项目的通知堆栈:
- 我的智能手机订阅了我选择的一个主题,在这个例子中是“homeops-power-array-7429。”
- 我的服务器通过 curl HTTP POST 请求向该主题发布消息。
- 如果消息和主题相同,我的手机会收到推送通知。
- 如果我使用 Chrome 浏览器,也可以将通知发送到网页应用。
服务器端消息的最基本版本是这样的:
curl -d "Power monitor online" https://ntfy.sh/homeops-power-array-7429那一行会在 -d 之后将消息发送到 ntfy 主题,该主题位于 URL 的末尾。主题起到类似于发送通知的地址的作用。
为了可读的警报,我使用像这样的较长命令:
curl \
-H "Title: Power monitor online" \
-H "Priority: default" \
-H "Tags: electric_plug,white_check_mark" \
-d "Grid input is active. Battery bank is floating at ninety-six percent." \
https://ntfy.sh/homeops-power-array-7429-H 选项用于指定一个头部,ntfy 使用这些头部来添加额外信息,例如通知标题、优先级以及小的视觉标记,以突出某些事件。-d 选项用于指定文本为消息的正文。
由于我的 Victron 电力监控设备已经通过 RS232 控制台向我提供了功率值,ntfy 只是将有用的那些值转换成我实际上会看到的报警值。
选择一个复杂的主题名称很重要。由于任何人都可以订阅一个主题,建议通过在名称中添加一些随机数字和字母来使主题名称更难猜测。否则,你可能会遇到其他人查看或发送你的通知的情况。
我把警报弄得像事件,而不是状态垃圾信息
通知不应该每10分钟就告诉你“一切正常”。
如果你不加选择,警报系统可能会变得过于琐碎、过于频繁。是的,让服务器每10分钟通过cron任务检查一次,并告诉我一切正常以证明一切运作正常,这很诱人,但很快就会让人厌烦。我需要的是服务器定期检查状态,只有在出现问题时才打扰我。
创建这个的基本流程已经作为电子邮件通知堆栈的一部分创建。一个小脚本读取监控设备提供并存储为环境变量的当前值,将其与我创建的阈值进行比较,然后发送正确的 ntfy 消息:
if [ "$GRID_CONNECTED" = "No" ]; then
./send-alert.sh \
"Grid power unavailable" \
"high" \
"electric_plug,warning" \
"Grid input is offline. Battery bank is carrying the load at ${CHARGE}%."
fi我对低电量、关键电量以及超过正弦波逆变器容量的负载峰值使用了相同的想法。然后,cron 作业按计划运行检查:
*/15 * * * * /opt/homeops/power-monitor/power-watch.sh >/dev/null 2>&1这意味着服务器将每15分钟检查一次功率读数,这对于我在需要时对以下事件采取行动来说绰绰有余:
- 无论是电网、太阳能还是风能,当前都在为电池充电。
- 电网是否已断电。
- 当充电状态从充电变为浮充,或从浮充变为放电时。
- 当电池阵列电压下降到阈值以下时。
- 当负载超出逆变器额定限度时。
一旦这些事件被定义和脚本化,我从每15分钟收到一次通知,变成了只有在发生值得我关注的事情时才会收到提醒。在测试之后,我切断了充电控制器的电网电源,并故意制造条件以触发警报,我最终有足够的信心永久关闭Postfix邮件服务器。
推送通知之所以强大,是因为它们具有选择性
我仍然不建议用它们来替换每一个服务器警报
ntfy 修复了一个通知问题,但它也很容易造成通知疲劳。推送提醒只有在通知重要事件时才有用。如果每一个成功的定时任务、软件包更新、磁盘检查、登录事件和失败的任务都被打包发送到我的手机,那么我将开始忽略它们。
我必须严格制定规则,定义哪些事件允许接收推送通知。这些事件需要立即采取行动,或至少尽快采取行动。对于离网电力系统,这意味着低电量、电网断电、电池柜温度过高等等。
对于服务器来说,这意味着像备份失败、磁盘空间低到需要扩展卷,或者我依赖的服务出现故障之类的事件。其他所有事情都可以轻松记录到日志中以便以后查看,当然,电子邮件仍然可以用于每日报告。
在涉及像 ntfy 这样的推送通知服务时,还有隐私方面的问题。该服务以简洁为基础,因此放弃了对通知的加密。所有发送的内容都是明文,因此不言而喻,不应在其中包含 IP 地址、密码或账户信息。
我保留 ntfy,因为它解决了人工监控的问题
撇开脚本和监控系统不谈,让警报难以被忽视才是解决问题的关键
我以前的设置能正常提醒我。问题是它总是在我经常忽略的地方提醒我。电子邮件太慢而且杂乱,短信费用太高,应用和蓝牙提醒在提供者不允许你对阈值进行选择时又很容易错过。
Ntfy 让我选择我认为重要的事件,并将它们直接发送到我手机的通知栏,这样我就无法忽略它们。这解决了人的问题。不过,我不会以这种方式推送每一个服务器事件,而且 ntfy 绝对不是发送任何你不希望公众窥探的内容的地方。
不过,对于我小型的离网设置来说,ntfy 非常完美。实际上,它已经如此成功,以至于我将来会考虑在家里网络的其他部分自己托管这个服务。







