Predictor X

Переменные окружения

Полный список переменных окружения для запуска self-hosted сервера Предиктор Икс.

Self-hosted сервер Предиктор Икс server считывает свою конфигурацию из переменных окружения при запуске — база данных, вход в систему, электронная почта, хранилище и списки разрешений для регистрации настраиваются именно здесь. Эта страница группирует все переменные по назначению: каждый раздел поясняет, что произойдет, если оставить переменную незаданной, и какие из них необходимо задать в production. О том, как настроить переменные для аутентификации, см. Настройка входа и регистрации.

Основные переменные сервера

Это основные переменные, о которых необходимо подумать перед развертыванием — у некоторых есть значения по умолчанию, позволяющие запустить сервер, но в production вам следует задать обязательные переменные явно.

ПеременнаяПо умолчаниюТребуется в production?
DATABASE_URLpostgres://predictorx:predictorx@localhost:5432/predictorx?sslmode=disableДа
PORT8080Нет (если не меняете порт)
JWT_SECRETpredictorx-dev-secret-change-in-productionДа (значение по умолчанию небезопасно)
APP_ENVпустоДа (должно быть production)
FRONTEND_ORIGINпустоДа (self-hosted должен задать свой домен)
PREDICTORX_DEV_VERIFICATION_CODEпустоНет (должно оставаться пустым в production)

Не задавайте PREDICTORX_DEV_VERIFICATION_CODE в production. Фиксированный код для локального тестирования отключен по умолчанию, но если вы включите его с помощью PREDICTORX_DEV_VERIFICATION_CODE=888888, любой, кто может запросить код, сможет войти в систему с этим фиксированным значением, пока APP_ENV не равен production. Этот ярлык игнорируется, когда APP_ENV=production.

Пул подключений к базе данных

ПеременнаяПо умолчаниюОписание
DATABASE_MAX_CONNS25Максимальное количество соединений pgxpool. Демон часто опрашивает базу (каждые 3 с) и использует соединения; для крупных развертываний может потребоваться большее значение
DATABASE_MIN_CONNS5Минимальное количество простаивающих соединений

Если не задано, используются значения выше — не встроенные в pgx значения 4/NumCPU, которые ранее вызывали исчерпание пула в production.

Конфигурация электронной почты

Предиктор Икс поддерживает два бэкенда доставки — Resend для облачных развертываний или SMTP-релей для внутренних/локальных сетей. SMTP_HOST имеет приоритет над RESEND_API_KEY, если заданы оба.

Resend

ПеременнаяПо умолчаниюОписание
RESEND_API_KEYпустоAPI-ключ Resend
RESEND_FROM_EMAILnoreply@predictorx.ruАдрес отправителя (должен быть домен, подтвержденный в вашей учетной записи Resend; также используется как заголовок From: при работе через SMTP)

SMTP-релей

ПеременнаяПо умолчаниюОписание
SMTP_HOSTпустоИмя хоста SMTP-релея. Задание этого параметра активирует режим SMTP и отменяет использование Resend
SMTP_PORT25SMTP-порт. Используйте 587 для STARTTLS или 465 для SMTPS (implicit TLS, включается автоматически)
SMTP_USERNAMEпустоИмя пользователя SMTP. Оставьте пустым для релея без аутентификации
SMTP_PASSWORDпустоПароль SMTP
SMTP_TLSstarttlsРежим TLS. implicit (псевдоним smtps, ssl) принудительно устанавливает TLS-рукопожатие сразу при подключении (SMTPS); порт 465 включает его автоматически. Если не задано или установлено в starttls, обновление до TLS происходит после подключения
SMTP_TLS_INSECUREfalseУстановите true для пропуска проверки TLS-сертификата (только для частных CA / самоподписанных сертификатов)
SMTP_EHLO_NAMEимя хоста машиныИмя EHLO/HELO, передаваемое релею. Установите реальный FQDN, если строгий релей (например, Google Workspace smtp-relay.gmail.com) отклоняет стандартное приветствие с публичного IP — иначе релей разорвет соединение, что проявится как неясная ошибка EOF на более поздней команде

Обновление до STARTTLS происходит автоматически, когда сервер объявляет о поддержке. Тайм-аут на установку соединения составляет 10 секунд, а на всю SMTP-сессию — 30 секунд.

Поведение, если ничего не задано: сервер не выдает ошибку, но все письма (коды верификации, ссылки приглашений) записываются только в stdout сервера. Это удобно для локальной разработки — просто скопируйте код из логов. В production отсутствие настройки создает "черную дыру", пользователи не получают письма, и ошибки не возникают.

Конфигурация Google OAuth

Необязательно. Оставьте незаполненным, если используете только email + код подтверждения. Настройте для добавления кнопки "Войти через Google" на странице входа.

