Переезд: понизить TTL на 13 доменах за 24–48 часов до окна #3027

Closed
opened 2026-08-21 12:54:58 +00:00 by lekss361 · 4 comments
Owner

Эпик: #2989

Почему отдельной задачей

Это единственный пункт переезда, который нельзя доделать задним числом. Всё остальное чинится в окне или после него; TTL — нет. Если войти в окно со стандартным TTL, часть клиентов и ботов будет ходить на старый IP ещё сутки после переключения, и никакие действия в этот момент уже не помогут.

Что сделать

  • За 24–48 часов до окна понизить TTL A-записей на всех 13 доменах, которые фронтит Caddy, до 300 с (или 60 с, если провайдер DNS позволяет без штрафа по запросам).
  • Составить и приложить к issue точный список 13 доменов с текущими TTL и провайдером DNS для каждого — сейчас он нигде не зафиксирован, живёт только как «13 сайтов зоопарка».
  • Проверить, что понижение реально доехало: dig +noall +answer <domain> с внешнего резолвера, а не из панели провайдера.
  • После успешного переключения и подтверждения, что трафик идёт на новый адрес, вернуть TTL обратно — иначе останется постоянная лишняя нагрузка на DNS.

Приёмка

  • Список 13 доменов с провайдером и исходным TTL зафиксирован в issue
  • TTL понижен, подтверждён внешним dig по каждому домену
  • В плане окна проставлена дата/время, когда понижать (окно минус 24–48 ч)
  • Пункт «вернуть TTL» внесён в постпереездный чеклист
Эпик: #2989 ## Почему отдельной задачей Это **единственный пункт переезда, который нельзя доделать задним числом**. Всё остальное чинится в окне или после него; TTL — нет. Если войти в окно со стандартным TTL, часть клиентов и ботов будет ходить на старый IP ещё сутки после переключения, и никакие действия в этот момент уже не помогут. ## Что сделать - За **24–48 часов до окна** понизить TTL A-записей на всех 13 доменах, которые фронтит Caddy, до 300 с (или 60 с, если провайдер DNS позволяет без штрафа по запросам). - Составить и приложить к issue **точный список 13 доменов** с текущими TTL и провайдером DNS для каждого — сейчас он нигде не зафиксирован, живёт только как «13 сайтов зоопарка». - Проверить, что понижение реально доехало: `dig +noall +answer <domain>` с внешнего резолвера, а не из панели провайдера. - **После** успешного переключения и подтверждения, что трафик идёт на новый адрес, вернуть TTL обратно — иначе останется постоянная лишняя нагрузка на DNS. ## Приёмка - [ ] Список 13 доменов с провайдером и исходным TTL зафиксирован в issue - [ ] TTL понижен, подтверждён внешним `dig` по каждому домену - [ ] В плане окна проставлена дата/время, когда понижать (окно минус 24–48 ч) - [ ] Пункт «вернуть TTL» внесён в постпереездный чеклист
lekss361 added the
chore
priority/p1
scope/devops
tradein
labels 2026-08-21 12:57:01 +00:00
Author
Owner

Список доменов и фактические TTL — замер 2026-08-23

Постановка говорила «13 доменов», не называя их и не фиксируя TTL. Снял с авторитетных серверов. Картина оказалась другой в двух местах.

Домены, которым DNS реально меняется

Зона gendsgn.ru (NS: ns1/ns2.beget.ru), авторитетный TTL = 600 с:

Домен Сейчас После окна
gendsgn.ru 46.173.16.127 188.246.224.93
www.gendsgn.ru 46.173.16.127 188.246.224.93
meraocenka.ru 46.173.16.127 188.246.224.93
merahome.ru 46.173.16.127 188.246.224.93
meraotsenka.ru 46.173.16.127 188.246.224.93

Зона prinzipevent.ru / microbeam.ru (зоопарк с 94.228.121.73), TTL = 300 с:

