跳转到内容

通知系统:目标、匹配规则与常见渠道 ​

第一次登录要做的六件事提到过,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和旧机制类似,走本机 Postfixmailto、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匹配上之后通知哪个目标,可以填多个
modeall(默认,所有规则都要满足)或 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-admins

4. 认识几种常见事件类型 ​

事件类型 (type)严重程度常见字段
package-updatesinfohostname
fencingerrorhostname
replicationerrorhostname, job-id
vzdump(备份)info 或 errorhostname, job-id
system-mail(本机守护进程发的邮件,如 smartd)unknownhostname

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 账户不用操心这个,多人协作时参考用户、组、角色与权限路径(规划中)。

检查结果 ​

  1. 点目标的 Test 按钮,能收到测试通知。
  2. cat /etc/pve/notifications.cfg 能看到刚创建的目标和匹配规则。
  3. 找一个安全的方式触发一次真实事件(比如在测试环境手动跑一次会失败的备份任务),确认它按匹配规则路由到了预期的目标,而不是发给了所有人或谁都没收到。

常见问题 ​

默认的通知邮件一直发不出去。 大概率还在用本机 Postfix 直连,参考第一次登录要做的六件事里第 4 条,换成 SMTP 类型的目标接一个能用的邮件中继。

改了匹配规则,之前配好的备份任务通知没反应。 检查该备份任务的 notification-mode 是不是还停留在 legacy-sendmail——那种模式下匹配规则不生效。

Webhook 目标怎么调试请求内容对不对。 先用一个能直接看到原始请求的服务(比如 webhook.site 这类临时测试地址)验证模板渲染出来的 url/header/body 是否符合预期,确认没问题后再指向真正的目标。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。