ПеременнаяПо умолчаниюОписание
GOOGLE_CLIENT_IDпустоGoogle Cloud OAuth client ID
GOOGLE_CLIENT_SECRETпустоGoogle Cloud OAuth secret
GOOGLE_REDIRECT_URIhttp://localhost:3000/auth/callbackCallback URL для OAuth (self-host: замените на ваш домен фронтенда)

Вступает в силу во время выполнения: фронтенд считывает эти настройки через /api/config во время работы, поэтому их изменение не требует пересборки или перезапуска фронтенда — просто перезапустите сервер.

Полная инструкция по настройке (включая шаги в Google Cloud Console) находится в Настройка входа и регистрации.

Конфигурация файлового хранилища

Предиктор Икс хранит загружаемые пользователями вложения (изображения и файлы в комментариях). Предпочтительно использовать S3; если S3 не настроен, используется локальный диск.

S3 / S3-совместимое хранилище

ПеременнаяПо умолчаниюОписание
S3_BUCKETпустоТолько имя бакета (например my-bucket). Не добавляйте суффикс .s3.<region>.amazonaws.com — сервер сам конструирует адрес из S3_BUCKET + S3_REGION. Задание этого параметра включает хранение в S3
S3_REGIONus-west-2AWS-регион. Должен соответствовать реальному региону бакета — используется для подписи SDK и формирования публичного URL
AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEYпустоСтатические учетные данные. Если оба не заданы, используется цепочка учетных данных AWS SDK по умолчанию (IAM-роль / переменные окружения)
AWS_ENDPOINT_URLпустоПользовательский S3-совместимый эндпоинт (например MinIO). Переключает на path-style URL
ATTACHMENT_DOWNLOAD_MODEautoПуть загрузки вложений: auto, cloudfront, presign, или proxy. В режиме auto предпочтителен CloudFront; внутренние/частные эндпоинты используют прокси сервера; публичные S3-совместимые используют предписанные (presigned) GET-ссылки
ATTACHMENT_DOWNLOAD_URL_TTL30mВремя жизни (TTL) для подписанных ссылок CloudFront и S3 presigned URL. Принимает строки длительности Go

Если S3_BUCKET не задан: при запуске сервер пишет в лог "S3_BUCKET not set, cloud upload disabled", и все загрузки сохраняются на локальный диск.

URL объектов формируются в следующем порядке приоритета:

  1. https://<CLOUDFRONT_DOMAIN>/<key> если задан CLOUDFRONT_DOMAIN.
  2. <AWS_ENDPOINT_URL>/<S3_BUCKET>/<key> (path-style) если задан AWS_ENDPOINT_URL.
  3. https://<S3_BUCKET>.s3.<S3_REGION>.amazonaws.com/<key> (virtual-hosted-style). Если S3_BUCKET содержит точки, сервер переключается на https://s3.<S3_REGION>.amazonaws.com/<S3_BUCKET>/<key> (path-style), так как TLS-сертификат AWS с подстановочными знаками не проверяет бакеты с точками.

