Бэкапы: образцы настроек ведут алерты в тему «Metrics», неработавший сторож доступности удалён #3559
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3559
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/backup-notify-topic"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
#3164. Уведомления бэкапов уходят не в ту тему
Что было
В issue предположили, что
TELEGRAM_TOPIC_IDне задан. Проверил на хостах 17.09 (только чтение): переменная задана, но в ней не та тема./opt/gendesign/secrets/backup-notify.env(сторожа forgejo/couchdb и бэкап волта)TELEGRAM_TOPIC_ID=158/opt/gendesign/secrets/forgejo-backup.env(бэкап Forgejo)TELEGRAM_TOPIC_ID=158/etc/default/gendesign-backup(backup.sh, backup-tradein-db.sh, сторожа, env-offbox)TELEGRAM_TOPIC_ID=158158 — тема «алерты». По решению владельца в #3163 туда идут только клиентские инциденты. Инфраструктура, а значит и бэкапы, должна идти в 245 «Metrics».
Почему это не видно из репозитория
Тема задаётся только env-файлом на хосте. В образцах
ops/gendesign-backup*.default.exampleеё не было совсем. Поэтому следующий, кто заводит хост по образцу, отправит алерты в общую тему.Есть и неочевидная ловушка.
notify()читаетBACKUP_ENV_FILE, только если в окружении нет токена или чата. Если положить тему в другой файл, она молча не подхватится.Что сделано
gendesign-backup,-couchdbи-forgejoдобавлена строка#TELEGRAM_TOPIC_ID=245. Рядом записаны причина (#3163) и ловушка «тема в одном файле с токеном и чатом». В образце forgejo блока Telegram не было вовсе, хотя на продеforgejo-backup.envдержит канал именно там.ops/crontab-beget.cronсверен с живым crontab Beget. В живом у двух сторожей и у бэкапа волта стоитBACKUP_ENV_FILE=/opt/gendesign/secrets/backup-notify.env, в репозитории его не было. В/etc/default/gendesign-backupна Beget канала нет, так что переустановка crontab из репозитория молча заглушила бы алерты бэкапов. После правки строки без комментариев совпадают сcrontab -lна обоих хостах:diffпустой для Beget и для Poincare.ops/uptime-healthcheck.shиops/gendesign-uptime.default.exampleудалены. Смежный вопрос issue: «не нужен или забыт при переезде». Замер 17.09:gendesignна Beget и на Poincare, нет в/etc/cron.dи в systemd-таймерах обоих хостов. Файла/etc/default/gendesign-uptimeна Poincare тоже нет. #3119 фиксировал то же 27.08.uptime_monitor):https://gendsgn.ru/и/healthпроверяются раз в 60 с,meraocenka.ruтоже раз в 60 с, плюс Forgejo, GlitchTip и CouchDB. Мониторы живые: последние смены состояния 11.09 (/health) и 12.09 (лэндинг Меры). Уведомления по ним создаются (alerts_notification, 17.09). Один из вебхуков идёт наmetrics.gendsgn.ru, это 46.173.16.127, то есть Beget, и от Poincare он не зависит.lib-backup.sh,check-backup-staleness.sh,selectel-bootstrap.sh,deploy.ymlи из тестовtest_2203_notify_topic.py/test_3059_alert_retry.py.tradein-mvp/docker-compose.selectel.yml: там два упоминания скрипта в комментариях. Правка подtradein-mvp/**запустила бы deploy-tradein ради комментария. Поправить при следующей содержательной правке этого файла.Значение на хостах этот PR не меняет (158 → 245 нужно заменить руками, см. приёмку). Поэтому здесь нет
Closes: issue закроется после правки хостов.Тест
test_host_po_obraztsu_shlyot_bekapy_v_metriki[3 образца]вbackend/tests/ops/test_2203_notify_topic.py. Тест запускает настоящийops/check-backup-staleness.shс отсутствующим маркером. В качествеBACKUP_ENV_FILEподаётся образец, заполненный по инструкции: строкиTELEGRAM_*раскомментированы, подставлены токен и чат. Вместоcurlстоит подставной скрипт, который записывает аргументы. Проверяется, что реально ушло бы в сеть:message_thread_idровно[245].До правки образцов тест красный на всех трёх образцах: у двух тема не передаётся, у forgejo
curlне вызывается вовсе.Прогоны
cd backend && uv run python -m pytest tests/ops -q -p no:cacheprovider→ 128 passed, 4 failed, rc=1. Все 4 падения — известныеtest_2203_backup_trailer_grep_dashdashна macOS (BSD mktemp), до правки было 131 passed / те же 4 failed. Разница −3: убраны параметры удалённого скрипта (−3 в test_2203, −3 в test_3059) и добавлены 3 новых теста.uv run python -m pytest tests/sql/test_auth_sql_migrations.py tests/test_2864_ruff_version_alignment.py -q→ 9 passed, rc=0. Первый читаетdeploy.yml.uv run ruff check→ All checks passed, rc=0.uv run ruff format --checkпо двум изменённым тестам → rc=0.bash -nдля изменённых.shи трёх образцов (они читаются черезsource) — ok. YAMLdeploy.ymlпарсится.Фальсификация
В
gendesign-backup.default.exampleтема заменена на158, вgendesign-backup-forgejo.default.exampleстрока темы удалена. Потом оба файла восстановлены из копий,diff -qчистый, снова 6 passed.Деплой
deploy.yml(ПТИЦА): путиops/*.sh,ops/*.cron,backend/**,.forgejo/workflows/deploy.yml. Он пересоздаёт backend, worker и beat на Poincare. Перед мержем стоит проверить, нет ли долгих задач Celery в работе. Миграций нет.deploy-tradein.ymlне запустится: подtradein-mvp/**ничего не менялось. Гейт поscrape_runsне нужен.Приёмка на проде (владелец или инженер с доступом к хостам, до 24.09.2026)
TELEGRAM_TOPIC_ID=158на245в трёх файлах из таблицы выше. Проверка:grep TELEGRAM_TOPIC_ID <файл>→245.set -a; . <файл>; set +a; curl -s https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage -d chat_id=$TELEGRAM_CHAT_ID -d message_thread_id=$TELEGRAM_TOPIC_ID -d text='проба темы бэкапов #3164' | python3 -c 'import json,sys; r=json.load(sys.stdin)["result"]; print(r.get("is_topic_message"), r.get("message_thread_id"))'. ОжидаетсяTrue 245.test ! -e /opt/gendesign/ops/uptime-healthcheck.sh && grep -c 'TELEGRAM_TOPIC_ID=245' /opt/gendesign/ops/gendesign-backup.default.example→1.🤖 Generated with Claude Code