Развёртывание
Разместите сайт на Cloudflare Pages, Netlify, в Docker или на Node, задайте нужные переменные окружения и подключите домен.
Выберите режим рендеринга
Задайте RENDER_MODE в .env. Значение по умолчанию подходит большинству сайтов.
| Режим | Когда собираются страницы | Хостинг | Когда выбирать |
|---|---|---|---|
| static (по умолчанию) | во время сборки | Cloudflare Pages, Netlify, nginx | большинство сайтов |
| hybrid | во время сборки, плюс серверные эндпоинты | Node.js | сайту нужны собственные серверные эндпоинты, например контактная форма |
| server | при каждом запросе | Node.js за CDN | тысячи страниц или контент, который должен обновляться за минуты |
Код страниц одинаков во всех режимах. Нужен ли шаблону сервер, указано в его README.md.
Сначала соберите локально
pnpm build
Для этого нужны настройки Sanity из раздела Подключение Sanity. Если сборка проходит на вашем компьютере, хостинг соберёт то же самое.
Статический сайт: Cloudflare Pages или Netlify
Подключите свой закрытый репозиторий к хостингу и укажите такие настройки сборки:
| Настройка | Значение |
|---|---|
| Команда сборки | pnpm build |
| Папка с результатом | dist/client |
| Версия Node.js | 22 |
Добавьте переменные окружения для сборки. Скопируйте их из своего .env:
PUBLIC_SITE_URL=https://example.com
PUBLIC_SANITY_PROJECT_ID=abc12345
PUBLIC_SANITY_DATASET=production
PUBLIC_SANITY_API_VERSION=2026-08-01
Сборка сама создаёт файлы редиректов и заголовков для хостинга (_redirects, _headers), поэтому не редактируйте их вручную.
Статический сайт: Docker (nginx)
docker build -f Dockerfile.static \
--build-arg PUBLIC_SITE_URL=https://example.com \
--build-arg PUBLIC_SANITY_PROJECT_ID=abc12345 \
-t my-site .
docker run -p 8080:8080 my-site
Образ запускает nginx без root-привилегий на порту 8080. Проверка работоспособности — /api/health.
Hybrid или server: Docker (Node.js)
docker build -f Dockerfile.node \
--build-arg RENDER_MODE=hybrid \
--build-arg PUBLIC_SITE_URL=https://example.com \
--build-arg PUBLIC_SANITY_PROJECT_ID=abc12345 \
-t my-site .
docker run -p 3000:3000 my-site
Сервер слушает порт 3000, проверка работоспособности — /api/health. Задайте контейнеру время на остановку не меньше 10 секунд, чтобы запросы в процессе обработки успевали завершиться во время развёртывания.
Без Docker соберите и запустите сервер напрямую:
pnpm build
HOST=0.0.0.0 pnpm start
Значения, которые фиксируются при сборке
RENDER_MODE и все значения, начинающиеся с PUBLIC_, встраиваются в сайт при сборке. На платформах, где настройки сборки и выполнения разделены, добавляйте их как значения для сборки. Если задать их только для выполнения, сборка молча возьмёт значения по умолчанию. После изменения любого из них пересоберите сайт.
Публикация и пересборка
Статический сайт показывает новый контент после пересборки. Чтобы сайт пересобирался при каждой публикации:
- Создайте deploy hook у своего хостинга (он есть и у Cloudflare Pages, и у Netlify) и скопируйте его URL.
- На sanity.io/manage откройте свой проект → API → Webhooks и добавьте вебхук:
- URL: адрес deploy hook
- Trigger on: create, update, delete
- Drafts: выключено
- Projection:
{_id, _type}
Для hybrid и server направьте вебхук на https://example.com/api/revalidate и укажите в качестве его секрета SANITY_WEBHOOK_SECRET из вашего .env. В режиме hybrid также задайте на сервере DEPLOY_HOOK_URL, чтобы публикация запускала пересборку. Значения для каждого хостинга перечислены в комментариях в .env.example.
Подключите домен
- Добавьте домен в настройках хостинга и следуйте его инструкциям по DNS.
- Укажите домен в
PUBLIC_SITE_URLвместе сhttps://и пересоберите сайт. - Разрешите Sanity принимать запросы с этого домена:
pnpm sanity:setup --project abc12345 --site-url https://example.com
Контактные формы на статическом сайте
У статического сайта нет собственных серверных эндпоинтов. Если в шаблоне есть контактная форма, в его README.md и .env.example описаны варианты: отправлять форму во внешний сервис форм или переключиться на RENDER_MODE=hybrid.