通知中心
通知中心订阅 Gately 内部的事件总线,按规则把 DDNS 变更、证书到期、WAF 拦截、进程异常等事件推送到 Webhook、Telegram、Bark、ntfy、Gotify、Pushover、Discord、Slack、Server酱、PushPlus、企业微信、钉钉、飞书和邮件。管理界面位于侧边栏「系统」分组 → 「通知中心」。
工作方式
- 各模块在状态变化时向进程内事件总线发布事件,发布不会阻塞业务。
- 通知中心收到事件后逐条匹配规则:规则已启用、事件级别不低于规则的最低级别、事件类型匹配规则的事件列表。
- 命中的规则经过静默去重后,把消息投递到规则选择的已启用渠道。同一事件命中多条规则时,同一渠道只发送一次。
- 每次投递的结果(成功或失败原因)写入「最近投递」,内存中保留最近 200 条;失败同时写入模块日志。
单次投递的超时为 45 秒。
渠道
点击「添加渠道」,选择类型并填写字段。所有渠道都有名称(必填)、备注和启用开关。密钥类字段保存后不再回显,编辑时留空表示保持原值。
| 类型 | 必填字段 | 可选字段 |
|---|---|---|
| Webhook | 请求地址 | 请求方法(默认 GET,可选 GET、POST、PUT、PATCH)、请求头(每行 Key: Value)、请求体、成功判定内容、超时(秒,默认 20)、跳过证书校验 |
| Telegram | Bot Token、Chat ID | API 地址(留空使用 https://api.telegram.org) |
| Bark | 设备 Key | 服务地址(留空使用 https://api.day.app) |
| 企业微信 | 机器人地址 | 无 |
| 钉钉 | 机器人地址 | 签名密钥(机器人启用「加签」时填写) |
| 飞书 | 机器人地址 | 签名密钥(机器人启用「签名校验」时填写) |
| 邮件 | 服务器、收件人,以及发件人或用户名至少填写一项 | 加密方式、端口、用户名、密码 |
| ntfy | 主题 | 服务地址(留空使用 https://ntfy.sh)、访问令牌 |
| Gotify | 服务地址、应用令牌 | 无 |
| Pushover | 应用令牌、用户 Key | 无 |
| Discord | Webhook 地址 | 无 |
| Slack | Webhook 地址 | 无 |
| Server酱 | SendKey | 无 |
| PushPlus | Token | 无 |
地址类字段需要以 http:// 或 https:// 开头的完整地址。
Webhook 模板变量
请求地址与请求体中可以使用以下变量,写法为花括号包住变量名(也兼容 # 前缀写法):
| 变量 | 内容 |
|---|---|
title | 标题,格式为 [Gately] 事件标题 |
message | 事件的详细描述 |
text | 完整正文,含描述、来源、级别、时间 |
type | 事件类型,如 ddns.changed |
source | 事件来源 |
level | 级别 info、warn 或 error |
time | RFC 3339 格式的时间 |
事件自带的附加字段(如 ip、container)也可以作为变量使用,名称与上表重复时以上表为准。地址中的变量值会做 URL 转义。
邮件
| 加密方式 | 取值 | 默认端口 |
|---|---|---|
| STARTTLS | starttls | 587 |
| SSL/TLS | tls | 465 |
| 无加密 | none | 25 |
端口填 0 时按加密方式取默认端口。收件人可以填多个,用逗号分隔。邮件使用 UTF-8 编码的纯文本,服务器支持 AUTH 且填写了用户名时使用 PLAIN 认证;发件人留空时使用用户名。
签名与返回码
- 钉钉:填写签名密钥后,请求自动附带
timestamp与sign。 - 飞书:填写签名密钥后,请求体自动附带
timestamp与sign。 - 企业微信、钉钉、飞书、Bark 会检查响应中的业务返回码,HTTP 200 但业务失败时同样记为投递失败。
规则
点击「添加规则」:
| 字段 | 说明 |
|---|---|
| 名称 | 必填 |
| 事件 | 至少一项。可选具体事件类型,* 表示全部事件,也可以输入通配,如 ddns.*。通配采用 Go path.Match 语法 |
| 最低级别 | info(信息)、warn(警告)、error(错误),留空为信息。事件级别低于该值时不推送 |
| 渠道 | 至少一个 |
| 静默(秒) | 同一规则下,同一来源的同类型事件在该时间内只推送一次,期间的重复事件被丢弃。0 表示不去重 |
| 启用 | 开关 |
提示
WAF 拦截和上游状态变化可能频繁发生,建议为这类规则设置 300 秒以上的静默时间。
规则模板
新建规则时可以点击模板预填事件、级别与静默时间,再选择渠道保存:
| 模板 | 事件 |
|---|---|
| 关键故障 | DDNS 更新失败、证书续期失败、上游不可用、子进程异常退出、备份失败、容器退出 |
| 证书到期 | 证书即将到期、续期失败(静默 24 小时) |
| 地址变化 | DDNS 解析更新、STUN 地址变化 |
| 服务健康 | 上游不可用与恢复、容器退出、子进程退出 |
| 安全与登录 | 登录失败、IP 封禁、登录成功、访问敏感内容 |
| 配置变更 | 管理后台的每一次配置变更 |
事件类型
| 事件类型 | 名称 | 级别 | 触发条件 |
|---|---|---|---|
ddns.changed | 动态域名:解析已更新 | 信息 | DDNS 任务成功更新解析 |
ddns.failed | 动态域名:更新失败 | 错误 | DDNS 任务更新失败 |
stun.changed | STUN:穿透地址变化 | 信息 | STUN 规则的穿透地址变化 |
ssl.expiring | 证书:即将到期 | 警告 | 证书剩余有效期不足 7 天,同一证书每 24 小时最多提醒一次 |
ssl.renew_failed | 证书:续期失败 | 错误 | 证书签发或续期失败 |
waf.blocked | WAF:拦截请求 | 警告 | WAF 拦截了一个请求,附带 ip、host、path 字段 |
upstream.down | 反向代理:上游不可用 | 错误 | Web 服务的某个后端被判定不可用 |
upstream.up | 反向代理:上游恢复 | 信息 | 不可用的后端恢复 |
docker.exited | Docker:容器退出 | 警告或错误 | 容器以非零退出码退出(警告),或因内存不足被终止(错误) |
process.exited | 子进程异常退出 | 错误 | 由 Gately 托管的子进程异常退出并将自动重启,来源为该进程的日志名称 |
backup.done | 备份:完成 | 信息 | 定时或手动备份全部目的地成功,见配置备份 |
backup.failed | 备份:失败 | 错误 | 备份打包失败,或任一目的地写入失败 |
auth.failed | 认证:连续失败 | 警告 | 管理后台登录失败,附带 ip 字段 |
auth.banned | 认证:IP 已被封禁 | 警告 | Web 服务认证连续失败触发自动封禁 |
login.success | 管理后台:登录成功 | 信息 | 管理后台登录成功,附带 ip、user 字段 |
audit.change | 管理后台:配置变更 | 信息 | 管理后台中的任意变更操作,附带 actor、ip、method、path 字段,见审计与配置历史 |
audit.access | 管理后台:访问敏感内容 | 警告 | 下载备份、诊断包、证书私钥或打开终端等,字段同上 |
notify.test | 测试通知 | 信息 | 渠道的「测试」按钮产生,不参与规则匹配 |
测试发送
渠道卡片上的「测试」按钮会向该渠道直接发送一条标题为「测试通知」的消息,不经过规则,也不要求渠道已启用。发送成功提示「测试通知已发送」,失败时显示具体错误。测试结果同样出现在「最近投递」中,规则列显示为「测试」。
对应接口为 POST /api/notify/channels/{key}/test,可通过 API 令牌 的 notify:write 权限调用。