feat(ops): запасной канал алертов на случай недоступного Telegram (#3070)
All checks were successful
Deploy / build-backend (push) Has been skipped
Deploy / build-frontend (push) Has been skipped
Deploy / deploy-caddy (push) Has been skipped
Deploy / deploy (push) Successful in 1m18s
Deploy / changes (push) Successful in 7s
Deploy / build-worker (push) Has been skipped
Deploy / deploy-status (push) Successful in 1s
Deploy / perimeter-smoke (push) Successful in 8s
All checks were successful
Deploy / build-backend (push) Has been skipped
Deploy / build-frontend (push) Has been skipped
Deploy / deploy-caddy (push) Has been skipped
Deploy / deploy (push) Successful in 1m18s
Deploy / changes (push) Successful in 7s
Deploy / build-worker (push) Has been skipped
Deploy / deploy-status (push) Successful in 1s
Deploy / perimeter-smoke (push) Successful in 8s
This commit is contained in:
parent
91731ddb5f
commit
3a7fc2ff65
1 changed files with 56 additions and 1 deletions
|
|
@ -41,6 +41,7 @@ notify() {
|
||||||
|
|
||||||
if [[ -z "${TELEGRAM_BOT_TOKEN:-}" || -z "${TELEGRAM_CHAT_ID:-}" ]]; then
|
if [[ -z "${TELEGRAM_BOT_TOKEN:-}" || -z "${TELEGRAM_CHAT_ID:-}" ]]; then
|
||||||
log "NOTIFY (telegram disabled — set TELEGRAM_BOT_TOKEN/TELEGRAM_CHAT_ID in ${backup_env}): $text"
|
log "NOTIFY (telegram disabled — set TELEGRAM_BOT_TOKEN/TELEGRAM_CHAT_ID in ${backup_env}): $text"
|
||||||
|
notify_fallback_mail "$text"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -50,7 +51,61 @@ notify() {
|
||||||
-d "disable_web_page_preview=true" \
|
-d "disable_web_page_preview=true" \
|
||||||
--data-urlencode "text=${text}" \
|
--data-urlencode "text=${text}" \
|
||||||
>/dev/null 2>&1 \
|
>/dev/null 2>&1 \
|
||||||
|| log "WARN: telegram sendMessage failed"
|
|| { log "WARN: telegram sendMessage failed — пробую запасной канал"; \n notify_fallback_mail "$text"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- запасной канал оповещения (#3059) ----------------------------------
|
||||||
|
# Зачем: раньше единственным каналом был Telegram, и `|| log WARN` означало,
|
||||||
|
# что при его недоступности алерт просто ТЕРЯЛСЯ — оставалась строка в логе,
|
||||||
|
# который никто не читает, пока не случится беда. Самоскрывающаяся поломка:
|
||||||
|
# канал, которым мы узнаём о проблемах, сам и есть проблема.
|
||||||
|
#
|
||||||
|
# Это не паранойя, а замер (#3059, 2026-08-23): с нового хоста Poincare из семи
|
||||||
|
# публикуемых адресов api.telegram.org отвечает РОВНО ОДИН (149.154.167.220),
|
||||||
|
# и скан всей подсети 149.154.167.0/24 не нашёл больше ни одного. Через прокси
|
||||||
|
# Telegram не проходит вовсе — узлы российские. После переезда весь
|
||||||
|
# Telegram-канал висит на одном адресе, без запасного.
|
||||||
|
#
|
||||||
|
# Почему почта: с Poincare проверено — smtp.beget.com:465 OPEN (587 закрыт).
|
||||||
|
# Транспорт — тот же curl, который уже является жёсткой зависимостью файла;
|
||||||
|
# новых пакетов не требуется.
|
||||||
|
#
|
||||||
|
# Настраивается тем же env-файлом, что и Telegram. Не задано — ведёт себя как
|
||||||
|
# раньше. Кредов в репозитории нет:
|
||||||
|
# ALERT_SMTP_URL=smtps://smtp.beget.com:465
|
||||||
|
# ALERT_SMTP_USER= / ALERT_SMTP_PASS= / ALERT_MAIL_FROM= / ALERT_MAIL_TO=
|
||||||
|
notify_fallback_mail() {
|
||||||
|
local text="$1"
|
||||||
|
|
||||||
|
if [[ -z "${ALERT_SMTP_URL:-}" || -z "${ALERT_SMTP_USER:-}" \
|
||||||
|
|| -z "${ALERT_SMTP_PASS:-}" || -z "${ALERT_MAIL_FROM:-}" \
|
||||||
|
|| -z "${ALERT_MAIL_TO:-}" ]]; then
|
||||||
|
# ГРОМКО: это последний рубеж, тишина здесь = потерянный алерт.
|
||||||
|
log "АЛЕРТ НЕ ДОСТАВЛЕН (telegram недоступен, почта не настроена): $text"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local subject body rc=0
|
||||||
|
subject=$(printf '%s' "$text" | head -c 120 | tr '\n' ' ')
|
||||||
|
body=$(printf 'From: %s\nTo: %s\nSubject: [gendesign] %s\n\n%s\n' \
|
||||||
|
"$ALERT_MAIL_FROM" "$ALERT_MAIL_TO" "$subject" "$text")
|
||||||
|
|
||||||
|
# Пароль идёт через --user, поэтому stderr curl целиком не печатаем — в нём
|
||||||
|
# может оказаться строка подключения. Логируем только код возврата.
|
||||||
|
printf '%s' "$body" | curl -fsS --max-time 30 --ssl-reqd \
|
||||||
|
--url "$ALERT_SMTP_URL" \
|
||||||
|
--user "${ALERT_SMTP_USER}:${ALERT_SMTP_PASS}" \
|
||||||
|
--mail-from "$ALERT_MAIL_FROM" \
|
||||||
|
--mail-rcpt "$ALERT_MAIL_TO" \
|
||||||
|
--upload-file - >/dev/null 2>&1 || rc=$?
|
||||||
|
|
||||||
|
if (( rc == 0 )); then
|
||||||
|
log "Алерт доставлен запасным каналом (почта) вместо Telegram"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "АЛЕРТ НЕ ДОСТАВЛЕН НИ ОДНИМ КАНАЛОМ (telegram упал, curl smtp rc=${rc}): $text"
|
||||||
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# --- sentinel (missed-run detection) ------------------------------------
|
# --- sentinel (missed-run detection) ------------------------------------
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue