Ателье мебели 5+, Ярославль — mebelsale76.ru → atelie-mebeli5.ru. SSL, 301 page-to-page, Я.Вебмастер, Я.Метрика, IndexNow на 478 URL — за рабочий день, без даунтайма.
12 мая 2026 я переехал клиента — производство мебели на заказ «Ателье мебели 5+» — с временного домена на свежекупленный брендовый. К концу дня старый домен полностью редиректит на новый, SSL выпущен, Я.Вебмастер и Я.Метрика подтянуты, в IndexNow ушли все 478 URL, контент-фабрика и каналы перенастроены. Всё за один рабочий день — без даунтайма, без потерянных страниц, без ручной работы в кабинетах там, где можно через API.
Ниже — пошагово что делал, на каких граблях постоял, и почему это вообще была одна из самых аккуратных миграций за последние полгода.
Главная нового домена atelie-mebeli5.ru
mebelsale76.ru — это был временный домен на 1.5 месяца. Пока клиент думал над брендом, мы успели:
И вот клиент пришёл с готовым именем — atelie-mebeli5.ru. Идея простая: всё переезжаем page-to-page, ничего не теряем, ИКС утаскивает за собой история и блог.
Я разделил переезд на три фазы, чтобы не было даунтайма у пользователей и чтобы каждый шаг был обратимым:
Поднимаем atelie-mebeli5.ru на нашем сервере, пока старый домен ещё крутится на Tilda-DNS клиента. Никто не страдает.
Самый волнительный момент. NS у reg.ru Tilda → reg.ru, A-записи на наш IP. Ждём propagation.
Когда DNS подтянулся — Let's Encrypt, 301 на старом домене, Я.Вебмастер, Я.Метрика, IndexNow, обновление всех внешних ссылок.
Клонировал webroot старого сайта (без .bak-файлов и временного мусора — это важно, потом расскажу почему), 17 страниц + блог + assets — около 60 МБ.
Через одну команду sed заменил в 1576 местах:
https://mebelsale76.ru → https://atelie-mebeli5.rusource:'mebelsale76-X' → source:'atelie-mebeli5-X' (атрибуция лидов в Telegram-бот — без неё каждое обращение к менеджеру было бы помечено старым доменом)Sitemap.xml, robots.txt, llms.txt — обновились автоматически тем же sed.
Поднял nginx-vhost для нового домена в HTTP-only режиме (без SSL пока). Кеш-паттерны как на старом сайте — 30 дней для статики, 60 секунд для HTML главной, gzip с разумным набором mime-типов.
IndexNow-ключ для нового домена — отдельный hex-токен, кладу как в /<key>.txt, так и в кратком файле для API.
Тест: curl --resolve atelie-mebeli5.ru:80:наш_IP http://atelie-mebeli5.ru/ — все 8 ключевых URL отдают 200 OK. Сайт готов принимать трафик, как только DNS догонит.
Клиент в reg.ru:
ns1.tildadns.com / ns2.tildadns.com на ns1.reg.ru / ns2.reg.ru@ и www на наш IP, TTL 300Реестр .ru подхватил новые NS почти сразу — whois уже показывал ns1.reg.ru. Авторитетные DNS-сервера reg.ru отдавали правильную A-запись. Но публичные DNS-резолверы (8.8.8.8, 1.1.1.1, 77.88.8.8, 9.9.9.9) ещё минут 50 кешировали старую запись Tilda с её TTL.
Первая попытка certbot --nginx в этом окне ожидаемо упала: Let's Encrypt резолвит домен через свои публичные DNS, видел старый IP Tilda, шёл туда за ACME challenge и получал 404. Это не баг сертбота — это естественное состояние пропагации.
Я не стал дёргать сертбот вхолостую — у Let's Encrypt лимит 5 неудачных попыток в час на имя. Просто подождал.
Когда все четыре публичных DNS-резолвера показали наш IP, запустил мастер-скрипт. Он сделал по шагам:
certbot --nginx -d atelie-mebeli5.ru -d www.atelie-mebeli5.ru --redirect — сертификат на 90 дней, авто-renew настроен, HSTS включён, HTTP → HTTPS-редирект тоже на месте.
Здесь самая красивая часть переезда. URL-структура нового сайта 1-в-1 повторяет старую — поэтому return 301 https://atelie-mebeli5.ru$request_uri; отправляет с mebelsale76.ru/kuhni-na-zakaz/ ровно на atelie-mebeli5.ru/kuhni-na-zakaz/, со всеми параметрами, без потери глубоких страниц. SSL для редиректа реюзаем старый сертификат mebelsale76.ru — он живой и продолжает обновляться.
Все 478 URL из sitemap нового сайта одним батчем — HTTP 202 ACK, очередь на обход принята.
Страница «Кухни на заказ» — одна из 11 услуг сайта
Самое интересное место. У клиента в Я.Вебмастере не было аккаунта на старый домен — он управлялся через другой логин, к которому у меня не было доступа. Решил иначе: добавил mebelsale76.ru в текущий аккаунт через API, запросил верификацию HTML_FILE. Проблема — на сайте уже стоит 301-блок и любой HTML недоступен.
Сделал в nginx 301-блок одно исключение:
location = /yandex_<UIN>.html {
default_type text/html;
return 200 '<html><head><meta name="yandex-verification" content="<UIN>" /></head>...</html>';
}
location / {
return 301 https://atelie-mebeli5.ru$request_uri;
}
Через 30 секунд после запроса верификации статус сменился на VERIFIED. Теперь оба домена в одном аккаунте — и через UI можно в один клик завести «Переезд сайта» с указанием главного зеркала.
Туда же — отправил на приоритетный recrawl 8 топ-URL нового домена. Из квоты 470/день потратил 7.
Клиент решил использовать счётчик «Ателье мебели», а не старый счётчик mebelsale76. Через Metrika Management API:
site=atelie-mebeli5.ruwww.atelie-mebeli5.ru, mebelsale76.ru, www.mebelsale76.ru — теперь даже редиректный трафик через старый домен попадает в правильный счётчикsed заменил ID счётчика на 502 файлах (HTML + chat-widget.js), 582 вхождения. Бэкапы перенёс в /tmp, чтобы nginx их не отдавал.На сервере крутится автопостер: каждый день в 10:00 МСК публикует одну статью с двумя экспертами-ротациями в WordPress-блог + Telegraph + IndexNow. В её config.py поправил AUTHOR.url и TELEGRAPH.author_url — теперь все новые статьи подписаны новым доменом.
За 1.5 месяца фабрика родила в Telegraph 2949 страниц. Через editAccountInfo API обновил author_url на новый домен — теперь и на старых страницах в шапке у автора стоит правильная ссылка.
Telegram-канал @ateliemebeli5plis: через бот-API (бот в админах канала) поставил новое описание со ссылкой на atelie-mebeli5.ru.
WordPress-блог ateliemebeli5-blog.ru: поиск через REST API нашёл один пост с упоминанием старого домена (4 раза в тексте). Через тот же REST API заменил на новый. Дзен-канал тянет RSS из этого блога — обновлённый контент уйдёт автоматически.
Журнал блога — 478 URL в sitemap, IndexNow ACK
После замены /etc/nginx/sites-available/mebelsale76.ru на 301-блок и nginx reload старый домен всё ещё отдавал 200 с контентом. Потратил 5 минут на диагностику — оказалось, что у этого vhost в sites-enabled лежит не симлинк, а отдельная копия файла, видимо забытая после какой-то ручной правки. nginx читал её, не sites-available.
Лечение: rm sites-enabled/mebelsale76.ru && ln -s sites-available/mebelsale76.ru sites-enabled/, reload — заработало.
Урок: перед reload-ом nginx после cp файла в sites-available всегда проверять ls -la sites-enabled/<name>. Если видишь -rw-... вместо lrwx... — переделывай в симлинк.
Yandex принял всё за один запрос (HTTP 202 на 478 URL). Bing на тот же payload ответил 403 Forbidden — вероятно, ему нужна была чуть более прогретая ситуация с ключ-файлом, который только что появился. Повторный одиночный POST с 2 URL — HTTP 200 OK. Видимо у Bing какая-то верификация перед массовой загрузкой. Не критично — Yandex наша основная задача, а в Bing новые статьи фабрика будет докидывать ежедневно.
Когда NS-кеши держатся 1-6 часов, не имеет смысла дёргать сертбот в надежде «вдруг проскочит». У Let's Encrypt rate limit 5 failures/hour/hostname, его легко исчерпать. Лучше — сделать DNS-gate в скрипте: проверять dig +short A domain @8.8.8.8 == ваш_IP перед запуском certbot.
| Проверка | Результат |
|---|---|
https://atelie-mebeli5.ru/ | 200 OK |
https://www.atelie-mebeli5.ru/ | 200 OK |
http://mebelsale76.ru/ | 301 → https://atelie-mebeli5.ru/ |
https://mebelsale76.ru/kuhni-na-zakaz/ | 301 → одноимённый URL |
https://mebelsale76.ru/uslugi/garderobnye/ | 301 → одноимённый URL |
| SSL Let's Encrypt (auto-renew) | до 10.08.2026 |
| Я.Вебмастер: оба домена | verified, одна учётка |
| Я.Метрика «Ателье мебели» | site + 3 mirrors через API |
| Recrawl топ-8 URL | в очереди приоритета |
| IndexNow Yandex | HTTP 202 на 478 URL |
| Telegraph (2949 страниц) | author_url обновлён |
WP-блог ateliemebeli5-blog.ru | 1 пост поправлен |
TG-канал @ateliemebeli5plis | description с новым доменом |
| VK-группа Ателье | site уже стоял правильный |
Блок кейсов на главной
Не всё можно сделать через API — некоторые вещи только в UI:
301 page-to-page и так склеит ссылочный профиль автоматически, но прямые упоминания лучше обновить — это ускорит переиндексацию.
Три вещи:
Один-в-один URL-структура. Если бы новый сайт переписал URL'ы (что часто бывает при ребрендингах), пришлось бы либо вручную писать map старых → новых страниц, либо использовать regex-маски. У меня просто $request_uri — короткая и надёжная.
Один аккаунт Я.Вебмастера на оба домена. Это даёт право заявить переезд через UI в один клик, иначе бы пришлось гонять верификацию через DNS TXT и ждать клиента.
API там, где это возможно. Метрика, Webmaster verify, IndexNow, Telegraph, Telegram, WordPress, VK — у всех есть API, и если есть токен с нужным scope, всё делается за минуты, а не часы кликов.
Когда в следующий раз буду переезжать чей-то сайт:
ls -la sites-enabled/ перед reload. Этот один шаг сэкономит 5 минут диагностики.return 200 с inline-HTML — не нужно создавать файл, всё в одной location-директиве. Чисто и обратимо..bak из webroot в /tmp. Иначе nginx раздаёт их по wildcard — это и информационная утечка, и SEO-захламление дублями.Если у вас сайт, разогретый блогом, на временном домене и нужно перевезти на бренд без потери SEO — напишите. Разберём, оценим, расскажу как и за сколько.
Telegram: @traffikstory · сайт: dimafedorov.ru