← ко всем заметкам

Переезд четырёх проектов за 47 секунд простоя

ЧЕРНОВИК. Факты и цифры здесь настоящие — они из моих же записей о переезде. Но написано это не моим голосом, а Клодом, и переписать надо самому: убрать чужие интонации, добавить своё. Как перепишешь — убери эту врезку.

22 августа РКН заблокировал IP моего сервера. Не какой-то один сайт — сам адрес. И вместе с ним разом легли три проекта: Радиоатлас, Родня и игровой бот. Они просто стояли рядом, на одной машине.

Это и был повод развести всё по разным юрисдикциям и переехать в Россию тем, кому там место. Рассказываю, как переезжал, потому что сам переезд оказался интереснее причины.

Почему нельзя просто переставить DNS

Казалось бы: поднял копию на новом сервере, поменял A-запись, готово.

Не готово. У записей был TTL в сутки. Это значит, что провайдеры и браузеры, которые уже спросили адрес, будут помнить старый ещё двадцать четыре часа. Кто-то попадёт на новый сервер сразу, кто-то — только завтра.

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

Порядок, который это решает

Ключ в том, чтобы ни в один момент времени не существовало двух живых баз.

Сначала я догнал данные при остановленных сервисах — чтобы копия была точной, а не «почти».

Потом поднял всё на новом сервере и убедился, что оно работает: API отвечает, поток реально ретранслируется, видеозвонки соединяются.

А дальше — то, ради чего всё и затевалось. Старый сервер я превратил в прокси на новый. Не выключил, а оставил стоять и пересылать всё, что к нему приходит.

С этого момента стало неважно, какой адрес у кого закэширован. Попал на старый — твой запрос всё равно уехал на новый и там обработался. База одна. Разойтись нечему.

И только после этого я переставил A-записи. Спокойно, без гонки: DNS расходился сутки, а людям было всё равно.

Сертификаты, которые надо получить заранее

Отдельная засада: Let’s Encrypt проверяет владение доменом, обращаясь к тому адресу, который сейчас в DNS. А там пока старый сервер. То есть новый сервер не может получить сертификат, пока DNS на него не показывает, — а показывать на него без сертификата нельзя, потому что HTTPS сломается.

Замкнутый круг разрывается пробросом: на старом сервере я отправил запросы /.well-known/acme-challenge/* на новый. Проверка приходила на старый адрес, пересылалась на новый, и новый выпускал себе сертификаты заранее. К моменту переключения они уже лежали готовые.

Сколько это стоило людям

Простой считал по каждому сервису отдельно:

  • Родня — 47 секунд
  • Радиоатлас — 27 секунд
  • игровой бот — около минуты

Это время между остановкой на старом и стартом на новом. Всё остальное — подготовка, которая шла при работающих сервисах.

Что я понял

Переезд — это не «скопировать файлы». Это про то, чтобы в каждый момент времени было ровно одно место, где живут данные. Всё остальное — детали.

Старый сервер выключать рано. Он ещё месяц может быть нужен: как прокси, как источник сверки, а у меня — ещё и как мост, через который бот ходит в телеграм, потому что с российского адреса туда не достучаться.

Считать простой стоит честно. Не «мы переехали незаметно», а сорок семь секунд. Цифру можно проверить, а «незаметно» — нет.

Короткие записи — в канале @fodders_dev.