feat(ops): запасной канал алертов на случай недоступного Telegram #3070

Merged
lekss361 merged 1 commit from feat/alert-fallback-smtp into main 2026-08-23 23:55:41 +00:00
Owner

Закрывает пункт «независимый от Telegram канал алертов» из #3059.

Проблема — самоскрывающаяся

notify() в ops/lib-backup.sh при отказе Telegram делал ровно это:

|| log "WARN: telegram sendMessage failed"

Алерт терялся. Оставалась строка в логе, который никто не читает, пока не случится беда. Канал, которым мы узнаём о проблемах, сам является проблемой — и через него же идут алерты бэкапов (ops/lib-backup.sh) и uptime-нотификации.

Это не гипотеза, а замер (#3059, 23.08): из семи публикуемых адресов api.telegram.org с Poincare отвечает ровно один149.154.167.220. Скан всей подсети 149.154.167.0/24 не нашёл больше ни одного. Через прокси Telegram не проходит вовсе (узлы российские). После переезда весь Telegram-канал висит на одном адресе, без запасного.

Решение

Почта — потому что проверена: с Poincare smtp.beget.com:465 OPEN (587 закрыт). Транспорт — тот же curl, который уже является жёсткой зависимостью этого файла; новых пакетов не требуется.

Правка ложится ровно в ту точку, которую файл сам объявляет расширением:

«No-op (logs only) when unset — this is the extension point: to wire a different channel later, edit ONLY this function»

Ситуация Поведение
Telegram ok как раньше
Telegram упал пробуем почту
Telegram не настроен пробуем почту
Почта не настроена громкая строка «АЛЕРТ НЕ ДОСТАВЛЕН»
Оба канала упали громкая строка с кодом возврата curl

Ничего не настроено → ведёт себя ровно как до правки. Кредов в репозитории нет: ALERT_SMTP_URL / ALERT_SMTP_USER / ALERT_SMTP_PASS / ALERT_MAIL_FROM / ALERT_MAIL_TO читаются из того же env-файла, что и Telegram.

Test plan

  • bash -n — синтаксис чист
  • Почта не настроенаАЛЕРТ НЕ ДОСТАВЛЕН (telegram недоступен, почта не настроена), rc=1
  • SMTP недоступен (smtps://127.0.0.1:9) → АЛЕРТ НЕ ДОСТАВЛЕН НИ ОДНИМ КАНАЛОМ (telegram упал, curl smtp rc=7), rc=1
  • notify() без Telegram сам зовёт запасной канал — проверено, обе строки в логе
  • Пароль не течёт в выводgrep -c SEKRET123 по всему выводу дал 0

Чего я НЕ проверил, и это важно

Успешную доставку письма не проверял. Для неё нужны настоящие SMTP-креды — это твоя часть. Три попытки поднять фейковый SMTP-сервер положительного контроля не дали (сначала неверный ответ на AUTH LOGINrc=67, потом слушатель без ответов, потом сломанный sed в тест-обвязке). Выдумывать «наверное работает» не стал: без положительного контроля успешные негативные тесты доказывают только то, что код правильно падает.

Так что перед тем как полагаться на этот канал, надо один раз отправить письмо с настоящими кредами и убедиться, что оно дошло. До этого момента правка строго не хуже текущего состояния: она добавляет громкий лог там, где раньше была тишина.

Что нужно от тебя, чтобы канал заработал

Дописать в /etc/default/gendesign-backup (и в тот же файл для tradein, если он отдельный):

ALERT_SMTP_URL=smtps://smtp.beget.com:465
ALERT_SMTP_USER=<ящик>
ALERT_SMTP_PASS=<пароль>
ALERT_MAIL_FROM=<от кого>
ALERT_MAIL_TO=<кому>

Затем один раз проверить доставку — например, временно убрав TELEGRAM_BOT_TOKEN, чтобы notify() пошёл по запасному пути.

Refs #3059, #3057

Закрывает пункт «независимый от Telegram канал алертов» из #3059. ## Проблема — самоскрывающаяся `notify()` в `ops/lib-backup.sh` при отказе Telegram делал ровно это: ```bash || log "WARN: telegram sendMessage failed" ``` Алерт **терялся**. Оставалась строка в логе, который никто не читает, пока не случится беда. Канал, которым мы узнаём о проблемах, сам является проблемой — и через него же идут алерты бэкапов (`ops/lib-backup.sh`) и uptime-нотификации. **Это не гипотеза, а замер** (#3059, 23.08): из семи публикуемых адресов `api.telegram.org` с Poincare отвечает **ровно один** — `149.154.167.220`. Скан всей подсети `149.154.167.0/24` не нашёл больше ни одного. Через прокси Telegram не проходит вовсе (узлы российские). После переезда весь Telegram-канал висит на одном адресе, без запасного. ## Решение Почта — потому что **проверена**: с Poincare `smtp.beget.com:465` OPEN (587 закрыт). Транспорт — тот же `curl`, который уже является жёсткой зависимостью этого файла; новых пакетов не требуется. Правка ложится ровно в ту точку, которую файл сам объявляет расширением: > *«No-op (logs only) when unset — this is the extension point: to wire a different channel later, edit ONLY this function»* | Ситуация | Поведение | |---|---| | Telegram ok | как раньше | | Telegram упал | пробуем почту | | Telegram не настроен | пробуем почту | | Почта не настроена | **громкая** строка «АЛЕРТ НЕ ДОСТАВЛЕН» | | Оба канала упали | **громкая** строка с кодом возврата curl | Ничего не настроено → ведёт себя **ровно как до правки**. Кредов в репозитории нет: `ALERT_SMTP_URL` / `ALERT_SMTP_USER` / `ALERT_SMTP_PASS` / `ALERT_MAIL_FROM` / `ALERT_MAIL_TO` читаются из того же env-файла, что и Telegram. ## Test plan - [x] `bash -n` — синтаксис чист - [x] **Почта не настроена** → `АЛЕРТ НЕ ДОСТАВЛЕН (telegram недоступен, почта не настроена)`, `rc=1` - [x] **SMTP недоступен** (`smtps://127.0.0.1:9`) → `АЛЕРТ НЕ ДОСТАВЛЕН НИ ОДНИМ КАНАЛОМ (telegram упал, curl smtp rc=7)`, `rc=1` - [x] **`notify()` без Telegram** сам зовёт запасной канал — проверено, обе строки в логе - [x] **Пароль не течёт в вывод** — `grep -c SEKRET123` по всему выводу дал **0** ### Чего я НЕ проверил, и это важно **Успешную доставку письма не проверял.** Для неё нужны настоящие SMTP-креды — это твоя часть. Три попытки поднять фейковый SMTP-сервер положительного контроля не дали (сначала неверный ответ на `AUTH LOGIN` → `rc=67`, потом слушатель без ответов, потом сломанный `sed` в тест-обвязке). Выдумывать «наверное работает» не стал: без положительного контроля успешные негативные тесты доказывают только то, что код правильно **падает**. Так что перед тем как полагаться на этот канал, надо один раз отправить письмо с настоящими кредами и убедиться, что оно дошло. До этого момента правка строго не хуже текущего состояния: она добавляет громкий лог там, где раньше была тишина. ## Что нужно от тебя, чтобы канал заработал Дописать в `/etc/default/gendesign-backup` (и в тот же файл для tradein, если он отдельный): ``` ALERT_SMTP_URL=smtps://smtp.beget.com:465 ALERT_SMTP_USER=<ящик> ALERT_SMTP_PASS=<пароль> ALERT_MAIL_FROM=<от кого> ALERT_MAIL_TO=<кому> ``` Затем один раз проверить доставку — например, временно убрав `TELEGRAM_BOT_TOKEN`, чтобы `notify()` пошёл по запасному пути. Refs #3059, #3057
lekss361 added 1 commit 2026-08-23 23:53:54 +00:00
feat(ops): запасной канал алертов на случай недоступного Telegram
All checks were successful
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
568d82919d
До этого единственным каналом был Telegram, и при его недоступности
notify() ограничивался `|| log "WARN"`. То есть алерт ТЕРЯЛСЯ: оставалась
строка в логе, который никто не читает, пока не случится беда. Канал,
которым мы узнаём о проблемах, сам является проблемой — поломка скрывает
сама себя.

Это не гипотеза. Замер с нового хоста (#3059, 23.08): из семи публикуемых
адресов api.telegram.org с Poincare отвечает РОВНО ОДИН (149.154.167.220),
скан всей подсети 149.154.167.0/24 не нашёл ни одного другого. Через прокси
Telegram не проходит вовсе — узлы российские. После переезда весь
Telegram-канал висит на одном адресе без запасного, и через него же идут
алерты бэкапов и uptime-нотификации.

Почта выбрана потому, что проверена: с Poincare smtp.beget.com:465 OPEN
(587 закрыт). Транспорт — тот же curl, который уже жёсткая зависимость
lib-backup.sh; новых пакетов не нужно.

Правка ложится ровно в ту точку, которую сам файл объявляет расширением:
«to wire a different channel later, edit ONLY this function».

Поведение:
  telegram ok            -> как раньше
  telegram упал          -> пробуем почту
  telegram не настроен   -> пробуем почту
  почта не настроена     -> ГРОМКАЯ строка «АЛЕРТ НЕ ДОСТАВЛЕН»
  оба канала упали       -> ГРОМКАЯ строка с кодом возврата curl

Ничего не настроено -> ведёт себя ровно как до правки. Кредов в
репозитории нет, читаются из того же env-файла, что и Telegram.

Проверено (bash -n + прогон всех веток):
  - почта не настроена  -> «АЛЕРТ НЕ ДОСТАВЛЕН (...не настроена)», rc=1
  - SMTP недоступен     -> «НИ ОДНИМ КАНАЛОМ (... curl smtp rc=7)», rc=1
  - notify() без telegram сам зовёт запасной канал
  - пароль в выводе: 0 вхождений (специально проверил grep'ом)

НЕ проверена успешная доставка: для неё нужны настоящие SMTP-креды, а это
часть владельца. Три попытки поднять фейковый SMTP-сервер положительный
контроль не дали, выдумывать результат не стал — см. test plan в PR.

Refs #3059, #3057
lekss361 merged commit 3a7fc2ff65 into main 2026-08-23 23:55:41 +00:00
lekss361 deleted branch feat/alert-fallback-smtp 2026-08-23 23:55:41 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3070
No description provided.