---
type: tutorial
title: Настрой прокси-барьер с nginx
summary: Включи барьер на ключе сайта, подключи обратный прокси nginx от края до края, и понаблюдай за ним в режиме предпросмотра, прежде чем он заблокирует хоть одного настоящего посетителя.
---

К концу этого руководства барьер будет работать перед сайтом за nginx: непропущенного посетителя отправляют к игре, решённая игра ставит cookie, а поздние запросы проходят напрямую. Ты сначала понаблюдаешь за всем в **режиме предпросмотра**, так что ничего не блокируется, пока ты не подтвердишь подключение. Здесь используется nginx; [рецепты Traefik, Caddy и Authelia](/docs/proxy-page-gate/reverse-proxy-recipes) следуют той же форме.

<Callout type="tip">
Сделай шаг 1, прежде чем трогать свой прокси. Режим предпросмотра даёт барьеру работать только в наблюдении: панель записывает, что он *сделал бы*, но каждый запрос всё равно проходит, так что ошибка подключения никогда никого не запирает снаружи.
</Callout>

## 1. Включи режим предпросмотра

В панели открой команду и включи **режим предпросмотра**. Пока он включён, авторизатор барьера записывает решения испытание против прямого пропуска на [страницу статистики](/docs/proxy-page-gate/statistics), но никогда не блокирует. Ты выключишь его в конце.

## 2. Включи барьер на своём ключе сайта

Открой свой ключ сайта и перейди на страницу **Прокси-барьер**. Включи **Статус → Включено**, затем задай:

- **TTL пропуска**: как долго одно решение пропускает посетителя (по умолчанию 30 минут). Короче значит больше перепроверок, но меньшее окно, если cookie украдут.
- **Режим отказа**: что делает твой прокси, когда не может достучаться до авторизатора Caputchin. **Fail-closed** блокирует (безопаснее для портала входа); **fail-open** пропускает запросы (избегает простоя на публичном сайте).

Страница также показывает готовый к копированию сниппет nginx с уже вставленным ключом сайта.

## 3. Разреши источник, который ты закрываешь

Испытание перенаправляет назад только на **разрешённый источник**, тот же список разрешённых источников, что использует виджет. Убедись, что он включает источник, который ты закрываешь, например `https://auth.example.com`. Задай его в конфигурации Cap ключа сайта, если его там ещё нет.

## 4. Подключи авторизатор и редирект на испытание

Два блока `location`: внутренний подзапрос **авторизатора** и редирект **испытания**, к которому прокси прыгает при `401`. Замени `YOUR_SITE_KEY` своим публичным ключом.

```nginx
# Gate the protected paths.
location / {
  auth_request /_cpt_authz;             # 204 = allow, 401 = challenge
  error_page 401 = @cpt_challenge;
  # ...proxy_pass to your app...
}

location = /_cpt_authz {
  internal;
  proxy_pass https://verify.caputchin.com/v1/gate/authz?site=YOUR_SITE_KEY;
  proxy_pass_request_body off;
  proxy_set_header Content-Length "";
  proxy_set_header Cookie $http_cookie;  # forward the cpt_gate cookie
}

location @cpt_challenge {
  return 302 https://verify.caputchin.com/v1/gate/challenge?site=YOUR_SITE_KEY&return=$scheme://$host$request_uri;
}
```

Закрой входные пути (HTML портала и POST входа). **Не** закрывай подзапрос авторизатора, health-check, или callback ниже.

## 5. Добавь callback, который ставит cookie

Страница испытания завершается автоотправкой маленького `POST` на `/__cpt/callback` на твоём источнике, с `cpt_gate` (пропуском) и `to` (куда отправить посетителя) в **теле**. Крошечный обработчик ставит cookie и перенаправляет. Полный контракт, включая почему важен каждый атрибут cookie, есть в [рецептах обратного прокси](/docs/proxy-page-gate/reverse-proxy-recipes#the-callback). Минимум:

```js
app.post("/__cpt/callback", express.urlencoded({ extended: false }), (req, res) => {
  const pass = String(req.body.cpt_gate || "");
  const to = String(req.body.to || "/");
  const target = new URL(to, `https://${req.headers.host}`);
  if (target.host !== req.headers.host) return res.status(400).end(); // same-origin only
  res.setHeader(
    "Set-Cookie",
    `cpt_gate=${pass}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=1800`
  );
  res.redirect(303, target.pathname + target.search);
});
```

## 6. Понаблюдай за ним в предпросмотре

Загрузи закрытый URL. Поскольку предпросмотр включён, ты проходишь напрямую, но [страница статистики](/docs/proxy-page-gate/statistics) записывает `challenge_served` (у тебя не было cookie) и, как только ты решишь и callback отработает, `pass_issued`. Перезагрузи, и ты должен увидеть, как `passthrough` растёт. Если испытания никогда не появляются, блок авторизатора не задевается; если callback отдаёт 400, проверь источник `to`.

## 7. Запусти в бой

Когда числа выглядят правильно, выключи **режим предпросмотра**. Барьер теперь принуждает: непропущенных посетителей отправляют к игре, решившие посетители гуляют, пока их пропуск не истечёт.

## Куда дальше

- [Рецепты обратного прокси](/docs/proxy-page-gate/reverse-proxy-recipes): Traefik, Caddy, и полное прохождение Authelia.
- [Статистика прокси-барьера](/docs/proxy-page-gate/statistics): что значит каждое число, когда ты в бою.
- [Обзор](/docs/proxy-page-gate/overview): концепция и то, чего барьер намеренно не делает.
