# Развёртывание

> Разместите сайт на Cloudflare Pages, Netlify, в Docker или на Node, задайте нужные переменные окружения и подключите домен.

## Выберите режим рендеринга

Задайте `RENDER_MODE` в `.env`. Значение по умолчанию подходит большинству сайтов.

| Режим | Когда собираются страницы | Хостинг | Когда выбирать |
| --- | --- | --- | --- |
| static (по умолчанию) | во время сборки | Cloudflare Pages, Netlify, nginx | большинство сайтов |
| hybrid | во время сборки, плюс серверные эндпоинты | Node.js | сайту нужны собственные серверные эндпоинты, например контактная форма |
| server | при каждом запросе | Node.js за CDN | тысячи страниц или контент, который должен обновляться за минуты |

Код страниц одинаков во всех режимах. Нужен ли шаблону сервер, указано в его `README.md`.

## Сначала соберите локально

```bash
pnpm build
```

Для этого нужны настройки Sanity из раздела [Подключение Sanity](https://templates.artizanteknoloji.com/ru/docs/connect-sanity). Если сборка проходит на вашем компьютере, хостинг соберёт то же самое.

## Статический сайт: Cloudflare Pages или Netlify

Подключите свой закрытый репозиторий к хостингу и укажите такие настройки сборки:

| Настройка | Значение |
| --- | --- |
| Команда сборки | pnpm build |
| Папка с результатом | dist/client |
| Версия Node.js | 22 |

Добавьте переменные окружения для сборки. Скопируйте их из своего `.env`:

```bash
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)

```bash
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)

```bash
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 соберите и запустите сервер напрямую:

```bash
pnpm build
HOST=0.0.0.0 pnpm start
```

## Значения, которые фиксируются при сборке

`RENDER_MODE` и все значения, начинающиеся с `PUBLIC_`, встраиваются в сайт при сборке. На платформах, где настройки сборки и выполнения разделены, добавляйте их как значения для **сборки**. Если задать их только для выполнения, сборка молча возьмёт значения по умолчанию. После изменения любого из них пересоберите сайт.

## Публикация и пересборка

Статический сайт показывает новый контент после пересборки. Чтобы сайт пересобирался при каждой публикации:

1. Создайте deploy hook у своего хостинга (он есть и у Cloudflare Pages, и у Netlify) и скопируйте его URL.
2. На [sanity.io/manage](https://www.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`.

## Подключите домен

1. Добавьте домен в настройках хостинга и следуйте его инструкциям по DNS.
2. Укажите домен в `PUBLIC_SITE_URL` вместе с `https://` и пересоберите сайт.
3. Разрешите Sanity принимать запросы с этого домена:

```bash
pnpm sanity:setup --project abc12345 --site-url https://example.com
```

## Контактные формы на статическом сайте

У статического сайта нет собственных серверных эндпоинтов. Если в шаблоне есть контактная форма, в его `README.md` и `.env.example` описаны варианты: отправлять форму во внешний сервис форм или переключиться на `RENDER_MODE=hybrid`.

---

https://templates.artizanteknoloji.com/ru/docs/deploy
