通知センター
通知センターは Gately 内部のイベントバスを購読し、ルールに従って、DDNS の変更、証明書の期限、WAF のブロック、プロセスの異常などのイベントを Webhook、Telegram、Bark、ntfy、Gotify、Pushover、Discord、Slack、ServerChan、PushPlus、WeCom、DingTalk、Feishu、メールに通知します。管理画面はサイドバーの「システム」グループ → 「通知センター」にあります。
仕組み
- 各モジュールは状態が変化したときにプロセス内のイベントバスへイベントを発行します。発行が業務処理をブロックすることはありません。
- 通知センターはイベントを受け取ると、ルールを 1 件ずつ照合します。条件は、ルールが有効であること、イベントのレベルがルールの最低レベル以上であること、イベントの種類がルールのイベント一覧に一致することです。
- 一致したルールは、抑制による重複排除を経て、ルールで選択した有効なチャネルにメッセージを配信します。同じイベントが複数のルールに一致した場合でも、同じチャネルへの送信は 1 回だけです。
- 配信ごとの結果(成功または失敗の理由)は「最近の配信」に書き込まれ、メモリ上に直近 200 件が保持されます。失敗した場合はモジュールのログにも書き込まれます。
1 回の配信のタイムアウトは 45 秒です。
チャネル
「チャネルを追加」を押し、種類を選んでフィールドを入力します。すべてのチャネルに、名前(必須)、メモ、有効化スイッチがあります。シークレット系のフィールドは保存後に再表示されず、編集時に空欄にすると元の値が保持されます。
| 種類 | 必須フィールド | 任意フィールド |
|---|---|---|
| Webhook | リクエスト URL | メソッド(デフォルトは GET。GET、POST、PUT、PATCH から選択)、ヘッダー(1 行に Key: Value)、ボディ、成功判定の内容、タイムアウト(秒、デフォルトは 20)、証明書検証のスキップ |
| Telegram | Bot Token、Chat ID | API URL(空欄で https://api.telegram.org を使用) |
| Bark | デバイスキー | サービス URL(空欄で https://api.day.app を使用) |
| WeCom | ボットの URL | なし |
| DingTalk | ボットの URL | 署名シークレット(ボットで「加签(署名)」を有効にしている場合に入力) |
| Feishu | ボットの URL | 署名シークレット(ボットで「签名校验(署名の検証)」を有効にしている場合に入力) |
| メール | サーバー、宛先、および送信元またはユーザー名の少なくとも一方 | 暗号化方式、ポート、ユーザー名、パスワード |
| ntfy | トピック | サーバー URL(空欄の場合は https://ntfy.sh)、アクセストークン |
| Gotify | サーバー URL、アプリケーショントークン | なし |
| Pushover | アプリケーショントークン、ユーザーキー | なし |
| Discord | Webhook URL | なし |
| Slack | Webhook URL | なし |
| ServerChan | SendKey | なし |
| PushPlus | Token | なし |
URL 系のフィールドには、http:// または https:// で始まる完全なアドレスが必要です。
Webhook のテンプレート変数
リクエスト URL とボディでは、次の変数を使えます。波括弧で変数名を囲んで書きます(# を前置する書き方にも対応しています)。
| 変数 | 内容 |
|---|---|
title | タイトル。形式は [Gately] イベントのタイトル |
message | イベントの詳細な説明 |
text | 説明、送信元、レベル、日時を含む完全な本文 |
type | イベントの種類。例:ddns.changed |
source | イベントの送信元 |
level | レベル info、warn、error |
time | RFC 3339 形式の日時 |
イベント自体が持つ追加フィールド(ip、container など)も変数として使えます。名前が上の表と重なる場合は、上の表が優先されます。URL に含まれる変数の値は URL エスケープされます。
メール
| 暗号化方式 | 値 | デフォルトのポート |
|---|---|---|
| STARTTLS | starttls | 587 |
| SSL/TLS | tls | 465 |
| 暗号化なし | none | 25 |
ポートに 0 を指定すると、暗号化方式に応じたデフォルトのポートが使われます。宛先は複数指定でき、カンマで区切ります。メールは UTF-8 エンコードのプレーンテキストで、サーバーが AUTH に対応していてユーザー名が入力されている場合は PLAIN 認証が使われます。送信元が空欄の場合はユーザー名が使われます。
署名とリターンコード
- DingTalk:署名シークレットを入力すると、リクエストに
timestampとsignが自動で付加されます。 - Feishu:署名シークレットを入力すると、リクエストボディに
timestampとsignが自動で付加されます。 - WeCom、DingTalk、Feishu、Bark は、レスポンスの業務リターンコードを確認します。HTTP 200 でも業務として失敗した場合は、同様に配信失敗として記録されます。
ルール
「ルールを追加」を押します。
| フィールド | 説明 |
|---|---|
| 名前 | 必須 |
| イベント | 1 件以上。具体的なイベントの種類を選べるほか、* はすべてのイベントを表し、ddns.* のようなワイルドカードも入力できます。ワイルドカードには Go の path.Match 構文を使います |
| 最低レベル | info(情報)、warn(警告)、error(エラー)。空欄は情報です。イベントのレベルがこの値より低い場合は通知されません |
| チャネル | 1 つ以上 |
| 抑制(秒) | 同じルールで、同じ送信元の同じ種類のイベントは、この時間内に 1 回だけ通知され、その間の重複イベントは破棄されます。0 は重複排除なしです |
| 有効化 | スイッチ |
ヒント
WAF のブロックやアップストリームの状態変化は頻繁に起こりうるため、こうしたルールには 300 秒以上の抑制時間を設定することをおすすめします。
ルールテンプレート
ルールを新規作成するときにテンプレートをクリックすると、イベント、レベル、抑制時間があらかじめ入力されます。あとはチャネルを選んで保存します。
| テンプレート | イベント |
|---|---|
| 重大な障害 | DDNS の更新失敗、証明書の更新失敗、アップストリームの停止、子プロセスの異常終了、バックアップ失敗、コンテナの終了 |
| 証明書の期限 | 証明書の期限が近い、更新失敗(抑制 24 時間) |
| アドレス変更 | DDNS レコードの更新、STUN アドレスの変更 |
| サービスの状態 | アップストリームの停止と復旧、コンテナの終了、子プロセスの終了 |
| セキュリティとログイン | ログイン失敗、IP のブロック、ログイン成功、機密情報へのアクセス |
| 設定変更 | 管理画面で行われたすべての設定変更 |
イベントの種類
| イベントの種類 | 名前 | レベル | 発生条件 |
|---|---|---|---|
ddns.changed | ダイナミック DNS:レコードを更新 | 情報 | DDNS タスクがレコードの更新に成功した |
ddns.failed | ダイナミック DNS:更新に失敗 | エラー | DDNS タスクの更新に失敗した |
stun.changed | STUN:穿孔アドレスの変化 | 情報 | STUN ルールの穿孔アドレスが変化した |
ssl.expiring | 証明書:まもなく期限切れ | 警告 | 証明書の残りの有効期間が 7 日未満。同じ証明書については 24 時間に 1 回まで通知 |
ssl.renew_failed | 証明書:更新に失敗 | エラー | 証明書の発行または更新に失敗した |
waf.blocked | WAF:リクエストをブロック | 警告 | WAF がリクエストをブロックした。ip、host、path フィールドが付く |
upstream.down | リバースプロキシ:アップストリーム利用不可 | エラー | Web サービスのバックエンドが利用不可と判定された |
upstream.up | リバースプロキシ:アップストリーム復帰 | 情報 | 利用不可だったバックエンドが復帰した |
docker.exited | Docker:コンテナが終了 | 警告またはエラー | コンテナが 0 以外の終了コードで終了した(警告)、またはメモリ不足で強制終了された(エラー) |
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 | テスト通知 | 情報 | チャネルの「テスト」ボタンで発生する。ルールの照合には関与しない |
テスト送信
チャネルカードの「テスト」ボタンは、そのチャネルに「テスト通知」というタイトルのメッセージを直接送信します。ルールは経由せず、チャネルが有効であることも求められません。送信に成功すると「テスト通知を送信しました」と表示され、失敗した場合は具体的なエラーが表示されます。テストの結果も「最近の配信」に表示され、ルールの列には「テスト」と表示されます。
対応する API は POST /api/notify/channels/{key}/test で、API トークン の notify:write 権限で呼び出せます。