prinzipevent.ru, www.prinzipevent.ru, analytics, crm, map, meeting, gifts, svg, progroup, 3inrow (все .prinzipevent.ru), microbeam.ru, www.microbeam.ru12 записей, все → 94.228.121.73, поедут на 188.246.224.93 вместе с LXC (#3031).

Поправка 1: три домена вообще не трогаются

git.gendsgn.ru, errors.gendsgn.ru, obsidian.gendsgn.ru — Forgejo, GlitchTip и CouchDB остаются на Beget по целевой топологии. DNS у них не меняется, TTL понижать не нужно. В исходные «13» они, судя по всему, попали по ошибке.

Итого записей под понижение — 17, а не 13, и они в двух разных зонах с разными TTL и, возможно, разными панелями управления.

Поправка 2: pattern.prinzipevent.ru не имеет A-записи

Vhost в nginx на 94.228.121.73 есть, A-записи в DNS нет — dig возвращает пусто. Либо домен обслуживается иначе, либо vhost мёртвый. Выяснить до окна, иначе после переезда «сайт не открывается» спишут на миграцию.

Насколько это на самом деле жёсткий гейт

Мягче, чем считали. При TTL 600 с худший хвост устаревшей маршрутизации после переключения — 10 минут, а само окно по замеру перелива занимает около 6 минут. То есть даже без понижения TTL суммарная недоступность для самого невезучего клиента ~16 минут.

Понижение до 60 с за 24–48 ч до окна сокращает хвост с 10 минут до 1 — это дешёвая страховка, но не блокер, как считалось раньше. Для зоны зоопарка (300 с) выигрыш ещё меньше.

Что нужно сделать

  • Понизить TTL до 60 с на 5 записях зоны gendsgn.ruдо 28.08 при окне 30.08
  • Понизить TTL до 60 с на 12 записях зоны prinzipevent.ru / microbeam.ru — можно позже, вместе с #3031
  • Выяснить судьбу pattern.prinzipevent.ru
  • После окна и подтверждения работы — вернуть TTL к 600/300 с

Обе зоны правятся в панели регистратора/DNS, автоматизации под это в репо нет.

Refs #2989, #3031

## Список доменов и фактические TTL — замер 2026-08-23 Постановка говорила «13 доменов», не называя их и не фиксируя TTL. Снял с авторитетных серверов. Картина оказалась другой в двух местах. ### Домены, которым DNS реально меняется **Зона `gendsgn.ru` (NS: ns1/ns2.beget.ru), авторитетный TTL = 600 с:** | Домен | Сейчас | После окна | |---|---|---| | `gendsgn.ru` | 46.173.16.127 | 188.246.224.93 | | `www.gendsgn.ru` | 46.173.16.127 | 188.246.224.93 | | `meraocenka.ru` | 46.173.16.127 | 188.246.224.93 | | `merahome.ru` | 46.173.16.127 | 188.246.224.93 | | `meraotsenka.ru` | 46.173.16.127 | 188.246.224.93 | **Зона `prinzipevent.ru` / `microbeam.ru` (зоопарк с 94.228.121.73), TTL = 300 с:** `prinzipevent.ru`, `www.prinzipevent.ru`, `analytics`, `crm`, `map`, `meeting`, `gifts`, `svg`, `progroup`, `3inrow` (все `.prinzipevent.ru`), `microbeam.ru`, `www.microbeam.ru` — **12 записей**, все `→ 94.228.121.73`, поедут на `188.246.224.93` вместе с LXC (#3031). ### Поправка 1: три домена вообще не трогаются `git.gendsgn.ru`, `errors.gendsgn.ru`, `obsidian.gendsgn.ru` — Forgejo, GlitchTip и CouchDB **остаются на Beget** по целевой топологии. DNS у них не меняется, TTL понижать не нужно. В исходные «13» они, судя по всему, попали по ошибке. Итого записей под понижение — **17**, а не 13, и они в **двух разных зонах** с разными TTL и, возможно, разными панелями управления. ### Поправка 2: `pattern.prinzipevent.ru` не имеет A-записи Vhost в nginx на 94.228.121.73 есть, A-записи в DNS нет — `dig` возвращает пусто. Либо домен обслуживается иначе, либо vhost мёртвый. Выяснить до окна, иначе после переезда «сайт не открывается» спишут на миграцию. ### Насколько это на самом деле жёсткий гейт Мягче, чем считали. При TTL 600 с худший хвост устаревшей маршрутизации после переключения — **10 минут**, а само окно по замеру перелива занимает около 6 минут. То есть даже без понижения TTL суммарная недоступность для самого невезучего клиента ~16 минут. Понижение до 60 с за 24–48 ч до окна сокращает хвост с 10 минут до 1 — это дешёвая страховка, но не блокер, как считалось раньше. Для зоны зоопарка (300 с) выигрыш ещё меньше. ### Что нужно сделать - [ ] Понизить TTL до 60 с на 5 записях зоны `gendsgn.ru` — **до 28.08** при окне 30.08 - [ ] Понизить TTL до 60 с на 12 записях зоны `prinzipevent.ru` / `microbeam.ru` — можно позже, вместе с #3031 - [ ] Выяснить судьбу `pattern.prinzipevent.ru` - [ ] После окна и подтверждения работы — вернуть TTL к 600/300 с Обе зоны правятся в панели регистратора/DNS, автоматизации под это в репо нет. Refs #2989, #3031
Author
Owner

Замер DNS 2026-08-26 05:45 UTC — предпосылка задачи для доменов этого репозитория уже закрыта

Снято dig @8.8.8.8 с Poincare (внешний резолвер, не панель провайдера — как и требует приёмка):

домен A-запись TTL NS
gendsgn.ru 188.246.224.93 600 ns2.beget.ru
www.gendsgn.ru 188.246.224.93 600 ns2.beget.pro
meraocenka.ru 188.246.224.93 600 ns2.beget.pro
meraotsenka.ru 188.246.224.93 600 ns1.beget.pro
merahome.ru 188.246.224.93 600 ns1.beget.com
git.gendsgn.ru 46.173.16.127 600 ns2.beget.com
errors.gendsgn.ru 46.173.16.127 600 ns1.beget.ru
obsidian.gendsgn.ru 46.173.16.127 600 ns2.beget.pro

Два вывода:

  1. DNS продуктов уже переключён на Selectel — все пять продуктовых доменов смотрят на 188.246.224.93. Три инфра-домена корректно остались на Beget (Forgejo / GlitchTip / CouchDB туда и не переезжали). Раздел «T−0 → переключить DNS» в раннбуке #3057 для этих доменов описывает уже сделанное.
  2. TTL везде уже 600 с, а не стандартный 3600. Понижать нечего — риск «клиенты сутки ходят на старый IP», ради которого задача заводилась, для этих восьми доменов не реализуется.

Про «13 доменов»

В формулировке — «13 доменов, которые фронтит Caddy». Caddy этого репозитория фронтит ровно 8 имён (caddy/sites/apps.caddy — 5, caddy/sites/infra.caddy — 3), они все в таблице выше. Тринадцать — это, судя по всему, публичные сайты зоопарка с 94.228.121.73 из #3031 («WordPress, 13 публичных сайтов»), то есть другой Caddy на другой машине. Их списка у меня нет: доступа к 94.228.121.73 в этой сессии нет, а из репозитория он не выводится.

Что осталось по задаче: перечислить 13 доменов зоопарка и снять их TTL. Понижение TTL продуктовых доменов из пункта приёмки можно вычёркивать.

DNS всех восьми обслуживает Beget (ns*.beget.*) — то есть правка идёт в панели Beget, доступ к которой есть, а не в Selectel/Timeweb.

Пункт «вернуть TTL обратно после переключения» остаётся: сейчас 600 с — это уже пониженное значение, и оно постоянное.

## Замер DNS 2026-08-26 05:45 UTC — предпосылка задачи для доменов этого репозитория уже закрыта Снято `dig @8.8.8.8` с Poincare (внешний резолвер, не панель провайдера — как и требует приёмка): | домен | A-запись | TTL | NS | |---|---|---|---| | gendsgn.ru | 188.246.224.93 | **600** | ns2.beget.ru | | www.gendsgn.ru | 188.246.224.93 | **600** | ns2.beget.pro | | meraocenka.ru | 188.246.224.93 | **600** | ns2.beget.pro | | meraotsenka.ru | 188.246.224.93 | **600** | ns1.beget.pro | | merahome.ru | 188.246.224.93 | **600** | ns1.beget.com | | git.gendsgn.ru | 46.173.16.127 | 600 | ns2.beget.com | | errors.gendsgn.ru | 46.173.16.127 | 600 | ns1.beget.ru | | obsidian.gendsgn.ru | 46.173.16.127 | 600 | ns2.beget.pro | Два вывода: 1. **DNS продуктов уже переключён на Selectel** — все пять продуктовых доменов смотрят на 188.246.224.93. Три инфра-домена корректно остались на Beget (Forgejo / GlitchTip / CouchDB туда и не переезжали). Раздел «T−0 → переключить DNS» в раннбуке #3057 для этих доменов описывает уже сделанное. 2. **TTL везде уже 600 с**, а не стандартный 3600. Понижать нечего — риск «клиенты сутки ходят на старый IP», ради которого задача заводилась, для этих восьми доменов не реализуется. ## Про «13 доменов» В формулировке — «13 доменов, которые фронтит Caddy». Caddy **этого репозитория** фронтит ровно **8** имён (`caddy/sites/apps.caddy` — 5, `caddy/sites/infra.caddy` — 3), они все в таблице выше. Тринадцать — это, судя по всему, публичные сайты зоопарка с `94.228.121.73` из #3031 («WordPress, 13 публичных сайтов»), то есть **другой Caddy на другой машине**. Их списка у меня нет: доступа к `94.228.121.73` в этой сессии нет, а из репозитория он не выводится. **Что осталось по задаче:** перечислить 13 доменов зоопарка и снять их TTL. Понижение TTL продуктовых доменов из пункта приёмки можно вычёркивать. DNS всех восьми обслуживает Beget (`ns*.beget.*`) — то есть правка идёт в панели Beget, доступ к которой есть, а не в Selectel/Timeweb. Пункт «вернуть TTL обратно после переключения» остаётся: сейчас 600 с — это уже пониженное значение, и оно постоянное.
Author
Owner

Понизить TTL у Beget нельзя — ни в панели, ни через API. И это не так страшно, как записано в шапке

Взялся выполнить, дошёл до панели и упёрся в то, что задача в текущей постановке неисполнима у нынешнего провайдера. Ниже проверка и что с этим делать.

Опись 13 доменов — первый пункт приёмки, его нигде не было

Все тринадцать на DNS Beget (ns1/ns2.beget.{ru,com,pro}), сняты внешним резолвером 8.8.8.8:

домен TTL A-запись куда
gendsgn.ru 600 188.124.37.140 прод
www.gendsgn.ru 600 188.124.37.140 прод
meraocenka.ru 600 188.124.37.140 прод
www.meraocenka.ru 300 188.124.37.140 прод
merahome.ru 600 188.124.37.140 прод
www.merahome.ru 600 188.124.37.140 прод
meraotsenka.ru 600 188.124.37.140 прод
www.meraotsenka.ru 300 188.124.37.140 прод
git.gendsgn.ru 600 46.173.16.127 инфра
errors.gendsgn.ru 600 46.173.16.127 инфра
metrics.gendsgn.ru 600 46.173.16.127 инфра
obsidian.gendsgn.ru 600 46.173.16.127 инфра
garmin.gendsgn.ru 600 46.173.16.127 инфра

Провайдер DNS для всех — Beget, один на все тринадцать. Ни Selectel, ни Timeweb в схеме DNS не участвуют.

Почему понизить нельзя

В панели поля TTL нет вовсе. Форма «Add fast» принимает только Name / Type / Address. Слово «TTL» на всей странице управления DNS не встречается ни разу. Просмотр зоны текстом (Zone text) — только чтение, редактора там нет.

В API его тоже нет. dns/changeRecords принимает на запись ровно два поля:

{"A": [{"priority": 10, "value": "127.0.0.1"}]}

priority и value. Параметра TTL в методе не существует — значит понизить его нечем даже в обход панели.

Насколько это на самом деле больно

Шапка задачи исходит из того, что «часть клиентов будет ходить на старый IP ещё сутки». Замер говорит другое: TTL A-записей уже 600 секунд, а не 3600+ по умолчанию, как бывает.

SOA: @ 300 IN SOA … 1787817497 300 600 86400 300 — отрицательное кэширование 300 с.

То есть худший случай застревания на старом адресе — десять минут, а не сутки. Понижение до 300 сэкономило бы пять минут. Разница между «неприятно» и «катастрофа» здесь не возникает: пункт остаётся полезным, но перестаёт быть тем единственным, что «нельзя доделать задним числом».

Что можно сделать вместо

Вариант А — оставить как есть. Десять минут на переключение приемлемы, действий не требуется, риска ноль.

Вариант Б — делегировать зону провайдеру, который TTL показывает (Cloudflare, Selectel DNS, Яндекс). Смена NS делается в той же панели Beget. Но это архитектурная развилка И рискованная операция за три дня до окна: неудачное делегирование кладёт разом все тринадцать доменов, включая Forgejo, из которого идёт деплой. Своей волей делать не стал.

Если выбираешь Б — это отдельная задача с собственным окном, ДО переезда и с запасом на откат, а не «за 24-48 часов».

Пункты приёмки в новом свете

  • Список 13 доменов с провайдером и исходным TTL — выше
  • TTL пониженневозможно у Beget, требуется решение по варианту А или Б
  • Дата понижения в плане окна — теряет смысл при варианте А
  • «Вернуть TTL» в постпереездный чеклист — аналогично

Побочная находка: висячая запись на мёртвый адрес

В зоне лежит app 600 IN A 188.246.224.93прежний адрес Poincare, который перестал существовать 27.08 при замене IP.

app.gendsgn.ru → 188.246.224.93
https → код 000 (нет ответа)
http  → код 000

Ссылок на app.gendsgn.ru в репозитории нет ни одной. Это классическая висячая запись: пока адрес не переназначен, она просто мертва; как только Selectel отдаст его другому клиенту, тот будет получать запросы на наш поддомен и сможет выпустить на него сертификат.

Запись удалять не стал — не знаю, не заведена ли она под что-то планируемое. Скажи, и снесу (операция обратимая, восстанавливается одной строкой).

## Понизить TTL у Beget нельзя — ни в панели, ни через API. И это не так страшно, как записано в шапке Взялся выполнить, дошёл до панели и упёрся в то, что задача в текущей постановке **неисполнима у нынешнего провайдера**. Ниже проверка и что с этим делать. ### Опись 13 доменов — первый пункт приёмки, его нигде не было Все тринадцать на DNS Beget (`ns1/ns2.beget.{ru,com,pro}`), сняты внешним резолвером 8.8.8.8: | домен | TTL | A-запись | куда | |---|---:|---|---| | gendsgn.ru | 600 | 188.124.37.140 | прод | | www.gendsgn.ru | 600 | 188.124.37.140 | прод | | meraocenka.ru | 600 | 188.124.37.140 | прод | | www.meraocenka.ru | 300 | 188.124.37.140 | прод | | merahome.ru | 600 | 188.124.37.140 | прод | | www.merahome.ru | 600 | 188.124.37.140 | прод | | meraotsenka.ru | 600 | 188.124.37.140 | прод | | www.meraotsenka.ru | 300 | 188.124.37.140 | прод | | git.gendsgn.ru | 600 | 46.173.16.127 | инфра | | errors.gendsgn.ru | 600 | 46.173.16.127 | инфра | | metrics.gendsgn.ru | 600 | 46.173.16.127 | инфра | | obsidian.gendsgn.ru | 600 | 46.173.16.127 | инфра | | garmin.gendsgn.ru | 600 | 46.173.16.127 | инфра | Провайдер DNS для всех — **Beget**, один на все тринадцать. Ни Selectel, ни Timeweb в схеме DNS не участвуют. ### Почему понизить нельзя **В панели поля TTL нет вовсе.** Форма «Add fast» принимает только Name / Type / Address. Слово «TTL» на всей странице управления DNS не встречается ни разу. Просмотр зоны текстом (`Zone text`) — только чтение, редактора там нет. **В API его тоже нет.** `dns/changeRecords` принимает на запись ровно два поля: ```json {"A": [{"priority": 10, "value": "127.0.0.1"}]} ``` `priority` и `value`. Параметра TTL в методе не существует — значит понизить его нечем даже в обход панели. ### Насколько это на самом деле больно Шапка задачи исходит из того, что «часть клиентов будет ходить на старый IP **ещё сутки**». Замер говорит другое: TTL A-записей уже **600 секунд**, а не 3600+ по умолчанию, как бывает. SOA: `@ 300 IN SOA … 1787817497 300 600 86400 300` — отрицательное кэширование 300 с. То есть худший случай застревания на старом адресе — **десять минут**, а не сутки. Понижение до 300 сэкономило бы пять минут. Разница между «неприятно» и «катастрофа» здесь не возникает: пункт остаётся полезным, но перестаёт быть тем единственным, что «нельзя доделать задним числом». ### Что можно сделать вместо **Вариант А — оставить как есть.** Десять минут на переключение приемлемы, действий не требуется, риска ноль. **Вариант Б — делегировать зону провайдеру, который TTL показывает** (Cloudflare, Selectel DNS, Яндекс). Смена NS делается в той же панели Beget. Но это архитектурная развилка И рискованная операция за три дня до окна: неудачное делегирование кладёт разом все тринадцать доменов, включая Forgejo, из которого идёт деплой. Своей волей делать не стал. Если выбираешь Б — это отдельная задача с собственным окном, ДО переезда и с запасом на откат, а не «за 24-48 часов». ### Пункты приёмки в новом свете - [x] Список 13 доменов с провайдером и исходным TTL — выше - [ ] ~~TTL понижен~~ — **невозможно у Beget**, требуется решение по варианту А или Б - [ ] Дата понижения в плане окна — теряет смысл при варианте А - [ ] «Вернуть TTL» в постпереездный чеклист — аналогично ### Побочная находка: висячая запись на мёртвый адрес В зоне лежит `app 600 IN A 188.246.224.93` — **прежний адрес Poincare**, который перестал существовать 27.08 при замене IP. ``` app.gendsgn.ru → 188.246.224.93 https → код 000 (нет ответа) http → код 000 ``` Ссылок на `app.gendsgn.ru` в репозитории нет ни одной. Это классическая висячая запись: пока адрес не переназначен, она просто мертва; как только Selectel отдаст его другому клиенту, тот будет получать запросы на наш поддомен и сможет выпустить на него сертификат. Запись удалять не стал — не знаю, не заведена ли она под что-то планируемое. **Скажи, и снесу** (операция обратимая, восстанавливается одной строкой).
Collaborator

Перепроверка 27.08.2026 (после пересборки базы 25-26.08 и переезда продукта на Poincare). Тело тикета писалось 20-24.08 по старой инфраструктуре.

Задача исчерпана окном, которое прошло 25-26.08.

Авторитетный TTL (dig @ns1.beget.pro с Linux-хоста) = 600 с у gendsgn.ru, metrics.gendsgn.ru, git.gendsgn.ru, obsidian.gendsgn.ru. Домены разрешаются в новые адреса, переключение состоялось.

«Понизить TTL за 24-48 часов до окна» задним числом невыполнимо и не нужно. Возврат TTL к 3600 — необязательная гигиена, отдельного тикета не завожу: 600 с ничего не стоит. Закрываю.

**Перепроверка 27.08.2026** (после пересборки базы 25-26.08 и переезда продукта на Poincare). Тело тикета писалось 20-24.08 по старой инфраструктуре. Задача исчерпана окном, которое прошло 25-26.08. Авторитетный TTL (`dig @ns1.beget.pro` с Linux-хоста) = **600 с** у `gendsgn.ru`, `metrics.gendsgn.ru`, `git.gendsgn.ru`, `obsidian.gendsgn.ru`. Домены разрешаются в новые адреса, переключение состоялось. «Понизить TTL за 24-48 часов до окна» задним числом невыполнимо и не нужно. Возврат TTL к 3600 — необязательная гигиена, отдельного тикета не завожу: 600 с ничего не стоит. Закрываю.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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#3027
No description provided.