外观
通知系统:目标、匹配规则与常见渠道
第一次登录要做的六件事提到过,PVE 默认靠本机 Postfix 直接投递邮件,绝大多数收件方会直接拒收。8.1 版本起,PVE 有了一套更完整的通知系统,能把不同类型的事件(备份失败、磁盘 SMART 报警、节点失联……)分别路由到邮箱、Gotify 或 Webhook,而不是眉毛胡子一把抓地都发到一个地址。
开始之前
先弄清楚两个术语,之后配置界面处处都在用它们:
- 目标 (target):通知要发到的地方,比如一个邮箱、一个 Gotify 服务器、一个 Webhook 地址。
- 匹配规则 (matcher):决定「什么样的事件」应该发给「哪个(些)目标」的规则。
配置都在 数据中心 → Notifications,底层存储在两个文件里:
/etc/pve/notifications.cfg:目标和匹配规则的定义。/etc/pve/priv/notifications.cfg:密码、Token 等敏感信息,只有 root 能读。
旧的 sendmail 方式还能用,但在慢慢淡出
8.1 之前,PVE 各个模块(尤其是备份任务)直接调用 sendmail,逐台机器配一个收件地址。这套旧机制目前还保留着(备份任务里叫 legacy-sendmail 模式),但官方文档已经提示它可能在未来版本移除,新装的机器建议直接用新系统。
操作步骤
1. 认识目标(target)的几种类型
| 类型 | 适合 | 关键字段 |
|---|---|---|
| Sendmail | 和旧机制类似,走本机 Postfix | mailto、from-address |
| SMTP | 直连外部邮件服务商,不依赖本机投递队列 | server、port、mode(insecure/starttls/tls)、username、password |
| Gotify | 自建的 Gotify 推送服务器 | server、token |
| Webhook | 任意能接收 HTTP 请求的地方(如 ntfy、Slack、Discord 的自定义 Webhook) | url、method、header、body |
SMTP 目标没有重试机制
和走本机 Postfix 队列的 Sendmail 目标不同,SMTP 目标是直接连外部服务器发送,没有排队重试——对方服务器临时不可达,这封通知就丢了。想要送达更可靠,Sendmail(本机排队)配合一个可靠的中继反而更合适;SMTP 目标适合你能确保目标服务器随时可达的场景。
Webhook 目标的 url、header、body 支持 Handlebars 模板语法,能取到 、、、 等字段,方便拼出 Slack、Discord 或 ntfy 需要的请求格式,官方文档给了这几个平台的示例模板,照抄改地址即可。
2. 创建一个目标并测试
数据中心 → Notifications → Add,选一种类型(比如 SMTP),按表格里的字段填好。创建后选中它,点 Test,确认能收到一条测试通知——不测试就不知道配置到底通不通。
3. 创建匹配规则(matcher)
数据中心 → Notifications → Add → Matcher,可用的条件:
| 字段 | 作用 |
|---|---|
target | 匹配上之后通知哪个目标,可以填多个 |
mode | all(默认,所有规则都要满足)或 any(满足一条即可) |
invert-match | 把整个匹配结果取反 |
match-severity | 按严重程度过滤,例如 error、warning,error |
match-field | 按事件的元数据字段过滤,例如 exact:type=vzdump |
match-calendar | 按时间窗口过滤,例如 mon..fri 9:00-17:00 |
没有任何匹配条件的规则,永远为真
一条 matcher 如果什么条件都没填,会匹配所有事件。新建规则时如果忘了加 match-field 或 match-severity,很容易变成「什么都发」,把目标邮箱刷屏。
两个官方文档给出的典型组合:
只把备份失败发给专门的人:
text
matcher: backup-failures
match-field: exact:type=vzdump
match-severity: error
target: backup-admins工作时间发一个目标,非工作时间发给值班的人(两条 matcher 配合):
text
matcher: workday
match-calendar: mon..fri 9-17
target: admins
matcher: night-and-weekend
match-calendar: mon..fri 9-17
invert-match: true
target: on-call-admins4. 认识几种常见事件类型
| 事件类型 (type) | 严重程度 | 常见字段 |
|---|---|---|
package-updates | info | hostname |
fencing | error | hostname |
replication | error | hostname, job-id |
vzdump(备份) | info 或 error | hostname, job-id |
system-mail(本机守护进程发的邮件,如 smartd) | unknown | hostname |
5. 备份任务里选择通知方式
每个备份任务(数据中心 → Backup)有一个 notification-mode 选项:
notification-system:走本文说的新系统,由匹配规则决定发给谁。legacy-sendmail:忽略匹配规则,直接用 Sendmail 发给任务里配置的地址。
新建的备份任务建议直接选 notification-system,统一管理。
需要什么权限
创建和修改目标/匹配规则需要 /mapping/notifications 路径上的 Mapping.Modify 权限(只看不改是 Mapping.Audit);点 Test 按钮需要 Mapping.Use、Mapping.Audit 或 Mapping.Modify 之一。单人自用的 root 账户不用操心这个,多人协作时参考用户、组、角色与权限路径(规划中)。
检查结果
- 点目标的 Test 按钮,能收到测试通知。
cat /etc/pve/notifications.cfg能看到刚创建的目标和匹配规则。- 找一个安全的方式触发一次真实事件(比如在测试环境手动跑一次会失败的备份任务),确认它按匹配规则路由到了预期的目标,而不是发给了所有人或谁都没收到。
常见问题
默认的通知邮件一直发不出去。 大概率还在用本机 Postfix 直连,参考第一次登录要做的六件事里第 4 条,换成 SMTP 类型的目标接一个能用的邮件中继。
改了匹配规则,之前配好的备份任务通知没反应。 检查该备份任务的 notification-mode 是不是还停留在 legacy-sendmail——那种模式下匹配规则不生效。
Webhook 目标怎么调试请求内容对不对。 先用一个能直接看到原始请求的服务(比如 webhook.site 这类临时测试地址)验证模板渲染出来的 url/header/body 是否符合预期,确认没问题后再指向真正的目标。