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 сам выполняет:

  1. yc storage bucket create --name vexai.ru

  2. Включает статический хостинг с index.html и 404.html

  3. Создаёт DNS-зону и записи

  4. Запрашивает сертификат через Certificate Manager

  5. Генерирует сервис-аккаунт с ролью storage.editor

  6. Создаёт статические ключи для деплоя

Всё это реально произошло за один промпт. Без скилла 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М вызовов бесплатно)

Время деплоя

git push → 40 сек

./deploy.sh → 40 сек

Preview по PR

Есть

Нет

Единственное, чего не хватает — preview-деплоев по PR, как в Vercel. Но для одного разработчика localhost:3000 хватает.

Скиллы — ключевая часть. Без них каждый шаг — это поход в документацию. С ними — Claude Code сам знает, какие yc-команды выполнить и какие API-запросы отправить в Метрику. Если работаешь с Claude Code и российской инфраструктурой — имеет смысл один раз собрать документацию в скилл и дальше не думать.


Скиллы - https://github.com/smvlx/openclaw-ru-skills