# Продакшн

> Запуск PentAGI для команды — харденинг, изоляция, Podman и несколько инстансов.

## [Контрольный список](https://pentagi.com/ru/docs/deployment/production/#checklist)

* Задайте все учётные данные, включая `COOKIE_SIGNING_SALT`, перед первым запуском — см. [Безопасность](https://pentagi.com/ru/docs/configuration/security/). Установщик генерирует соль и пароли сервисов, но не пароли администраторов Langfuse и Grafana: задайте `LANGFUSE_INIT_USER_PASSWORD` и `password` в шаблоне до первого запуска Langfuse и измените стандартные `admin` / `admin` Grafana после его первого запуска. На работающей установке измените пароли PostgreSQL и Neo4j внутри баз данных прежде, чем менять их в `.env`.
* Используйте настоящий сертификат и стабильный `PUBLIC_URL`.
* За обратным прокси задайте `TRUSTED_PROXIES` как адрес или CIDR прокси. В противном случае все пользователи будут использовать один и тот же адрес прокси, и 30 неудачных попыток входа в течение 5 минут заблокируют доступ для всех на 15 минут.
* Перенесите выполнение [tool calls](https://pentagi.com/ru/docs/glossary/#tool-call) на выделенный [worker node](https://pentagi.com/ru/docs/deployment/worker-node/).
* Включите [наблюдаемость](https://pentagi.com/ru/docs/configuration/observability/), чтобы отслеживать затраты и сбои.
* Разместите [knowledge graph](https://pentagi.com/ru/docs/glossary/#knowledge-graph) и Langfuse в частной сети.

## [Podman](https://pentagi.com/ru/docs/deployment/production/#podman)

PentAGI работает как на Podman, так и на Docker. В безрутовом режиме сервису `scraper` требуется дополнительная настройка, поскольку контейнеры без прав root не могут привязываться к привилегированным портам; в README репозитория описаны варианты развёртывания с правами root и без них.

## [Несколько экземпляров (`TENANT_ID`)](https://pentagi.com/ru/docs/deployment/production/#several-instances-tenant_id)

Оставьте `TENANT_ID` пустым при установке единственного экземпляра и не меняйте это значение на уже развёрнутом: установка этого параметра позже перенесёт экземпляр в новую, пустую схему, которая начинается с учётной записи `admin@pentagi.com` по умолчанию, и его [flow](https://pentagi.com/ru/docs/glossary/#flow), пользователи и настройки больше не будут отображаться. Задайте это значение для добавляемых экземпляров, если несколько экземпляров PentAGI используют общие внешние ресурсы, такие как один сервер PostgreSQL, один [worker node](https://pentagi.com/ru/docs/glossary/#worker-node), один экземпляр Neo4j или Langfuse:

| Область                | Влияние `TENANT_ID=acme`                                                       |
| ---------------------- | ------------------------------------------------------------------------------ |
| PostgreSQL             | Работает в схеме `acme` вместо `public`                                        |
| Контейнеры worker node | Именуются как `acme-pentagi-terminal-<flow>`                                   |
| Knowledge graph        | Идентификаторы групп принимают вид `acme-flow-<id>`                            |
| Аутентификация         | Ключи cookie и токенов включают идентификатор [tenant](https://pentagi.com/ru/docs/glossary/#tenant) |
| Телеметрия             | Данные Langfuse и OpenTelemetry помечаются идентификатором tenant              |

Значение должно совпадать с `^[a-z][a-z0-9_]{0,31}$`. Ресурсы хоста не изолированы по пространствам имён. Экземплярам на одном сервере нужны собственные `DATA_DIR` и опубликованные порты. Экземплярам, чьи [sandbox](https://pentagi.com/ru/docs/glossary/#sandbox) работают на одном Docker-хосте, на одном сервере или общем worker node, нужны собственные `DOCKER_PORTS_BASE` и, если он задан, собственный `DOCKER_WORK_DIR`; в противном случае их sandbox займут одни и те же порты, и flow не смогут запуститься. Каждое base задаёт диапазон из 2000 портов, по умолчанию начиная с `28000`, поэтому используйте, например, `28000` и `30000`.