API download_url использует GET /api/attachments/{id}/download, если не настроена подпись CloudFront. Эндпоинт перенаправляет на CloudFront/S3 или стримит через сервер для приватных/внутренних эндпоинтов (например, http://rustfs:9000). Для объектных хранилищ внутри Docker/VPC используйте ATTACHMENT_DOWNLOAD_MODE=proxy, если автоопределение недостаточно консервативно для вашей сети.

Локальный диск (если S3 не настроен)

ПеременнаяПо умолчаниюОписание
LOCAL_UPLOAD_DIR./data/uploadsДиректория локального хранилища
LOCAL_UPLOAD_BASE_URLпусто (возвращает относительные пути)Публичный базовый URL — если оставить пустым, фронтенд не сможет разрешить полный URL для вложений

CloudFront (опционально)

Если вы используете CloudFront перед S3, применяются три переменные: CLOUDFRONT_DOMAIN, CLOUDFRONT_KEY_PAIR_ID, CLOUDFRONT_PRIVATE_KEY (или CLOUDFRONT_PRIVATE_KEY_SECRET для чтения из Secrets Manager). Пропустите их, если не используете CloudFront.

ПеременнаяПо умолчаниюОписание
COOKIE_DOMAINпустоОбласть действия сессионного cookie
  • Пусто: cookie валиден только для конкретного хоста (правильно для однохостовых развертываний)
  • Установлено в .example.com: cookie доступен для всех поддоменов
  • Предупреждение: не может быть IP-адресом (браузеры игнорируют его)

Ограничение регистрации

Три уровня списков разрешений объединяются по приоритету. Если хотя бы один уровень задан, письма, не соответствующие списку, будут отклонены — даже ALLOW_SIGNUP=true не перекроет это.

ПеременнаяПо умолчаниюОписание
ALLOWED_EMAILSпустоСписок разрешенных адресов (через запятую). Если задан, только они могут зарегистрироваться
ALLOWED_EMAIL_DOMAINSпустоСписок разрешенных доменов (через запятую). Если задан, только пользователи с этих доменов могут зарегистрироваться
ALLOW_SIGNUPtrueГлавный выключатель регистрации. Установите false, чтобы полностью отключить регистрацию

Важный момент: ALLOWED_EMAIL_DOMAINS=company.io + ALLOW_SIGNUP=true не означает "разрешить company.io или всех" — это означает только разрешить company.io. Списки работают по принципу логического И.

Приглашения не проверяют список разрешений, но приглашенный пользователь все равно должен быть в состоянии войти в систему. Если у них уже есть аккаунт, они могут принять приглашение. Если нет, первый шаг (запрос кода подтверждения) проходит через проверку списков, и email, отклоненный по условиям регистрации, не сможет завершить процесс.

Блокировка создания рабочих пространств

ALLOW_SIGNUP=false блокирует новые аккаунты, но не блокирует уже вошедшим пользователям создание других пространств через POST /api/workspaces. Чтобы закрыть эту возможность, установите DISABLE_WORKSPACE_CREATION=true.

ПеременнаяПо умолчаниюОписание
DISABLE_WORKSPACE_CREATIONfalseЕсли true, любой запрос POST /api/workspaces вернет 403. Веб-интерфейс скроет возможность создания пространства

Рекомендуемая последовательность настройки:

  1. Запустите инстанс с DISABLE_WORKSPACE_CREATION по умолчанию.
  2. Войдите как администратор и создайте общее рабочее пространство.
  3. Установите DISABLE_WORKSPACE_CREATION=true и перезапустите бэкенд. С этого момента пользователи могут присоединяться только через приглашения.

Ограничение скорости (опционально Redis)

Публичные эндпоинты аутентификации имеют ограничение скорости (rate limiting) по IP. Ограничитель работает через Redis. Если REDIS_URL не задан, middleware отключается (fail-open).

ПеременнаяПо умолчаниюОписание
REDIS_URLпустоURL для подключения к Redis. Также используется для очереди событий в реальном времени и кешей
RATE_LIMIT_AUTH5Макс. запросов в минуту к /auth/send-code и /auth/google
RATE_LIMIT_AUTH_VERIFY20Макс. запросов в минуту к /auth/verify-code
RATE_LIMIT_TRUSTED_PROXIESпустоCIDR прокси-серверов, чьим заголовкам X-Forwarded-For можно доверять

За обратным прокси обязательно установите RATE_LIMIT_TRUSTED_PROXIES. Иначе все пользователи будут учитываться как один IP. Обычно это 127.0.0.1/32,::1/128 для Caddy/Nginx или диапазоны вашего CDN (Cloudflare, AWS ALB и т.д.).

Параметры настройки демона

Демон запускается локально у пользователя.

ПеременнаяПо умолчаниюОписание
PREDICTORX_SERVER_URLws://localhost:8080/wsАдрес сервера
PREDICTORX_DAEMON_HEARTBEAT_INTERVAL15sИнтервал сердцебиения
PREDICTORX_DAEMON_POLL_INTERVAL3sИнтервал опроса задач
PREDICTORX_DAEMON_MAX_CONCURRENT_TASKS20Макс. одновременных задач

Контроль доступа к фронтенду

ПеременнаяПо умолчаниюОписание
FRONTEND_ORIGINпустоАдрес фронтенда. От него зависят ссылки в письмах, CORS и домен cookie. Должен быть задан для self-host
PREDICTORX_APP_URLпустоURL фронтенда для CLI-авторизации
PREDICTORX_PUBLIC_URLпустоПубличный API URL для вебхуков автопилота
CORS_ALLOWED_ORIGINSпустоДополнительные разрешенные CORS-источники

Если FRONTEND_ORIGIN не задан, возникают два сбоя: (1) ссылки в письмах ведут на https://app.predictorx.ru, а не на ваш инстанс; (2) WebSocket-соединения в production будут отклонены из-за проверки Origin.

Интеграция с GitHub

Для работы интеграции GitHub PR ↔ issue.

ПеременнаяПо умолчаниюОписание
GITHUB_APP_SLUGпустоСлаг вашего приложения GitHub
GITHUB_WEBHOOK_SECRETпустоСекрет вебхука, заданный в приложении GitHub
GITHUB_APP_IDпустоNumeric App ID (опционально)
GITHUB_APP_PRIVATE_KEYпустоPEM-блок закрытого ключа (опционально)

Если обязательные переменные не заданы, кнопка Connect GitHub в настройках будет отключена.

Аналитика использования

По умолчанию сервер отправляет данные в официальный инстанс PostHog. Чтобы отключить, установите ANALYTICS_DISABLED=true.

ПеременнаяПо умолчаниюОписание
ANALYTICS_DISABLEDfalseУстановите true для полного отключения аналитики
POSTHOG_API_KEYключ по умолчаниюВаш API-ключ, если используете свой PostHog
POSTHOG_HOSThttps://us.i.posthog.comХост вашего PostHog

Далее