
我妈家跳闸那回,老DS220j上的备份任务连挂三晚,我一点知觉都没有。周末连上去看日志,任务列表里躺着三行红的,最早那次是周二凌晨。
这事我写过:异地备份那篇里说过,DS220j每天03:40来我家拉数据,我妈家老小区空调微波炉一块开就跳闸。跳闸不稀奇,稀奇的是它跳了之后,我这头三天没人知道。任务计划编辑页里我明明勾了「仅当任务异常终止时发送」,后来才发现——勾是勾了,那台机器上压根没配过邮件通道。勾了个寂寞。
那个周末我把三台机器(我家N100飞牛、我妈家DS220j、表弟的四盘位群晖)挨个配了一遍告警,这篇把事件、通道、脚本全摆出来,你照着抄就行。
先想清楚要它报什么警,再动手配通道
很多人配告警是反着来的:先研究用什么软件推消息,配完了发现不知道该订阅什么事件,最后手机一天响八回,全是「系统运行正常」。先把事件列出来,分级,再选通道。
我的分级就三档:
| 事件 | 要不要立刻知道 | 我给的通道 |
| 备份任务失败 | 要,数据在裸奔 | 钉钉推送 |
| 硬盘SMART异常、存储池降级 | 要,拖久二次损坏 | 群晖自动邮件+App推送 |
| UPS转入电池 | 要,得准备关机 | App推送 |
| 磁盘水位超85% | 当天处理就行 | 钉钉推送 |
| Docker容器更新完成 | 看一眼就行 | 邮件 |
| 系统有新版本 | 不用急 | 不开通知 |
硬盘这块多说一句。坏盘前兆那篇写过,异响、掉速、SMART计数变红,这些前兆机器自己最先知道——SMART数据就在盘体固件里存着。它知道,你不看,等于谁都不知道。所以硬盘告警必须让机器主动喊,而不是等你自己想起来跑一趟检测。
一句话原则:需要你动手的推手机,看一眼就行的进邮箱,可有可无的直接关。后面所有配置都围绕这句来。
群晖:一个通知设置页,办完大半
我妈家那台DS220j最先配。DSM里进控制面板,找「通知设置」,「电子邮件」页签。服务提供商可以直接选QQ,也可以选自定义SMTP自己填:smtp.qq.com,端口465,SSL加密。
这里有个我第一遍就栽的坑:密码栏不能填QQ密码。得先去QQ邮箱网页版,设置、账户,把POP3/SMTP服务开起来,发条短信验证,它会给你一串16位的授权码。DSM里密码栏填的是这个授权码。我图省事填了QQ密码,点「发送测试电子邮件」,直接认证失败,来回查了十分钟才反应过来。
配好邮箱,同一个页面还有推送服务的页签,绑上群晖账号,手机装DS finder这个App登录同一个账号,硬盘健康、存储池降级、UPS转入电池这些系统级事件,DSM自己就会往手机推,比邮件快得多,锁屏直接弹。表弟那台四盘位群晖我是远程带着他配的,一样的路径,五分钟完事。
最后回到出事源头:任务计划。每个任务编辑页里有「发送电子邮件通知」,勾上,再勾下面的「仅当任务异常终止时发送」——正常跑完不烦你,只有挂了才报,这个组合正好。但记住DS220j给我的教训:这些勾选只是「决定要报」,通知设置里的通道才是「用嘴报」,嘴没配,决定再多也是哑巴。
飞牛:系统层没找到成体系的,我把告警放到脚本这边
我家N100跑的飞牛,这块得说实话:我这版系统在设置里翻通知相关,只有零星开关,没有群晖那种成体系的通知中心。飞牛版本迭代快,说不定你看到这篇时已经有了,先自己翻一遍——我等不及,告警直接在Docker和脚本层做的。
两个cron脚本。第一个盯磁盘水位,阈值85%,这是存储池满那篇拿4T盘吃过亏定的数,超了就往钉钉发一条。第二个盯硬盘健康,每周日早上跑一次smartctl -H,输出里只要不是PASSED就报警。SMART具体数字怎么看判读那篇写得很细,脚本只认PASSED这一个词,粗暴但够用。
Docker这边,容器升级那篇提过我只让Watchtower盯Jellyfin和Navidrome两个无状态容器。Watchtower自带邮件通知,环境变量加上WATCHTOWER_NOTIFICATION_EMAIL_FROM、WATCHTOWER_NOTIFICATION_EMAIL_TO和SMTP服务器那几项,它每次更新完容器会给你发封邮件。这种属于「看一眼就行」档,走邮箱不走推送。
手机秒到的两条路:钉钉机器人和Bark
邮件慢,QQ邮箱正常也要等个十几秒到几分钟,DS finder又只管群晖。真正全平台秒到的,我配了两条。
钉钉机器人。建一个只有自己的群(发起群聊随便拉个人再踢掉,或者面对面建群),群设置、智能群助手、添加机器人、选自定义。安全设置三个选项里选「自定义关键词」,我填的「NAS」两个字——注意这个坑:之后所有发过来的消息内容里必须带这个词,不带就拒收。拿到webhook地址后一行curl就能发:
curl -s "https://oapi.dingtalk.com/robot/send?access_token=你的token" -H 'Content-Type: application/json' -d '{"msgtype":"text","text":{"content":"NAS磁盘水位告警:已用87%"}}'
我第一次配完测了一发,返回{"errcode":310000,"errmsg":"keywords not in content"},当时以为是NAS出不了网,防火墙查了半天,后来才看明白是消息里忘了带「NAS」关键词。安卓手机有钉钉就够了,锁屏通知一样弹。
用iPhone的话再加个Bark。App Store装Bark,打开复制你自己的Key,然后任何时候一行就推:curl https://api.day.app/你的Key/NAS告警/磁盘水位87%,锁屏秒到,走的是苹果原生推送,App都不用开着。它还能自建服务端,那是进阶玩法,用官方的完全够。我把Bark给了备份这条线,钉钉管硬盘和水位,两条线分开,响起来就知道是哪类事。
我家现在的告警清单,直接抄
三台机器全配完,现在的清单长这样:
| 机器 | 事件 | 通道 | 怎么触发 |
| 我妈家DS220j | 备份任务03:40失败 | 群晖邮件 | 任务计划勾异常终止 |
| 我妈家DS220j | 硬盘异常、RAID降级 | DS finder | DSM系统事件自动 |
| 我家飞牛N100 | 磁盘水位85% | 钉钉 | cron每天早上跑脚本 |
| 我家飞牛N100 | SMART非PASSED | 钉钉 | cron每周日跑脚本 |
| 我家飞牛N100 | 容器自动更新 | 邮件 | Watchtower环境变量 |
| 配UPS的群晖 | 断电转入电池 | DS finder | 系统事件自动 |
水位脚本就几行,贴出来你改改阈值就能用:
#!/bin/bash
USE=$(df /vol01/1000 | awk 'NR==2{gsub("%","");print $5}')
[ $USE -ge 85 ] && curl -s "https://oapi.dingtalk.com/robot/send?access_token=你的token" -H 'Content-Type: application/json' -d '{"msgtype":"text","text":{"content":"NAS磁盘水位告警:已用'"$USE"'%"}}'
注意脚本里写死了「NAS」开头,就是给钉钉关键词留的位。另外每月挑一天,把阈值临时改成1%跑一次,看手机响不响——告警链路自己也会坏,SMTP授权码过期、钉钉token被重置、cron没跑起来,都可能让你以为岁月静好。让手机响一声,比什么都踏实。
别把告警配成狼来了
配到这最容易犯的错是订阅太多。有两类千万别开推送:
一是登录失败通知。开SSH那篇说过,我转发22端口那半个月,爆破日志几千条,要是每条失败登录都推手机,早疯了。登录失败的正确姿势是自动封锁加定期看报表,不是实时轰炸。
二是系统更新提醒。系统更新那篇的结论是重要补丁要升,但「有新版本」这件事本身不值得打断你,邮箱里躺着就行,看到再安排时间。
还有个双保险建议压箱底:关键事件别只配一条通道。我妈家DS220j是邮件加DS finder双通道,有回QQ邮箱SMTP抽风,App推送还活着,该响的还是响了。鸡蛋别放一个篮子里,告警这行当尤其如此。
收尾给个顺序:先列事件清单分好级,再配通道(群晖一个设置页,飞牛用脚本),然后逐个任务把通知勾上,每月再验一次链路。配完这套,硬盘坏、备份挂、跳闸断电,手机比你自己先知道——那三晚的哑巴亏,不会再吃了。

发表评论