ЧЕРНОВИК. Факты и цифры здесь настоящие — они из моих же записей о переезде. Но написано это не моим голосом, а Клодом, и переписать надо самому: убрать чужие интонации, добавить своё. Как перепишешь — убери эту врезку.
22 августа РКН заблокировал IP моего сервера. Не какой-то один сайт — сам адрес. И вместе с ним разом легли три проекта: Радиоатлас, Родня и игровой бот. Они просто стояли рядом, на одной машине.
Это и был повод развести всё по разным юрисдикциям и переехать в Россию тем, кому там место. Рассказываю, как переезжал, потому что сам переезд оказался интереснее причины.
Почему нельзя просто переставить DNS
Казалось бы: поднял копию на новом сервере, поменял A-запись, готово.
Не готово. У записей был TTL в сутки. Это значит, что провайдеры и браузеры, которые уже спросили адрес, будут помнить старый ещё двадцать четыре часа. Кто-то попадёт на новый сервер сразу, кто-то — только завтра.
Для сайта-визитки это неважно. Для Родни — катастрофа: часть людей сутки писала бы посты и правила семейное дерево на старом сервере, часть на новом. Две базы, которые разошлись, свести обратно уже нельзя. Точнее, можно, но это отдельная работа с ручным разбором конфликтов, и любой пропущенный конфликт — это чья-то потерянная запись о родственнике.
Порядок, который это решает
Ключ в том, чтобы ни в один момент времени не существовало двух живых баз.
Сначала я догнал данные при остановленных сервисах — чтобы копия была точной, а не «почти».
Потом поднял всё на новом сервере и убедился, что оно работает: API отвечает, поток реально ретранслируется, видеозвонки соединяются.
А дальше — то, ради чего всё и затевалось. Старый сервер я превратил в прокси на новый. Не выключил, а оставил стоять и пересылать всё, что к нему приходит.
С этого момента стало неважно, какой адрес у кого закэширован. Попал на старый — твой запрос всё равно уехал на новый и там обработался. База одна. Разойтись нечему.
И только после этого я переставил A-записи. Спокойно, без гонки: DNS расходился сутки, а людям было всё равно.
Сертификаты, которые надо получить заранее
Отдельная засада: Let’s Encrypt проверяет владение доменом, обращаясь к тому адресу, который сейчас в DNS. А там пока старый сервер. То есть новый сервер не может получить сертификат, пока DNS на него не показывает, — а показывать на него без сертификата нельзя, потому что HTTPS сломается.
Замкнутый круг разрывается пробросом: на старом сервере я отправил запросы
/.well-known/acme-challenge/* на новый. Проверка приходила на старый адрес,
пересылалась на новый, и новый выпускал себе сертификаты заранее. К моменту
переключения они уже лежали готовые.
Сколько это стоило людям
Простой считал по каждому сервису отдельно:
- Родня — 47 секунд
- Радиоатлас — 27 секунд
- игровой бот — около минуты
Это время между остановкой на старом и стартом на новом. Всё остальное — подготовка, которая шла при работающих сервисах.
Что я понял
Переезд — это не «скопировать файлы». Это про то, чтобы в каждый момент времени было ровно одно место, где живут данные. Всё остальное — детали.
Старый сервер выключать рано. Он ещё месяц может быть нужен: как прокси, как источник сверки, а у меня — ещё и как мост, через который бот ходит в телеграм, потому что с российского адреса туда не достучаться.
Считать простой стоит честно. Не «мы переехали незаметно», а сорок семь секунд. Цифру можно проверить, а «незаметно» — нет.
Короткие записи — в канале @fodders_dev.