Один домен, две одинаковые копии сайта — в Петербурге и в Хельсинки — и DNS, который отправляет посетителя из России на российский сервер, а остальных на зарубежный. Сайт открывается в Москве, Нью-Йорке и Сиднее и стоит в поиске и Яндекса, и Google.
8–11 октября 2026 года атаки на три дата-центра Яндекса — в Сасово, Калуге и Владимире — перевели Yandex Cloud в аварийный режим, и Яндекс сам посоветовал клиентам включать запасные планы восстановления. Сайты, которые жили только в этом облаке, легли вместе с ним.
Переезд к соседнему российскому облаку этот риск не снимает. Перенос всего за границу отрезает часть посетителей из России. Схема ниже держит две копии сразу: каждая сторона получает ближний сервер, и падение одного провайдера не кладёт сайт целиком.
Откуда схема
Так держат сайты для русскоязычной аудитории, которая живёт и в России, и за рубежом: визы, ВНЖ, переезд — когда одна и та же страница должна открываться в Москве и в Сиднее и ранжироваться в Google. Скрипт и команды сверены с документацией Bunny 15.10.2026. У себя мы ту же задачу пока решаем проще — CDN и входной дверью, сравнение в первом разделе.
Две копии сайта — это вдвое больше выкладки и проверок. Сначала стоит понять, какую проблему вы решаете.
| Ситуация | Решение | Что стоит |
|---|---|---|
| Сайт в России; у зарубежных посетителей и у тех, кто с VPN, тяжёлые файлы грузятся долго или обрываются | CDN для статики: картинки, PDF и видео отдаются из ближайшей страны, страницы остаются на сервере | один вечер, сервер прежний |
| У части российских абонентов не открывается сам адрес сервера | Входная дверь: второй российский сервер с прокси перед основным. У нас так со 2 сентября 2026 года: часть абонентов перестала доставать подсеть главного сервера | второй VPS и несколько строк в настройках веб-сервера |
| Аудитория и в России, и за рубежом; нужны и Яндекс, и Google; падение одного провайдера не должно класть сайт | GeoDNS и две копии сайта — этот гайд | второй сервер, синхронизация копий, перенос DNS |
Если почти все посетители в России, начните с CDN. Если сайт живёт в одном российском облаке и его падение стоит денег, схема ниже окупается в первый же день аварии.
Пара Петербург — Хельсинки удобна расстоянием: между городами около 300 км, и обновления между копиями доходят быстро.
У Bunny есть «умные» гео-записи, но они отдают ближайший по расстоянию сервер. Граница «ближе к Петербургу или к Хельсинки» не совпадает с границей России: по прямой Калининград ближе к Хельсинки, а Казахстан — к Петербургу. Правило по стране пишется скриптом, и список стран в нём меняется одной строкой.
| Что | Где взять | Цена |
|---|---|---|
| Сервер в России | Selectel или Beget, Петербург | для лендинга и блога хватит минимального VPS |
| Сервер за рубежом | Hetzner, Хельсинки. У DigitalOcean и Hostinger Хельсинки нет — берите ближайший к России европейский город из их списка | минимальный VPS |
| DNS с ответом по скрипту | Bunny DNS | запросы бесплатны, минимальный счёт bunny.net — $1 в месяц |
| Запасной домен | российский регистратор, DNS у него же | цена домена за год |
| Нейросеть | Claude Code или Codex | подписка, которая уже есть |
Аккаунт у зарубежного хостера
Hetzner, DigitalOcean и другие проверяют страну клиента и карту. Регистрируйте аккаунт на реальное лицо или компанию, у которых есть право им пользоваться. Аккаунт на чужие данные хостер может закрыть вместе с сервером, а с ним пропадёт зарубежная половина сайта.
Скрипт выполняется на каждый DNS-запрос к домену: берёт страну посетителя, выбирает сервер и проверяет, жив ли он. Впишите свои IP в первые строки.
/// <reference types="@bunny.net/scriptable-dns-types" />
// GeoDNS: Россия и Беларусь — на сервер в Петербурге, остальные — в Хельсинки.
const RU_IP = "203.0.113.10"; // сервер в Петербурге — впишите свой
const WORLD_IP = "198.51.100.20"; // сервер в Хельсинки — впишите свой
const RU_COUNTRIES = ["RU", "BY"];
const TTL = 60; // секунд: столько резолверы помнят ответ
/** @param {DnsRequest} query */
export default function handleQuery(query) {
const req = query.request;
// Страна посетителя. Google DNS и часть других резолверов присылают
// подсеть посетителя (EDNS Client Subnet) — по ней точнее.
let country = req.geoLocation.country;
if (req.ednsIP && req.ednsIP !== "0.0.0.0") {
country = GeoDatabase.resolve(req.ednsIP).country;
}
const home = RU_COUNTRIES.indexOf(country) !== -1 ? RU_IP : WORLD_IP;
const spare = home === RU_IP ? WORLD_IP : RU_IP;
// Свой сервер лежит, а второй жив — отправляем на второй.
if (!Monitoring.getStatus(home).isOnline && Monitoring.getStatus(spare).isOnline) {
return new ARecord(spare, TTL);
}
return new ARecord(home, TTL);
}
kiki.bunny.net и coco.bunny.net.Строка с ednsIP решает главный нюанс схемы: Bunny видит резолвер посетителя — сервер, который спрашивает адрес от его имени. Резолвер провайдера стоит рядом с посетителем, Google DNS передаёт его подсеть, и в обоих случаях страна определяется верно. TTL 60 секунд значит, что после падения сервера посетители переедут на второй за пару минут.
Вставьте текст в Claude Code или Codex на своём компьютере и заполните первые строки. Нейросеть сама зайдёт на серверы по SSH, соберёт копии и DNS и остановится перед необратимыми шагами — сменой NS у регистратора и отключением старого хостинга.
Домен: <site.ru>. Сайт сейчас: <где лежит и на чём собран: статика / Next.js / WordPress / другое>. Серверы: Россия <IP_RU> (ssh <алиас или user@IP>), за рубежом <IP_WORLD> (ssh <алиас или user@IP>). Запасной домен: <site-ru.ru>, DNS у регистратора <название>. Ключ API Bunny лежит в <путь к .env> — в чат его не выводи. Ты — администратор Linux. Собери GeoDNS: один домен, две одинаковые копии сайта; посетители из России и Беларуси — на российский сервер, остальные — на зарубежный. Делай сам, спрашивай меня только то, без чего не обойтись. Перед необратимыми шагами (смена NS у регистратора, отключение старого хостинга) остановись и спроси. ШАГИ 1. Разведка. Опиши, как устроен сайт: статика или CMS с базой, где формы и куда уходят заявки. Сними снимок текущей зоны DNS: A, AAAA, CNAME, MX, TXT, CAA, NS — для корня, www и всех известных поддоменов, каждый тип отдельным запросом (ANY не используй). Сохрани снимок в файл. Покажи мне план до того, как что-то менять. 2. Копии сайта. На обоих серверах — одинаковая ОС и веб-сервер (Caddy или nginx). Файрвол пускает SSH, 80, 443 и ping. - Статика: сборка один раз, выкладка на оба сервера одним скриптом deploy-both.sh; в конце скрипт сравнивает хэши файлов на обоих серверах, расхождение — ошибка выкладки. - CMS с базой: основная база и админка — только на российском сервере, на зарубежном — копия только для чтения (репликация базы или выгрузка по расписанию, загрузки — rsync). Вариант предложи мне до того, как делать. 3. Заявки. Формы с обоих серверов пишут в одну базу на российском сервере или в российскую CRM: по 152-ФЗ персональные данные граждан России записываются в базу на территории России. Зарубежный сервер пересылает заявку на российский; если тот недоступен — держит её в очереди и досылает. 4. Сертификаты. Let's Encrypt проверяет домен со своих точек за рубежом и по GeoDNS попадёт на зарубежный сервер, поэтому HTTP-проверка на российском не пройдёт. На ОБОИХ серверах выпускай сертификат через DNS-проверку по API Bunny: Caddy с модулем caddy-dns/bunny или acme.sh с dns_bunny. Ключ — в .env с правами 600. 5. Зона в Bunny. Создай зону и перенеси ВСЕ записи из снимка шага 1. Скрипт GeoDNS возьми с vasinki.ru/guides/geodns/, впиши мои IP, опубликуй и привяжи записью Script к корню и www. 6. Проверка до смены NS. Спрашивай Bunny напрямую с подсетью: dig +short @kiki.bunny.net <домен> A +subnet=77.88.8.0/24 должен вернуть IP_RU, с +subnet=8.8.8.0/24 — IP_WORLD. Проверь AAAA: ответ пустой или правильный IPv6; если на AAAA-запрос приходит A-запись — заведи IPv6 на обоих серверах и отвечай AaaaRecord по request.queryType. Сверь почтовые и TXT-записи со снимком. 7. Смена NS. Скажи мне, что поставить у регистратора: kiki.bunny.net и coco.bunny.net. Дождись, пока dig NS покажет Bunny с нескольких публичных резолверов. 8. Запасной вход. Запасной домен — с DNS у российского регистратора, НЕ в Bunny и НЕ поддоменом основного: поддомен резолвится через те же NS. A-запись — на российский сервер, сертификат — обычной HTTP-проверкой. На всех страницах canonical — абсолютный адрес основного домена; если сейчас он относительный, исправь. В sitemap — только адреса основного домена. 9. Проверка по-настоящему. Через Globalping (api.globalping.io, без токена) из России, Беларуси, Германии и США: DNS-ответ (кто какой IP получил) и HTTP 200 главной и одной глубокой страницы. Сравни HTML с обоих серверов: curl -s --resolve <домен>:443:<IP> https://<домен>/ | sha256sum — запускай с сервера, не с моего компьютера: под VPN --resolve может показать не тот сервер. Проверь сертификаты на обоих IP. 10. Отказ. Останови веб-сервер на зарубежном, подожди 2 минуты, повтори dig с +subnet=8.8.8.0/24 — должен прийти IP_RU. Верни сервер. То же для российского. 11. Отчёт мне: схема, где что лежит, одна команда выкладки на оба сервера, как проверить, что копии не разъехались, что делать, если заблокируют Bunny. ПРАВИЛА - Ключи, пароли и токены в чат не выводи — только пути к файлам. - Выкладка всегда на оба сервера сразу. Копия, отставшая на одну статью, — ошибка: Яндекс и Google увидят разные сайты. - До шага 7 работающий сайт не трогай без моего согласия. - Всё, что запускал для проверки, за собой гаси.
Когда схема заработает, обновления выкладывайте той же нейросети одной фразой: «Выложи изменения на оба сервера через deploy-both.sh и сверь хэши».
| Симптом | Причина | Что делать |
|---|---|---|
| Сертификат на российском сервере не выпускается | Let's Encrypt проверяет домен со своих точек за рубежом и по GeoDNS попадает на зарубежный сервер | DNS-проверка через API Bunny на обоих серверах (шаг 4 промпта) |
| После переноса DNS перестала приходить почта | В Bunny перенесли A-записи, а MX, SPF и DKIM остались у старого DNS | Снимок зоны до переноса и сверка после (шаги 1 и 6) |
| Слетело подтверждение в Вебмастере или Search Console | TXT-запись подтверждения не переехала | То же: сверка зоны со снимком |
| Яндекс видит новую статью, а Google получает 404 | Статью выложили только на один сервер | Одна команда выкладки на оба сервера и сверка хэшей |
| Заявка от посетителя из-за рубежа потерялась | Форма писала в базу зарубежного сервера, а заявки смотрят в российской | Все формы — в одну базу на российском сервере, с очередью на случай обрыва |
| Запасной адрес лёг вместе с основным | Зеркало сделали поддоменом вроде ru.site.ru: он резолвится через те же NS Bunny | Запасной вход — отдельный домен с DNS у российского регистратора |
| После падения сервера сайт полчаса не открывается | Высокий TTL: резолверы помнят старый ответ | TTL 60 секунд в скрипте |
| Посетитель из России попал на зарубежный сервер | Его резолвер не передаёт подсеть — так работает Cloudflare 1.1.1.1, — и Bunny видит страну резолвера | Сайт от этого не ломается: копии одинаковые. Убедитесь, что зарубежный сервер открывается из России (шаг 9) |
| Проверка показывает «всё работает», а у людей не открывается | Мерили с дата-центров или с компьютера под VPN: у нас на этом уже ошибались, «Россия открывает» было измерено не с абонентских линий | Globalping из нужных стран; curl --resolve — с сервера |
| Сайт за прокси Cloudflare у посетителей из России грузится обрывками | У нас в сентябре 2026 года заголовки приходили с кодом 200, а страницы тяжелее 20–30 КБ рвались на середине | Прокси Cloudflare перед российским сервером не ставить |
Персональные данные
По 152-ФЗ (ст. 18, ч. 5) персональные данные граждан России при сборе записываются в базу на территории России. Поэтому заявки с обеих копий сайта уходят в одну базу на российском сервере или в российскую CRM.
Поисковики видят один сайт на разных IP. Это нормально, пока копии совпадают.
| Кто | Как спрашивает адрес | Какой сервер получит |
|---|---|---|
| Посетитель в России, DNS провайдера | резолвер стоит в России | Петербург |
| Посетитель в России, Google DNS 8.8.8.8 | Google передаёт подсеть посетителя | Петербург |
| Посетитель в России, Cloudflare 1.1.1.1 | подсеть не передаётся, Bunny видит узел Cloudflare | по стране узла |
| Посетитель с VPN | DNS обычно идёт через VPN | по стране выхода VPN; за рубежом — Хельсинки |
| Посетитель в США, Европе, Австралии | местный резолвер | Хельсинки |
| Робот Яндекса | ходит с российских адресов | Петербург |
| Googlebot | по умолчанию ходит с адресов в США | Хельсинки |
Каждый поисковик обходит свою копию, поэтому копии обязаны совпадать до последней статьи. Что проверить перед переездом:
Запасной домен ставьте в соцсетях и рассылках для российской аудитории: он откроется, даже если основной домен в России перестанет резолвиться.
Bunny можно спросить напрямую, подставив подсеть нужной страны. Так ответы проверяются до смены NS.
# Россия → должен прийти IP Петербурга dig +short @kiki.bunny.net site.ru A +subnet=77.88.8.0/24 # США → должен прийти IP Хельсинки dig +short @kiki.bunny.net site.ru A +subnet=8.8.8.0/24 # Копии одинаковые: хэши главной с обоих серверов совпадают curl -s --resolve site.ru:443:<IP_RU> https://site.ru/ | sha256sum curl -s --resolve site.ru:443:<IP_WORLD> https://site.ru/ | sha256sum
curl --resolve запускайте с сервера: под VPN на компьютере он может показать не тот сервер.DNS, который на один и тот же домен отвечает разными IP-адресами в зависимости от того, откуда пришёл запрос. Посетитель из России получает адрес российского сервера, остальные — зарубежного. Обе копии сайта одинаковые, поэтому разницы посетитель не видит.
Держать две одинаковые копии сайта — в России и за рубежом — и отдавать каждому посетителю адрес сервера его стороны через GeoDNS. Если сайт уже стоит в России и плохо грузится только у части зарубежных посетителей и у тех, кто с VPN, обычно хватает CDN для картинок, PDF и видео.
Нет, если обе копии отдают одинаковые страницы: для поисковика это один сайт на разных IP. Робот Яндекса ходит с российских адресов и попадает в Петербург, Googlebot по умолчанию ходит с адресов в США и попадает в Хельсинки. Опасно расхождение копий — например, статья выложена на один сервер и не выложена на другой.
У посетителя за границей или с VPN выход в интернет находится за рубежом, и для российского сервера он иностранец: запрос идёт через полмира, и часть пути может резаться или перегружаться. Зарубежная копия сайта или CDN дают такому посетителю короткий путь.
Российские резолверы не получат адрес ни основного домена, ни его поддоменов: поддомен резолвится через те же NS-серверы. Поэтому запасной вход — отдельный домен с DNS у российского регистратора, направленный на российский сервер. Его и ставят в соцсетях и рассылках.
Запросы Bunny DNS, включая скриптовые записи, на октябрь 2026 года бесплатны, но у bunny.net минимальный счёт — $1 в месяц. Основные расходы — два сервера.
Такие же рабочие схемы — сайты, боты, контент-конвейеры на Claude Code — разбираю в канале. Там же выходят новые гайды и грабли, на которые я наступил первым.
Открыть канал →Все гайды рабочие: каждый — то, что реально крутится у меня, а не пересказ документации.