Webhook 与事件
每当发生值得关注的事情时,面板都会产生一个事件:某位客户的流量即将用完、某个节点宕机、有人从新地址登录、某次备份失败。Webhook 订阅者是你的一个地址,它以签名 HTTPS 请求的形式接收自己订阅的事件。本页介绍如何添加订阅者、检查哪些事件已送达,以及设置告警阈值。它位于 服务 → Webhook。


Telegram 聊天和电子邮件地址通过各自的页面接收同样的事件:参见 Telegram 和 邮件。所有事件及其字段都列在 事件目录 中;事件总线的内部原理见 事件总线。
添加订阅者
- 点击 添加。
- 名称:接收方是什么。
- 地址:面板通过
POST发送每个事件的目标。 - 事件:保持 全部事件 即接收所有事件(包括以后版本新增的事件),或取消勾选后自行选择。
- 仅限关于:保持 所有人,或选择一个账户,只接收与它相关的事件:某代理商的用户、它自己的登录。
- 所属:保持 无插件(手动 Webhook),除非接收方是你自己在面板旁运行的插件(见下文)。
- 点击 保存。
随后面板会显示一次 签名密钥。把它交给接收方,接收方用它来确认请求确实来自你的面板。
在某行点击 发送测试事件 会立即向该订阅者发送一个 panel.ping,并显示接收方的响应。
允许哪些地址
在这里填写的地址不能指向面板自身所在的主机或其内网:面板连接时会拒绝环回地址、私有地址段、链路本地地址以及类似地址。这可以防止 Webhook 被用来访问本应只在内部使用的服务。
属于某个插件令牌的 Webhook(所属)可以访问本主机及其内网,例如 Docker 网络,因为在面板旁运行的插件就在那里。链路本地地址和元数据地址对它同样被拒绝。所属 以后不能修改。签名插件会自行注册自己的 Webhook;参见 扩展页面。
投递的内容
每个事件都是一个带 JSON 请求体的 POST:
{
"v": 1,
"id": 4182,
"event": "node.disconnected",
"time": 1760180000,
"data": { "nodeId": 3, "name": "de-1", "status": "error", "message": "connection refused" }
}以及以下头部:
| 头部 | 内容 |
|---|---|
X-Nexora-Event | 事件名称,与请求体中相同 |
X-Nexora-Delivery | 本次投递的 id;每次重试都相同 |
X-Nexora-Signature | t=<unix seconds>,v1=<hex> |
v1 的值是 HMAC-SHA256(secret, "<t>.<body>"):时间戳、一个点,然后是与收到的内容完全一致的原始请求体。接收方用自己的密钥计算同样的值,以恒定时间比较二者,并拒绝 t 与自身时钟相差超过五分钟的请求。完整的信封格式和示例见 事件目录。
2xx 响应表示投递成功。其他任何响应(包括重定向),或十秒内没有响应,都视为失败。不会跟随重定向。
载荷很精简:只有 id、名称和数字,从不包含密码、密钥或订阅链接。需要更多信息的接收方可以使用令牌从 API 读取(参见 API 令牌)。
重试与连续失败
投递失败后,会在 30 秒后重试,之后每次间隔加倍,最长每小时一次,并加入少量随机偏移,以免恢复的接收方同时被所有重试冲击。重试十次后,该投递被放弃,标记为 已放弃。整个过程大约持续三个小时。
发往同一订阅者的投递逐个按顺序进行,因此接收方总是先看到 user.disabled,再看到随后的 user.enabled。
持续失败的订阅者会被自动关闭,但只有同时满足两个条件时才会关闭:连续失败五十次,且第一次失败发生在一天以前。宕机一小时的接收方不会被关闭,因此恢复后能收到积压的事件。被关闭的订阅者会显示失败的尝试次数。修复接收方后,重新打开该订阅者即可,计数会从头开始。
每个已放弃的投递都会计入面板的监控指标,因此你可以从外部对其设置告警:参见 监控与指标。
投递记录
在某行点击 投递记录 会列出发送给该订阅者的内容:事件、时间、尝试次数、接收方的状态码、错误,以及状态(等待中、已送达 或 已放弃);对于等待中的投递,还会显示下次尝试的时间。
在任意投递上点击 重新发送 会把它再次加入队列,并重新开始计算尝试次数。它保留原来的 X-Nexora-Delivery id,因此会忽略已见过 id 的接收方也会忽略它。
投递记录默认保留七天。event_retention_days 设置(最多 90)可以修改保留时间,使用 nexora-panel config set 设置(参见 命令行)。
轮换密钥
在某行点击 轮换密钥 会生成一个新的签名密钥,并显示一次。请先更新接收方:旧密钥从下一次投递起失效。
标记为 未签名 的订阅者是从旧版面板的单个 Webhook 地址迁移而来的,没有密钥,因此它的投递不带签名。请为它轮换一个密钥,并交给接收方。
主机告警
主机告警 卡片设置面板何时产生节点告警:
| 字段 | 默认值 | 产生的事件 |
|---|---|---|
| 磁盘占用 | 90 % | 节点根文件系统超过该值时产生 node.disk_high,回落到低于该值五个百分点时产生 node.disk_recovered |
| 内存占用 | 90 % | 以同样的方式产生 node.memory_high 和 node.memory_recovered |
| 每小时被拒绝的连接数 | 100 | 某个节点在一个滑动小时内通过某个拦截出站拒绝的连接数超过该值时,产生 node.rejections_high |
磁盘和内存每五分钟从每个已连接的节点读取一次。拒绝计数由节点本身在每次心跳时上报:它统计通过拦截出站被拒绝的连接,例如 torrent 预设的 block-torrent(参见 路由与 DNS)。每次越过阈值只产生一次告警,而不是每次读数或每个连接都产生一次。0 表示关闭该告警。
账号预警
账号预警 卡片设置两种针对仍可使用的账户的预警:
| 字段 | 默认值 | 产生的事件 |
|---|---|---|
| 已用流量 | 80 % | 账户的用量超过其流量的这一比例时产生 user.quota_warning |
| 到期前天数 | 7,1 | 账户进入到期日前的某个时间窗口时产生 user.expiring |
多个天数用逗号分隔;发送的是已越过的最紧急的那一个。每个预警只发送一次,并会自动重新生效:续费、增加流量或重置用量都会重新开始倒计时。0 表示关闭该预警。
插件的 Webhook
由插件持有的 Webhook 会显示 扩展:名称 标签。它不能在这里编辑或删除;请在 扩展页面 页面随插件一起管理。如果它因连续失败被关闭,仍然可以在这里重新打开它的开关。
