通知中心
通知中心訂閱 Gately 內部的事件匯流排,依規則把 DDNS 變動、憑證到期、WAF 攔截、程序異常等事件推送到 Webhook、Telegram、Bark、ntfy、Gotify、Pushover、Discord、Slack、Server酱、PushPlus、企業微信(WeCom)、釘釘(DingTalk)、飛書(Feishu)和電子郵件。管理介面位於側邊欄「系統」分組 → 「通知中心」。
運作方式
- 各模組在狀態變動時向程序內事件匯流排發布事件,發布不會阻塞業務。
- 通知中心收到事件後逐條比對規則:規則已啟用、事件層級不低於規則的最低層級、事件類型符合規則的事件清單。
- 命中的規則經過靜默去重後,把訊息投遞到規則選擇的已啟用管道。同一事件命中多條規則時,同一管道只發送一次。
- 每次投遞的結果(成功或失敗原因)寫入「最近投遞」,記憶體中保留最近 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 權限呼叫。