TL;DR: Vercel, Netlify, Cloudflare Pages — всё заблокировано или нестабильно из РФ. Российские альтернативы (Sweb, Beget, TimeWeb) — от 300₽/мес за то, что по сути — файлы в бакете. Оказалось, что Яндекс Cloud раздаёт Object Storage, DNS, SSL, Cloud Functions и аналитику бесплатно. Вся миграция заняла один день: настройка инфраструктуры — один промпт в Claude Code, 15 минут (плюс 6 часов ожидания DNS). Чтобы не читать 50 страниц документации, собрал два скилла для Claude Code — теперь он сам управляет инфраструктурой и аналитикой через yc CLI и Metrika API.
Проблема: сайт из России не открывается
Лендинг на Next.js 16, деплой на Vercel. Из Европы — летает. Из России — лотерея: то грузится за 3 секунды, то не грузится вообще. Vercel, Netlify, Cloudflare Pages — все хостят на зарубежных CDN, и доступ из РФ то есть, то нет.
Для сайта, который должен привлекать российских клиентов, это неприемлемо. Начал искать альтернативы.
Российские хостинги: дорого за простое
Первым делом — очевидные варианты:
Хостинг | Минимальный тариф | Что получаешь |
|---|---|---|
Sweb | ~300₽/мес | Shared hosting, PHP, ограниченный SSD |
Beget | ~200₽/мес | Shared hosting, панель управления |
TimeWeb | ~180₽/мес | VPS с 1 vCPU |
REG.RU VPS | ~400₽/мес | 1 vCPU, 1GB RAM |
Для статического сайта (HTML/CSS/JS после npm run build) это всё избыточно. Не нужен PHP, не нужен vCPU, не нужна база данных. Нужен бакет с файлами и DNS.
Яндекс Cloud: бесплатно и по-взрослому
Начал копать Яндекс Cloud. Оказалось, что free tier покрывает всё, что нужно для статического сайта:
Ресурс | Free tier |
|---|---|
Object Storage | 1 ГБ (сайт — ~15 МБ) |
Cloud Functions | 1 млн вызовов/мес |
DNS | Бесплатно |
Certificate Manager (Let's Encrypt) | Бесплатно |
API Gateway | 100К запросов/мес |
Итого: 0 ₽/мес. Единственная платёжка — домен (~800₽/год на reg.ru).
Но документация Яндекс Cloud — это 50+ страниц, разбросанных по разным разделам. Бакеты — в одном месте, DNS — в другом, сертификаты — в третьем. Чтобы не гуглить каждый раз, пошёл другим путём.
Скилл для Claude Code: Яндекс Cloud
Вместо того чтобы каждый раз искать нужную команду yc, собрал всю документацию в один скилл для Claude Code. Теперь вместо "открой docs.yandex.cloud → найди раздел Object Storage → скопируй пример curl → адаптируй" — говорю Claude Code что нужно, и он формирует правильные команды сам.
Что покрывает скилл:
Yandex Cloud Skill ├── Установка и аутентификация yc CLI ├── Object Storage │ ├── Создание бакетов, загрузка файлов │ ├── Настройка статического хостинга │ ├── ACL, presigned URLs, tagging │ └── MIME-типы (подводный камень — ниже) ├── DNS │ ├── Создание зон, ANAME/CNAME записи │ └── Миграция NS-серверов ├── Certificate Manager │ └── Let's Encrypt сертификаты (автообновление) ├── Cloud Functions (serverless) ├── IAM (сервис-аккаунты, роли, ключи) ├── Compute, VPC, Kubernetes, CDN... └── 30+ групп сервисов — полная справка
Пример: нужно создать бакет для статического сайта с HTTPS.
Без скилла — 4 страницы документации, 12 команд, 30 минут.
Со скиллом — одна фраза: "создай бакет vexai.ru для статического сайта с Let's Encrypt сертификатом и DNS". Claude Code сам выполняет:
yc storage bucket create --name vexai.ruВключает статический хостинг с
index.htmlи404.htmlСоздаёт DNS-зону и записи
Запрашивает сертификат через Certificate Manager
Генерирует сервис-аккаунт с ролью
storage.editorСоздаёт статические ключи для деплоя
Всё это реально произошло за один промпт. Без скилла Claude Code не знает специфику yc CLI — с ним знает каждую команду и каждый флаг.
Скилл для Claude Code: Яндекс Метрика
Вторая проблема: аналитика. Метрику подключить просто, но чтобы реально ей пользоваться — нужно знать API. У Метрики три отдельных API:
Management API — счётчики, цели, фильтры
Reporting API — отчёты, метрики, сегменты
Logs API — сырые данные по хитам и визитам
Второй скилл собирает всё это в одном месте:
Yandex Metrika Skill ├── Аутентификация (OAuth) ├── Management API │ ├── Счётчики (CRUD) │ ├── Цели (12 типов: URL, JS-event, телефон, email, чат...) │ ├── Фильтры и гранты │ └── Сегменты ├── Reporting API │ ├── Метрики (визиты, юзеры, отказы, глубина, время) │ ├── Измерения (источники, география, устройства, UTM) │ ├── Готовые пресеты отчётов │ └── Сравнение сегментов ├── Logs API (сырые данные) ├── JavaScript API │ ├── Отслеживание целей │ ├── SPA-навигация │ └── Параметры визитов └── Интеграция с Next.js ├── App Router + usePathname ├── Static export (нюансы) └── Готовый компонент YandexMetrika
Теперь вместо "открой api-metrika.yandex.net → собери curl с правильными параметрами" — говорю: "покажи визиты за последнюю неделю по источникам" или "создай цель на клик по кнопке Telegram". Claude Code формирует правильный API-запрос и выполняет его.
Как прошла миграция
Вся настройка инфраструктуры — от первого yc init до работающего сайта с HTTPS — делалась через Claude Code с этими скиллами. Вот реальная хронология:
Этап 1: Next.js → статический экспорт (5 минут)
Три строчки в next.config.ts:
const nextConfig: NextConfig = { output: "export", trailingSlash: true, images: { unoptimized: true }, };
Этап 2: Яндекс Cloud инфраструктура (через Claude Code + скилл)
Claude Code создал бакет, DNS-зону, сертификат, сервис-аккаунт — последовательно, правильными командами, с правильными ролями. Единственное место, где пришлось ждать — DNS-пропагация (~6 часов после смены NS на reg.ru).
Этап 3: Деплой-скрипт + Метрика + Вебмастер
Интеграция Метрики в Next.js — через клиентский компонент:
"use client"; import Script from "next/script"; export function YandexMetrika() { return ( <Script id="yandex-metrika" strategy="afterInteractive"> {` (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){ (m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); k=e.createElement(t);a=e.getElementsByTagName(t)[0]; k.async=1;k.src=r;a.parentNode.insertBefore(k,a) })(window,document,"script", "https://mc.yandex.ru/metrika/tag.js","ym"); ym(COUNTER_ID,"init",{ webvisor: true, clickmap: true, accurateTrackBounce: true, trackLinks: true }); `} </Script> ); }
Вебвизор (запись сессий), тепловые карты, точный расчёт отказов — всё бесплатно и из коробки.
Этап 4: Яндекс Вебмастер через API
Вебмастер можно настроить через UI, но интереснее через API — тем более что Claude Code уже знает OAuth-токен из Метрики.
Получаем user ID и список хостов:
curl -s -H "Authorization: OAuth $YM_TOKEN" \ "https://api.webmaster.yandex.net/v4/user" # → {"user_id": <YOUR_USER_ID>} curl -s -H "Authorization: OAuth $YM_TOKEN" \ "https://api.webmaster.yandex.net/v4/user/<YOUR_USER_ID>/hosts" # → два хоста: http:vexai.ru:80 и https:vexai.ru:443, оба verified
Добавляем sitemap:
curl -s -X POST \ -H "Authorization: OAuth $YM_TOKEN" \ -H "Content-Type: application/json" \ "https://api.webmaster.yandex.net/v4/user/<YOUR_USER_ID>/hosts/https:vexai.ru:443/user-added-sitemaps" \ -d '{"url": "https://vexai.ru/sitemap.xml"}' # → {"sitemap_id": "<id>"}
Отправляем все страницы на переобход:
for url in "https://vexai.ru/" "https://vexai.ru/blog/" \ "https://vexai.ru/blog/marketplace-ai-agent/" \ "https://vexai.ru/blog/rossijskie-ai-servisy-podvodnye-kamni/"; do curl -s -X POST \ -H "Authorization: OAuth $YM_TOKEN" \ -H "Content-Type: application/json" \ "https://api.webmaster.yandex.net/v4/user/USER_ID/hosts/https:vexai.ru:443/recrawl/queue" \ -d "{\"url\": \"$url\"}" done # Все 4 заявки обработаны, квота: 146/150
Итого: sitemap добавлен, все страницы в очереди на индексацию — без единого клика в интерфейсе Вебмастера.
Этап 5: Telegram-бот на Cloud Functions (бонус)
Заодно поднял Telegram-бота для сбора заявок — Python 3.12, Yandex Cloud Functions, Object Storage для состояний. Стоимость: 0₽ (free tier — 1 млн вызовов).
Подводный камень
MIME-типы в Object Storage [Критичность: высокая]
Яндекс Object Storage не определяет MIME-типы автоматически при загрузке через yc storage s3 cp. Результат: CSS грузится как application/octet-stream, браузер его игнорирует, сайт — белый экран.
Claude Code написал деплой-скрипт с явным маппингом:
upload() { local file="$1" local content_type="" case "$file" in *.html) content_type="text/html; charset=utf-8" ;; *.css) content_type="text/css; charset=utf-8" ;; *.js) content_type="application/javascript; charset=utf-8" ;; *.svg) content_type="image/svg+xml" ;; *.woff2) content_type="font/woff2" ;; *) content_type="application/octet-stream" ;; esac yc storage s3 cp "$file" "s3://${BUCKET}/$key" \ --content-type "$content_type" --quiet }
Без --content-type на каждый файл — сайт не работает. Нигде толком не описано в документации Object Storage.
Итого
Было (Vercel + зарубежные CDN) | Стало (Яндекс Cloud) | |
|---|---|---|
Доступность из РФ | Нестабильно | Стабильно |
Стоимость | $0 (free tier) | 0 ₽ (free tier) |
SSL | Автоматический | Let's Encrypt (автообновление) |
Аналитика | PostHog | Яндекс Метрика (бесплатно) |
Serverless | Vercel Functions | Cloud Functions (1М вызовов бесплатно) |
Время деплоя |
|
|
Preview по PR | Есть | Нет |
Единственное, чего не хватает — preview-деплоев по PR, как в Vercel. Но для одного разработчика localhost:3000 хватает.
Скиллы — ключевая часть. Без них каждый шаг — это поход в документацию. С ними — Claude Code сам знает, какие yc-команды выполнить и какие API-запросы отправить в Метрику. Если работаешь с Claude Code и российской инфраструктурой — имеет смысл один раз собрать документацию в скилл и дальше не думать.
