> ## Documentation Index
> Fetch the complete documentation index at: https://docs.twenty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Защита вашего экземпляра

> Не размещайте Twenty в открытом интернете и откройте только те несколько путей, которые нужны вашим интеграциям.

## Обзор

Ваша CRM содержит данные о ваших клиентах, ваших сделках, ваших электронных письмах и вашем календаре. Когда исправление безопасности выпускается в релизе Twenty, само это исправление подсказывает злоумышленникам, где искать, и каждый экземпляр, который ещё не обновлён, становится целью.

Быстрое обновление — настоящее решение, но большинство самостоятельно размещаемых экземпляров отстают на несколько версий. Лучшая защита, пока вы обновляетесь, проста: **убедитесь, что никто из интернета вообще не может получить доступ к вашему экземпляру.**

На этой странице показано, как сделать это с помощью Tailscale, Cloudflare или собственного обратного прокси-сервера.

## Приватность по умолчанию

Разделите свой экземпляр на три зоны:

| Зона | Пути | Кто может получить доступ |
| - | - | - |
| **Приватное** | Всё остальное: приложение, `/graphql`, `/rest`, `/metadata`, файлы | Только ваша команда |
| **Public** | `/webhooks`, `/s`, `/emailing` | Все. Они вызываются службами, которые не могут подключиться к вашей сети. |
| **Облачные коннекторы ИИ** | `/mcp`, `/oauth`, `/.well-known` | Диапазоны IP-адресов Anthropic и OpenAI. Любой из их пользователей может получить доступ к этим путям, но войти в систему может только ваша команда. |

