fix(ops): закрепить рабочий адрес api.telegram.org на новом хосте #3060
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#3060
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/telegram-pin-selectel-override"
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?
Снимает блокер переезда из #3059. Окно 30.08.
Что обнаружено замером
У
api.telegram.orgсемь публикуемых адресов. С Poincare отвечает ровно один:149.154.167.220149.154.166.110← отдаёт резолвер149.154.167.99149.154.175.100/149.154.171.5/91.108.4.5/91.108.56.130Скан всего
149.154.167.0/24подтвердил: живой адрес один во всём блоке.Это не блокировка Selectel и не наш файрвол. С Beget отвечают три адреса из тех же семи, включая тот, что отдаёт DNS. Telegram частично фильтруется у обоих провайдеров, просто Beget попадает на живой адрес через штатный резолвер, а Selectel нет.
Через прокси ASocks Telegram не проходит ни с одного из четырёх узлов (все
000) — узлы российские. Этот путь закрыт, обход только через закрепление IP.Чем это грозило
tradein-tgbotработает на long-polling: сам ходит наружу, входящих не слушает. Резолвит мёртвый адрес, виснет на таймауте,restart: unless-stoppedподнимает заново, он снова резолвит тот же адрес и снова виснет. Ни краша, ни строки в логе.Вместе с ботом молча ложится канал, которым мы узнали бы о любой другой поломке — уведомления о бэкапах и uptime-нотификации.
Закреплены все три потребителя, а не только бот
Разведка показала, что в Telegram ходит не один сервис. Починить бота и оставить остальных значило бы сделать треть и выглядеть готовым.
tradein-tgbotextra_hostsв новомdocker-compose.selectel.ymltradein-backendapi/v1/glitchtip.py(пересылка алертов GlitchTip) иapi/v1/support.pyтоже бьют httpx вapi.telegram.orgops/lib-backup.sh,ops/uptime-healthcheck.shselectel-bootstrap.sh— запись в/etc/hosts;extra_hostsим не помогаетbackendломается заметнее бота — per-request, а не long-poll, — но ломается, и вместе с ним пересылка алертов.Почему отдельный файл, а не правка
docker-compose.prod.ymlНа Beget закрепление не нужно: там резолвер отдаёт рабочий адрес. Менять поведение действующего прода ради хоста, который ещё не в проде, нельзя. Оверрайд просто не передаётся в
-f— нулевой риск.Применяется на новом хосте так:
Адрес — переменная, а не константа
TELEGRAM_API_IPс дефолтом149.154.167.220. Если он умрёт, правка — одна переменная окружения и--force-recreate, без релиза.Шаг bootstrap проверяет не факт записи в
/etc/hosts, а что Bot API реально отвечает:401на заведомо фиктивный токен означает, что до API достучались. При другом коде печатает готовую команду поиска нового живого адреса по подсети.Проверка
docker compose configв двух вариантах, diff:Ровно две вставки, больше ничего не изменилось. С
TELEGRAM_API_IP=1.2.3.4подстановка срабатывает в обеих.bash -nна bootstrap чистый.⚠️ Точка отказа названа осознанно
149.154.167.220— единственный живой адрес во всём/24с этого хоста. Запасного нет. Если он умрёт, бот снова умрёт молча, а канал оповещения об этом сам идёт через Telegram — поломка скрывает сама себя.Поэтому закрепление необходимо, но не достаточно. Нужен независимый канал алертов. Кандидат проверен: с Poincare
smtp.beget.com:465открыт (587 закрыт), плюс GlitchTip остаётся на Beget и доступен по имени. Это отдельная задача, в этот PR не входит — но без неё риск остаётся.Refs #3059, #3057, #2989