Конфигурация (env)¶
Всё настраивается через переменные окружения. Эталонный пример —
backend/.env.example.
Никогда не коммитьте секреты
backend/.env, корневой .env и backend.env — все в
gitignore. Добавляя переменную, задокументируйте её в README — но никогда не её значение.
Основное¶
| Переменная | Пример | Назначение |
|---|---|---|
PORT |
8080 |
Порт, который слушает API |
ENVIRONMENT |
production |
Включает строгие продакшен-проверки |
DEBUG |
false |
Подробное логирование |
ALLOWED_ORIGINS |
https://open.gerege.mn |
Список разрешённых origin для CORS (через запятую; * запрещён) |
TRUSTED_PROXIES |
— | Адреса обратных прокси |
База данных и Redis¶
| Переменная | Назначение |
|---|---|
DB_POSTGRE_DSN / DB_POSTGRE_URL |
Строка подключения |
DB_MAX_OPEN_CONNS, DB_MAX_IDLE_CONNS, DB_CONN_MAX_LIFE_MINS |
Настройка пула |
REDIS_HOST, REDIS_PASS, REDIS_EXPIRED |
Подключение к Redis и TTL |
В продакшене DSN должен использовать sslmode=verify-full
Этого требует продакшен-проверка. Стек Docker Compose намеренно работает с
ENVIRONMENT=development, потому что у его внутренней базы нет TLS.
API не должен подключаться суперпользователем
RLS работает только тогда, когда приложение подключается ролью с минимальными
правами. Роль суперпользователя или с BYPASSRLS прерывает старт в продакшене.
JWT и сессии¶
| Переменная | Назначение |
|---|---|
JWT_SECRET |
≥32 символов. Смена делает все сессии недействительными |
JWT_EXPIRED, JWT_REFRESH_EXPIRED |
Время жизни access / refresh |
JWT_ISSUER |
Обычно домен приложения. Смена делает все выданные токены недействительными |
eID (доверяющая сторона)¶
| Переменная | Назначение |
|---|---|
EID_BASE_URL |
Базовый адрес eID Mongolia /v3 (или ретранслятор подписи SSO) |
EID_RP_UUID, EID_RP_SECRET |
Учётные данные RP |
SIGN_RELAY_TOKEN |
Общий токен для ретрансляции подписи (пусто — выключено) |
Gerege SSO (сторона RP — приложение как клиент)¶
| Переменная | Пример | Назначение |
|---|---|---|
SSO_ISSUER |
https://sso.gerege.mn |
Значение по умолчанию, если не задано |
SSO_CLIENT_ID / SSO_CLIENT_SECRET |
— | Пусто — поток SSO неактивен |
SSO_REDIRECT_URI |
https://open.gerege.mn/sso/callback |
Должен быть зарегистрирован у клиента SSO точь-в-точь |
SSO_SCOPE |
openid profile email nationalid |
nationalid добавляет регистрационный номер гражданина |
SSO_NATIVE_CLIENT_ID |
— | Клиент для мобильного потока (PKCE, публичный) |
SSO_EID_PROXY_BASE_URL |
— | Если задано, интерфейс eID PKI идёт через прокси SSO |
Незарегистрированный клиент возвращает invalid_client
Если SSO_CLIENT_ID отсутствует в хранилище клиентов провайдера, шаг
authorize вернёт {"error":"invalid_client"}. Redirect URI также должен совпадать точно.
Сторона провайдера OIDC (приложение как провайдер)¶
| Переменная | Назначение |
|---|---|
OAUTH_ISSUER |
Например, https://open.gerege.mn. Провайдер включается только при заданном значении |
SSO_STATE_KEY |
Ключ HMAC для временного состояния входа/согласия (≥32 байт) |
SSO_FIRSTPARTY_CLIENTS |
Собственные клиенты, пропускающие экран согласия |
SSO_ADMIN_API_KEYS, SSO_ADMIN_SUBS |
Доступ к административному API |
Поверхность входа (AUTH_MODE)¶
Аутентифицирует ли платформа пользователей сама или перенаправляет в вышестоящий SSO — это не различие в коде: решает одна переменная.
| Значение | На главной странице и /login |
|---|---|
provider |
Карточка входа (eID рег. номер/QR · Google) отображается здесь |
client |
Перенаправление в вышестоящий SSO (SSO_ISSUER) |
AUTH_MODE=client # эталонное развёртывание этого шаблона — доверяющая сторона SSO
AUTH_MODE=provider # служба идентификации вроде sso.dgov.mn / sso.gerege.mn
Если оставить пустым, режим выводится из наличия SSO_CLIENT_ID — поэтому
существующим развёртываниям менять ничего не нужно.
Опечатка — НЕ тихий откат
При нераспознанном значении бэкенд откажется стартовать. Иначе платформа молча поднялась бы с другой поверхностью входа, чем предполагалось.
ОТДЕЛЬНАЯ ось от OAUTH_ISSUER
OAUTH_ISSUER отвечает на вопрос «является ли платформа issuer-ом для
других приложений»; AUTH_MODE — «где входят пользователи этой
платформы». Оба режима могут быть активны одновременно — цепочка.
Фронтенд получает режим из публичного GET /api/v1/site/auth (без
аутентификации и без секретов), поэтому дублирующих переменных на фронтенде нет.
Языки интерфейса¶
Платформа поставляется со встроенными переводами для монгольского и шести официальных языков ООН (арабский · китайский · английский · французский · русский · испанский). Все семь работают сразу — с пустой базой данных и без какого-либо шага перевода.
Для арабского автоматически устанавливается <html dir="rtl">.
| Переменная | Примечание |
|---|---|
| — | Настройка не требуется; языки приходят в таблицу languages как is_builtin |
Если нужны дополнительные языки, супер-администратор добавляет их в разделе Языки и заполняет переводы через Gemini — они хранятся как overlay в БД.
Сторонние сервисы и хранилище¶
| Переменная | Назначение |
|---|---|
GEMINI_API_KEY |
AI-конвейер. Без него /ai/* возвращает настоящую 500 |
GOOGLE_CLIENT_ID / SECRET |
Привязка Google (кнопка скрыта, если пусто) |
VERIFY_API_BASE, VERIFY_API_KEY, VERIFY_CHANNEL |
Проверка граждан / организаций |
XYP_API_BASE, XYP_CLIENT_ID, XYP_CLIENT_SECRET |
Запросы к государственному реестру |
GSPACE_* |
Собственное SFTP-хранилище приложения (квота на пользователя) |
INTEGRATION_ENC_KEY |
≥16 байт. Шифрует OAuth-токены и MFA суперадмина |
INTEGRATION_ENC_KEY обязателен
Развёртывания требуют этот ключ, и после установки его нельзя менять — ротация сломает все ранее зашифрованные значения.
Наблюдаемость¶
| Переменная | Назначение |
|---|---|
OTEL_EXPORTER, OTEL_SAMPLE_RATIO |
Трассировка OpenTelemetry |
OBSERVABILITY_TOKEN |
Bearer-токен, закрывающий /metrics и /swagger в продакшене |
Фронтенд¶
| Переменная | Назначение |
|---|---|
BACKEND_URL |
Внутренний адрес, к которому обращается BFF (например, http://api:8080) |
Имя api может конфликтовать в общей сети
Когда несколько стеков делят одну сеть Docker, http://api:8080 может
разрешиться в другой контейнер, и каждый вызов /api/v1/* превратится в 404.
В таком случае укажите в BACKEND_URL полное имя своего контейнера api.