Центр уведомлений
Центр уведомлений подписывается на внутреннюю шину событий Gately и по правилам отправляет события — смену DDNS, истечение сертификатов, блокировки WAF, аварии процессов и другие — в Webhook, Telegram, Bark, ntfy, Gotify, Pushover, Discord, Slack, ServerChan, PushPlus, WeCom, DingTalk, Feishu и по электронной почте. Интерфейс находится в боковой панели: группа «Система» → «Уведомления».
Принцип работы
- При смене состояния модули публикуют события в шину событий внутри процесса; публикация не блокирует основную работу.
- Получив событие, центр уведомлений последовательно сопоставляет его с правилами: правило включено, уровень события не ниже минимального уровня правила, тип события соответствует списку событий правила.
- Сработавшие правила проходят подавление дубликатов, после чего сообщение отправляется во включённые каналы, выбранные в правиле. Если событию соответствует несколько правил, в один канал сообщение уходит один раз.
- Результат каждой отправки (успех или причина ошибки) записывается в «Недавние отправки»; в памяти хранятся последние 200 записей, ошибки дополнительно попадают в журнал модуля.
Таймаут одной отправки — 45 секунд.
Каналы
Нажмите «Добавить канал», выберите тип и заполните поля. У каждого канала есть имя (обязательно), заметка и переключатель включения. Секретные поля после сохранения не отображаются; при редактировании пустое значение означает сохранение прежнего.
| Тип | Обязательные поля | Необязательные поля |
|---|---|---|
| Webhook | URL запроса | Метод запроса (по умолчанию GET, доступны GET, POST, PUT, PATCH), заголовки (по одному в строке в формате Key: Value), тело запроса, содержимое для признания успеха, таймаут (секунды, по умолчанию 20), пропуск проверки сертификата |
| Telegram | Bot Token, Chat ID | URL API (если оставить пустым, используется https://api.telegram.org) |
| Bark | Ключ устройства | URL сервиса (если оставить пустым, используется https://api.day.app) |
| WeCom | URL бота | Нет |
| DingTalk | URL бота | Секрет подписи (заполняется, если у бота включена «подпись») |
| Feishu | URL бота | Секрет подписи (заполняется, если у бота включена «проверка подписи») |
| Эл. почта | Сервер, получатели и хотя бы одно из полей «отправитель» или «имя пользователя» | Шифрование, порт, имя пользователя, пароль |
| ntfy | Тема (topic) | Адрес сервера (пусто — https://ntfy.sh), токен доступа |
| Gotify | Адрес сервера, токен приложения | Нет |
| Pushover | Токен приложения, User Key | Нет |
| Discord | Адрес webhook | Нет |
| Slack | Адрес webhook | Нет |
| ServerChan | SendKey | Нет |
| PushPlus | Token | Нет |
Поля с адресами требуют полный адрес, начинающийся с http:// или https://.
Переменные шаблона Webhook
В URL запроса и теле запроса можно использовать следующие переменные: имя переменной записывается в фигурных скобках (также поддерживается запись с префиксом #):
| Переменная | Содержимое |
|---|---|
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; если отправитель пуст, используется имя пользователя.
Подпись и коды ответа
- DingTalk: если указан секрет подписи, к запросу автоматически добавляются
timestampиsign. - Feishu: если указан секрет подписи, к телу запроса автоматически добавляются
timestampиsign. - Для WeCom, DingTalk, Feishu и Bark проверяется прикладной код ответа: если HTTP вернул 200, но на уровне сервиса произошла ошибка, отправка также считается неудачной.
Правила
Нажмите «Добавить правило»:
| Поле | Описание |
|---|---|
| Название | Обязательно |
| События | Хотя бы одно. Можно выбрать конкретные типы событий; * означает все события, также можно ввести шаблон, например ddns.*. Шаблоны используют синтаксис Go path.Match |
| Минимальный уровень | info (информация), warn (предупреждение), error (ошибка); если оставить пустым, то информация. События с более низким уровнем не отправляются |
| Каналы | Хотя бы один |
| Подавление (с) | Для одного правила однотипные события от одного источника отправляются только один раз за указанное время, повторы в этот период отбрасываются. 0 отключает подавление дубликатов |
| Включено | Переключатель |
Подсказка
Блокировки WAF и смены состояния upstream могут происходить очень часто, поэтому для таких правил рекомендуется задавать подавление не менее 300 секунд.
Шаблоны правил
При создании правила можно нажать на шаблон, чтобы заранее заполнить события, уровень и время подавления, а затем выбрать каналы и сохранить:
| Шаблон | События |
|---|---|
| Критические сбои | Сбой обновления DDNS, сбой продления сертификата, upstream недоступен, аварийное завершение дочернего процесса, сбой резервного копирования, контейнер завершился |
| Срок действия сертификатов | Сертификат скоро истечёт, сбой продления (подавление 24 часа) |
| Смена адреса | Запись DDNS обновлена, адрес STUN изменился |
| Состояние сервисов | Upstream недоступен и восстановлен, контейнер завершился, дочерний процесс завершился |
| Безопасность и входы | Неудачный вход, IP заблокирован, успешный вход, доступ к чувствительным данным |
| Изменения конфигурации | Каждое изменение конфигурации в панели управления |
Типы событий
| Тип события | Название | Уровень | Условие срабатывания |
|---|---|---|---|
ddns.changed | Динамический DNS: запись обновлена | Информация | Задание DDNS успешно обновило запись |
ddns.failed | Динамический DNS: ошибка обновления | Ошибка | Задание DDNS не смогло обновить запись |
stun.changed | STUN: изменился адрес обхода NAT | Информация | Изменился внешний адрес правила STUN |
ssl.expiring | Сертификат: скоро истекает | Предупреждение | До окончания срока действия сертификата осталось менее 7 дней; по одному сертификату напоминание не чаще раза в 24 часа |
ssl.renew_failed | Сертификат: ошибка продления | Ошибка | Не удалось выпустить или продлить сертификат |
waf.blocked | WAF: запрос заблокирован | Предупреждение | WAF заблокировал запрос; прилагаются поля ip, host, path |
upstream.down | Обратный прокси: upstream недоступен | Ошибка | Один из бэкендов веб-службы признан недоступным |
upstream.up | Обратный прокси: upstream восстановлен | Информация | Недоступный бэкенд восстановился |
docker.exited | Docker: контейнер завершился | Предупреждение или ошибка | Контейнер завершился с ненулевым кодом выхода (предупреждение) или был убит из-за нехватки памяти (ошибка) |
process.exited | Аварийное завершение дочернего процесса | Ошибка | Дочерний процесс, управляемый Gately, аварийно завершился и будет автоматически перезапущен; источником служит имя процесса в журнале |
backup.done | Резервное копирование: завершено | Информация | Плановое или ручное резервное копирование успешно записано во все назначения, см. Резервное копирование конфигурации |
backup.failed | Резервное копирование: ошибка | Ошибка | Не удалось упаковать копию или записать её в любое из назначений |
auth.failed | Аутентификация: подряд неудачные попытки | Предупреждение | Неудачные попытки входа в панель управления; прилагается поле ip |
auth.banned | Аутентификация: IP заблокирован | Предупреждение | Серия неудачных аутентификаций в веб-службе привела к автоматической блокировке |
login.success | Панель управления: успешный вход | Информация | Успешный вход в панель управления; прилагаются поля ip, user |
audit.change | Панель управления: изменение конфигурации | Информация | Любое изменяющее действие в панели управления; прилагаются поля actor, ip, method, path, см. Аудит и история конфигурации |
audit.access | Панель управления: доступ к чувствительным данным | Предупреждение | Скачивание резервной копии, диагностического пакета, закрытого ключа сертификата, открытие терминала и т. п.; поля те же |
notify.test | Тестовое уведомление | Информация | Создаётся кнопкой «Тест» канала, в сопоставлении с правилами не участвует |
Тестовая отправка
Кнопка «Тест» на карточке канала отправляет в этот канал сообщение с заголовком «Тестовое уведомление» напрямую, минуя правила, и не требует, чтобы канал был включён. При успехе показывается «Тестовое уведомление отправлено», при ошибке — конкретная причина. Результат теста также появляется в «Недавних отправках», в столбце правила отображается «Тест».
Соответствующий интерфейс — POST /api/notify/channels/{key}/test, его можно вызвать с правом notify:write у API-токена.