Каждый путь охватывает всё, что находится под ним. Открывайте публичную и облачную зоны ИИ, только если используете доступные через них функции; см. [Публичные пути](#public-paths). В противном случае оставьте весь экземпляр приватным. ИИ-помощникам, работающим на компьютерах вашей команды, например Claude Code, не нужно ничего открывать; см. [Клиенты ИИ](#ai-clients-mcp).

> [!NOTE]
>
> **От чего вы отказываетесь:** размещаемые сервисы автоматизации, которые вызывают API Twenty из собственного облака (Zapier, Make, n8n Cloud), не могут получить доступ к приватному экземпляру. Вместо этого запускайте их внутри своей сети (самостоятельно размещаемый n8n хорошо подходит) или используйте [рабочие процессы Twenty](https://docs.twenty.com/ru/user-guide/workflows/overview.md). Не делайте `/graphql` или `/rest` публичными в обход этого ограничения: само приложение работает на этих конечных точках, поэтому их раскрытие открывает всё.

## Выберите настройку

> Tailscale
> Полностью приватно. Самая простая настройка, лучше всего подходит для небольших команд.
>
> [Open](#option-1-tailscale)

> Cloudflare
> Нет открытых портов, логин и пароль вашего поставщика, по мере необходимости.
>
> [Open](#option-2-cloudflare-tunnel-and-access)

> Обратный прокси
> Caddy или Nginx с разрешенными IP списками. Без сторонних сервисов.
>
> [Open](#option-3-your-own-reverse-proxy)

| | Tailscale | Cloudflare | Обратный прокси-сервер |
| - | - | - | - |
| Как получает доступ ваша команда | Приложение Tailscale на каждом устройстве | Вход в браузере через вашего поставщика удостоверений | Из офисной сети или через VPN |
| Входящие порты, открытые на сервере | Нет | Нет | 443 |
| Публичные вебхуки | Нет | Да | Да |
| Локальные клиенты ИИ (Claude Code, Codex) | Да | Да | Да |
| Облачные коннекторы ИИ (Claude.ai, ChatGPT) | Нет | Да | Да |

## Вариант 1: Tailscale

[Tailscale](https://tailscale.com) объединяет ваш сервер и устройства вашей команды в частную сеть. Twenty получает HTTPS-адрес, который работает только для пользователей этой сети.

**1. Привяжите Twenty к localhost**

В `docker-compose.yml` измените сопоставление порта `server`, чтобы контейнер был доступен только с самого сервера:

```yaml theme={null}
services:
  server:
    ports:
      - "127.0.0.1:3000:3000"
```

**2. Подключите сервер к своей tailnet**

[Установите Tailscale](https://tailscale.com/download/linux) на сервер, затем:

```bash theme={null}
sudo tailscale up --hostname=twenty
```

**3. Предоставьте Twenty через HTTPS**

```bash theme={null}
sudo tailscale serve --bg 3000
```

Twenty теперь доступен по адресу `https://twenty.\<your-tailnet>.ts.net` с сертификатом, управляемым Tailscale. Если команда запросит это, включите HTTPS-сертификаты для своей tailnet в консоли администратора.

**4. Обновите SERVER\_URL**

```ini theme={null}
SERVER_URL=https://twenty.your-tailnet.ts.net
```

Затем перезапустите с помощью `docker compose up -d`.

Используйте [элементы управления доступом](https://tailscale.com/kb/1018/acls) Tailscale, чтобы ограничить доступ к серверу только тем, кому он нужен, а не всей вашей tailnet.

Подключение аккаунтов Google или Microsoft по-прежнему работает: перенаправление OAuth происходит в браузере вашего коллеги, находящегося в tailnet. В электронных письмах с приглашениями указана ссылка на адрес tailnet, поэтому новые коллеги должны присоединиться к tailnet до принятия приглашения.

> [!WARNING]
>
> Tailscale Funnel публикует в интернете весь порт, а не отдельные пути. Вы не можете использовать его, чтобы сделать `/webhooks` общедоступным, сохранив приложение приватным. Если вам нужны общедоступные пути или AI-коннекторы, используйте вариант 2 или 3.

## Вариант 2: Cloudflare Tunnel и Access

[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/) подключает ваш сервер к Cloudflare через исходящее соединение, поэтому на сервере нет открытых портов. Затем [Cloudflare Access](https://developers.cloudflare.com/cloudflare-one/policies/access/) просит вашу команду войти через вашего поставщика идентификации, прежде чем какой-либо запрос достигнет Twenty.

**1. Защитите имя хоста с помощью Access**

Сделайте это до создания туннеля, чтобы имя хоста никогда не было доступно без входа в систему. Создайте самостоятельно размещаемые приложения Access. Access применяет наиболее специфичный путь, поэтому приведённые ниже правила пути имеют приоритет над правилом имени хоста.

| Путь на `crm.example.com` | Действие политики | Включить |
| - | - | - |
| `/` (всё имя хоста) | Разрешить | Ваша команда, например адреса электронной почты, оканчивающиеся на `@example.com` |
| `/webhooks`, `/s`, `/emailing` | Обход | Каждый |
| `/mcp`, `/oauth`, `/.well-known` | Обход | Диапазоны IP облачных AI-коннекторов из [AI-клиентов](#ai-clients-mcp), а также IP-адреса вашего офиса или VPN |

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

Локальные AI-клиенты, такие как Claude Code, не могут выполнить вход через браузер, поэтому они используют IP-адреса офиса или VPN из последнего правила. Если ваша команда работает откуда угодно, вместо этого добавьте для команды политику Allow в это приложение, включите аутентификацию WARP в Access и попросите их запустить клиент Cloudflare WARP.

**2. Создайте туннель**

На панели Cloudflare Zero Trust создайте туннель, выберите **Docker** в качестве среды и скопируйте токен. Добавьте общедоступное имя хоста `crm.example.com`, указывающее на `http://server:3000`.

**3. Запустите cloudflared рядом с Twenty**

Добавьте эту службу в `docker-compose.yml` и удалите раздел `ports` из `server`. cloudflared обращается к Twenty через сеть Docker, поэтому серверу не нужно публиковать ни один порт.

```yaml theme={null}
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    command: tunnel --no-autoupdate run
    environment:
      TUNNEL_TOKEN: ${CLOUDFLARE_TUNNEL_TOKEN}
    depends_on:
      - server
    restart: always
```

Добавьте `CLOUDFLARE_TUNNEL_TOKEN` в свой `.env`.

**4. Обновите SERVER\_URL**

```ini theme={null}
SERVER_URL=https://crm.example.com
```

Затем перезапустите с помощью `docker compose up -d`.

Если вы используете WAF или защиту от ботов Cloudflare, пропускайте проверки на путях MCP и OAuth. Claude и ChatGPT не могут пройти страницу проверки.

## Вариант 3: Собственный обратный прокси

Если вы уже используете обратный прокси, добавьте в список разрешённых IP-адреса вашего офиса или VPN для приложения и откройте только общедоступные пути. Сначала привяжите Twenty к localhost, как в [варианте 1](#option-1-tailscale), чтобы ничто не обходило прокси.

**Caddy**

```caddyfile theme={null}
crm.example.com {
  # Keep only the public paths you use
  @public path /webhooks/* /s/* /emailing/*
  handle @public {
    reverse_proxy localhost:3000
  }

  @ai_clients {
    path /mcp /mcp/* /oauth/* /.well-known/*
    remote_ip 160.79.104.0/21 {$CHATGPT_CONNECTOR_IPS}
  }
  handle @ai_clients {
    reverse_proxy localhost:3000
  }

  @team remote_ip 203.0.113.0/24
  handle @team {
    reverse_proxy localhost:3000
  }

  handle {
    respond 403
  }
}
```

**Nginx**

```nginx theme={null}
server {
  listen 443 ssl;
  server_name crm.example.com;
  ssl_certificate /etc/ssl/crm.example.com/fullchain.pem;
  ssl_certificate_key /etc/ssl/crm.example.com/privkey.pem;

  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_http_version 1.1;
  proxy_set_header Connection "";
  proxy_buffering off;

  # Keep only the public paths you use
  location ^~ /webhooks/ { proxy_pass http://127.0.0.1:3000; }
  location ^~ /s/ { proxy_pass http://127.0.0.1:3000; }
  location ^~ /emailing/ { proxy_pass http://127.0.0.1:3000; }

  location ~ ^/(mcp|oauth|\.well-known)(/|$) {
    allow 203.0.113.0/24;
    allow 160.79.104.0/21;
    # one allow line per ChatGPT connector range
    deny all;
    proxy_pass http://127.0.0.1:3000;
  }

  location / {
    allow 203.0.113.0/24;
    deny all;
    proxy_pass http://127.0.0.1:3000;
  }
}
```

Заголовки `Host` и `X-Forwarded-Proto` обязательны: Twenty формирует из них URL для обнаружения OAuth и MCP, а без них объявляет `http://127.0.0.1:3000`. IP-адреса вашей команды также отображаются в расположении MCP, поэтому локальные AI-клиенты продолжают работать. Caddy самостоятельно устанавливает эти заголовки.

Замените `203.0.113.0/24` адресами вашего офиса или VPN. `CHATGPT_CONNECTOR_IPS` содержит диапазоны OpenAI, см. [AI-клиенты](#ai-clients-mcp); оставьте его пустым, если не используете ChatGPT. Если ваш прокси находится за балансировщиком нагрузки, сопоставляйте с IP-адресом клиента, который он пересылает (`client_ip` с `trusted_proxies` в Caddy, `set_real_ip_from` в Nginx), а не с адресом балансировщика нагрузки.

## Общедоступные пути

Это пути, которые вызывают службы за пределами вашей сети. Открывайте только те, которые вам нужны.

| Путь | Вызывается | Требуется, когда |
| - | - | - |
| `/webhooks/workflows` | Любая внешняя служба | Вы используете рабочие процессы с триггером **Webhook** |
| `/s`, `/webhooks/server` | Любая внешняя служба | Вы используете приложения или функции логики, предоставляющие HTTP-маршруты |
| `/webhooks/google`, `/webhooks/microsoft` | Google и Microsoft | Вы включили push-синхронизацию для почтовых ящиков и календарей (см. ниже) |
| `/webhooks/messaging` | Amazon SES, Resend | Вы отправляете электронную почту через SES или Resend и хотите получать события доставки |
| `/emailing` | Люди, получающие ваши электронные письма | Вы отправляете почтовые кампании (ссылки для отписки, отслеживание открытий и кликов) |
| `/mcp`, `/oauth`, `/.well-known` | Claude, ChatGPT | Вы добавляете Twenty как коннектор, см. [AI-клиенты](#ai-clients-mcp) |

По умолчанию Twenty опрашивает почтовые ящики и календари, поэтому Google и Microsoft никогда не вызывают ваш экземпляр. Они делают это только если вы установите `IS_CONNECTED_ACCOUNT_WEBHOOK_SUBSCRIPTION_ENABLED=true`.

Как защищён каждый общедоступный путь:

* **Вебхуки рабочих процессов** проверяют только существование рабочего пространства и рабочего процесса. Любой, кто знает URL, может запустить рабочий процесс, поэтому считайте URL секретом и проверяйте полезную нагрузку в рабочем процессе перед её обработкой.
* **Маршруты приложений и функций логики** общедоступны, если только маршрут не требует аутентификации (`isAuthRequired`). Для общедоступных маршрутов проверяйте вызывающую сторону в собственном коде, например с помощью подписи отправляющей службы.
* **Вебхуки Google, Microsoft, SES и Resend** проверяются Twenty с помощью подписи или токена поставщика.
* **Ссылки в электронных письмах** могут зарегистрировать открытие, клик или отписку только для получателя, которому они были отправлены.

## AI-клиенты (MCP)

AI-помощники — один из основных способов, которыми ваша команда будет использовать Twenty, через его [сервер MCP](https://docs.twenty.com/ru/user-guide/ai/capabilities/mcp). То, что нужно открыть, зависит от того, где работает помощник, а не от того, какой это помощник.

### Локальные клиенты: ничего открывать не нужно

Claude Code, Codex CLI, Cursor и другие инструменты, работающие на вашем компьютере, подключаются к Twenty с этого компьютера. Если он находится в вашей tailnet или VPN, они получают доступ к `/mcp` так же, как ваш браузер получает доступ к приложению. Это самая безопасная конфигурация, поэтому отдавайте ей предпочтение, когда возможно.

Claude Desktop — исключение: коннекторы, добавленные в **Settings → Connectors**, работают в облаке Anthropic даже в настольном приложении. Чтобы сохранить подключение локальным, вместо этого добавьте Twenty как локальный сервер MCP в `claude_desktop_config.json`:

```json theme={null}
{
  "mcpServers": {
    "twenty": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://twenty.your-tailnet.ts.net/mcp"
      ]
    }
  }
}
```

### Облачные коннекторы: открывайте с осторожностью

Claude (веб-версия, мобильное приложение и коннекторы в настольном приложении) и ChatGPT вызывают ваш сервер из инфраструктуры Anthropic и OpenAI, а не с вашего устройства. Они не могут получить доступ к приватному экземпляру, поэтому необходимо открыть `/mcp`, `/oauth` и `/.well-known` для их диапазонов IP-адресов.

> [!WARNING]
>
> Список разрешённых IP-адресов проверяет, из какой сети поступает запрос, а не кто его отправил. Любой, у кого есть аккаунт Claude или ChatGPT, может добавить ваш URL как коннектор и отправлять запросы на эти пути.

Не пускает их только вход в систему. Чтобы получить токен, пользователь должен войти на странице Twenty `/authorize`, которая остаётся в приватной зоне. Кто-то за пределами вашей сети может начать процесс подключения, но не может завершить его, а `/mcp` отклоняет каждый запрос без действительного токена.

Открытым остаётся код, который выполняется до входа в систему: обнаружение OAuth, регистрация клиента (`/oauth/register`) и конечная точка токена. Список разрешённых адресов сужает доступ: сканеры по всему интернету не могут напрямую обращаться к этим путям, а запросы должны поступать через инфраструктуру Claude или ChatGPT. Сам по себе он не делает этот код безопасным, поэтому обновления по-прежнему важны.

Если вы используете облачные коннекторы:

* Откройте только `/mcp`, `/oauth` и `/.well-known`. Никогда не открывайте `/authorize` или остальную часть приложения.
* Разрешайте только тех поставщиков, которых используете:
  * **Anthropic:** `160.79.104.0/21`, со [страницы IP-адресов Anthropic](https://platform.claude.com/docs/en/api/ip-addresses).
  * **OpenAI:** список в [chatgpt-connectors.json](https://openai.com/chatgpt-connectors.json). OpenAI описывает его как best effort, и он со временем меняется, поэтому обновляйте его по расписанию:

    ```bash theme={null}
    curl -s https://openai.com/chatgpt-connectors.json | jq -r '.prefixes[].ipv4Prefix | select(.)'
    ```
* Быстро обновляйтесь, когда в примечаниях к выпуску упоминаются исправления MCP или OAuth.

## Проверьте свою конфигурацию

Проверяйте с обеих сторон вашей сети после любого изменения:

| Тест | От | Ожидаемый результат |
| - | - | - |
| Приложение, `/graphql` и `/authorize` | За пределами вашей сети | Заблокировано или отображается ваша страница входа Access |
| Порт `3000` на публичном IP-адресе сервера | За пределами вашей сети | Нет подключения |
| Приложение и локальный AI-клиент | Внутри вашей сети | Оба работают |
| Запрос MCP без токена (ниже) | Внутри вашей сети | `401` с URL обнаружения на вашем публичном HTTPS-адресе |
| Облачный коннектор | Claude или ChatGPT | Вы можете подключиться, войти в систему и вызвать инструмент |
| Каждый открытый вами общедоступный путь | Фактическая служба | Её тестовое событие проходит |

```bash theme={null}
curl -si -X POST https://crm.example.com/mcp | grep -i www-authenticate
```

Заголовок должен указывать на `https://crm.example.com/.well-known/...`. Если он показывает `http://` или `127.0.0.1`, ваш прокси не пересылает заголовки `Host` и `X-Forwarded-Proto`.

## Базовый контрольный список

> [!TIP]
>
> Postgres и Redis не опубликованы. По умолчанию `docker-compose.yml` не публикует их; сохраните это, если редактируете его.

> [!TIP]
>
> Ничто не обходит ваш прокси или туннель. При использовании прокси на хосте порт Twenty привязан к `127.0.0.1`. При использовании cloudflared в Docker служба `server` не публикует порт. Docker создаёт собственные правила брандмауэра, поэтому публикуемые им порты обходят `ufw` и аналогичные брандмауэры хоста.

> [!TIP]
>
> Секреты длинные и случайные, и вы знаете, как [ротировать их](https://docs.twenty.com/ru/developers/self-host/capabilities/key-rotation).

> [!TIP]
>
> Участники рабочего пространства используют SSO или двухфакторную аутентификацию.

> [!TIP]
>
> Для базы данных по расписанию создаются резервные копии, и вы протестировали восстановление.

> [!TIP]
>
> `TAG` закреплён за версией, и вы обновляетесь осознанно.

## Оставайтесь в курсе обновлений

Ничто из вышеперечисленного не заменяет обновления. Это даёт вам время.

* Отслеживайте выпуски на [GitHub](https://github.com/twentyhq/twenty): **Watch → Custom → Releases**.
* Если выпуск содержит исправление безопасности, обновитесь, как только это рекомендовано в бюллетене: в тот же день для критических проблем. Следуйте [руководству по обновлению](https://docs.twenty.com/ru/developers/self-host/capabilities/upgrade-guide.md).
* Сообщайте об уязвимостях на [security@twenty.com](mailto:security@twenty.com), а не в публичных issues.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.