Перейти к содержанию

Конфигурация системы

Структура файлов

/opt/llm-firewall/
├── docker-compose.yml          # Основной compose-файл
├── .env                        # Переменные окружения
├── init-databases.sql          # Инициализация БД
├── opa-config.yaml             # Конфигурация OPA
└── data/                       # Данные (volumes)

docker-compose.yml

Скопируйте предоставленный файл docker-compose.yml из поставки в /opt/llm-firewall/docker-compose.yml.

Файл содержит определения всех сервисов стенда (включая Tokenization Vault, добавленный поставкой 2026.6.2) с GPU-конфигурацией. Ключевые особенности:

  • GPU-сервисы используют deploy.resources.reservations.devices для доступа к GPU.
  • Миграции БД запускаются автоматически (alembic upgrade head).
  • Health checks настроены для всех сервисов.
  • Зависимости между сервисами определены через depends_on с условиями.

Файл переменных окружения (.env)

cat > /opt/llm-firewall/.env << 'EOF'
# ====================================
# AppSec.AIGate Production Environment
# ====================================

# Mode
MODE=production
ENVIRONMENT=production

# Auth (Keycloak)
OAUTH2_PROXY_ENABLED=false
KEYCLOAK_URL=http://keycloak:8080
KEYCLOAK_REALM=llm-firewall
KEYCLOAK_ADMIN_USERNAME=admin
KEYCLOAK_ADMIN_PASSWORD=admin

# Database
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres

# MinIO
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin

# Translation (RU→EN, опционально; по умолчанию отключён)
GATEWAY_TRANSLATION_ENABLED=false

# Logging
LOG_LEVEL=INFO

# Tokenization Vault (обязательно, начиная с поставки 2026.6.2) —
# мастер-ключ шифрования обратимых PII-токенов. Сгенерировать ДО первого
# запуска: openssl rand -base64 32
VAULT_MASTER_KEY=
EOF

Важно

Для production-среды обязательно смените пароли POSTGRES_PASSWORD, MINIO_ROOT_PASSWORD и KEYCLOAK_ADMIN_PASSWORD на безопасные значения.

VAULT_MASTER_KEY обязателен

Без VAULT_MASTER_KEY контейнер tokenization-vault не запустится. Сохраните ключ в надёжном месте — его смена делает ранее выданные PII-токены нерасшифруемыми.

init-databases.sql

cat > /opt/llm-firewall/init-databases.sql << 'EOF'
-- AppSec.AIGate database initialization
-- Creates databases for Profiles Registry, Admin API and Tokenization Vault

CREATE DATABASE profiles_registry;
CREATE DATABASE admin_api_db;
CREATE DATABASE vault_db;
GRANT ALL PRIVILEGES ON DATABASE profiles_registry TO postgres;
GRANT ALL PRIVILEGES ON DATABASE admin_api_db TO postgres;
GRANT ALL PRIVILEGES ON DATABASE vault_db TO postgres;
EOF

vault_db — только на первом запуске

init-databases.sql выполняется PostgreSQL-контейнером только при первом запуске (пустой data-каталог). При обновлении уже развёрнутой инсталляции 2026.5 → 2026.6.2 базу vault_db нужно создать вручную — см. Обновление.

Конфигурация OPA

cat > /opt/llm-firewall/opa-config.yaml << 'EOF'
services:
  minio:
    url: http://minio:9000
    credentials:
      s3_signing:
        environment_credentials: {}

bundles:
  default:
    service: minio
    resource: policies/default/bundle.tar.gz
    polling:
      min_delay_seconds: 2
      max_delay_seconds: 5
    persist: false

decision_logs:
  console: true
EOF

Конфигурация GPU (deploy.resources)

Для GPU-сервисов используется блок deploy.resources в docker-compose.yml:

deploy:
  resources:
    reservations:
      devices:
        - driver: nvidia
          count: 1
          capabilities: [gpu]

Этот блок требует установленного NVIDIA Container Toolkit. Каждый GPU-сервис (threat-detector, content-safety, translation-service) содержит этот блок. Дополнительно GPU-сервисы имеют переменную NVIDIA_VISIBLE_DEVICES: all.

Выбор GPU-устройства и работа с MIG

По умолчанию (NVIDIA_VISIBLE_DEVICES: all + count: 1) контейнеру отдаётся первый видимый GPU (внутри контейнера он всегда становится cuda:0), и модель загружается именно на него. На сервере с одной картой этого достаточно. На сервере с несколькими GPU — особенно когда часть карт уже занята другими нагрузками (vLLM, sglang, embeddings) — нужно явно указать, какое именно устройство отдать каждому ML-сервису.

Про код загрузки модели

threat-detector и content-safety загружают веса на «первое видимое устройство» (device_map={"": 0}). Это не баг и менять его не нужно — выбор конкретной карты делается на уровне Docker-рантайма через видимость устройств, а не в коде. Если ограничить видимость одним нужным устройством, оно ремапится внутрь контейнера в cuda:0, и модель садится именно на него.

Выбор целого GPU (карта без MIG)

Целую карту можно выбрать по индексу или (надёжнее) по UUID. Выберите один способ, не смешивайте их.

Способ A — через deploy.resources (по индексу):

deploy:
  resources:
    reservations:
      devices:
        - driver: nvidia
          device_ids: ['3']      # вместо count: 1; индекс карты из nvidia-smi
          capabilities: [gpu]

При использовании device_ids переменную NVIDIA_VISIBLE_DEVICES из блока environment нужно убрать — иначе два механизма выбора конфликтуют.

Способ B — через NVIDIA_VISIBLE_DEVICES (по индексу или UUID):

runtime: nvidia                  # явно указать NVIDIA-рантайм
environment:
  NVIDIA_VISIBLE_DEVICES: "GPU-xxxxxxxx-..."   # UUID карты из `nvidia-smi -L`
  NVIDIA_DRIVER_CAPABILITIES: "compute,utility"
# блок deploy.resources.reservations.devices при этом НЕ используется

UUID предпочтительнее индекса: индексы карт могут меняться между перезагрузками (порядок PCI/нумерация драйвера), а UUID стабилен.

Выбор MIG-инстанса (нарезанный GPU)

Если карта переведена в режим MIG (Multi-Instance GPU) — нарезана на несколько изолированных инстансов — её нельзя выбрать по индексу карты. Запрос вида NVIDIA_VISIBLE_DEVICES: 7 или device_ids: ['7'] для MIG-родителя молча игнорируется: рантайм не может выдать целую MIG-карту, и контейнер в итоге видит дефолтный GPU 0 (а модель садится не туда — типично на уже занятую карту → CUDA out of memory).

MIG-инстансы адресуются только по UUID.

Как определить, что карта в режиме MIG:

nvidia-smi
# В колонке "MIG M." у такой карты будет "Enabled".
# Ниже появляется секция "MIG devices" со списком инстансов (GI / CI ID).

Шаг 1 — получить UUID нужного MIG-инстанса:

nvidia-smi -L

Пример вывода:

GPU 7: NVIDIA H100 80GB HBM3 (UUID: GPU-abcd1234-...)
  MIG 3g.40gb     Device 0: (UUID: MIG-5f4e3d2c-1111-2222-3333-444455556666)
  MIG 3g.40gb     Device 1: (UUID: MIG-6a7b8c9d-aaaa-bbbb-cccc-ddddeeeeffff)

Берётся UUID того инстанса, где достаточно свободной VRAM (занятость видна в секции «MIG devices» обычного nvidia-smi).

Шаг 2 — указать MIG-UUID в compose. Выберите ровно один из двух способов ниже. Самая частая ошибка — оставить gpus: all или count: 1/count: all: такой «широкий» запрос устройств выставляет NVIDIA_VISIBLE_DEVICES=all на уровне рантайма и перебивает ваш точечный селектор → контейнер снова садится на GPU 0.

Не совмещайте механизмы выбора

Уберите gpus: all и count: из сервиса. Нельзя одновременно использовать «широкий» запрос (gpus: all / count) и точечный селектор по UUID — широкий запрос побеждает, и выбор MIG-инстанса не сработает.

Вариант A — runtime: nvidia + NVIDIA_VISIBLE_DEVICES (проверено на H100 MIG):

  threat-detector:
    runtime: nvidia          # ОБЯЗАТЕЛЬНО: без него переменная ниже не работает —
                             # контейнер запускается без GPU («NVIDIA driver was not detected»)
    environment:
      NVIDIA_VISIBLE_DEVICES: "MIG-5f4e3d2c-1111-2222-3333-444455556666"
      NVIDIA_DRIVER_CAPABILITIES: "compute,utility"
    # НЕТ gpus:, НЕТ deploy.resources.reservations.devices

runtime: nvidia требует, чтобы NVIDIA-рантайм был зарегистрирован в Docker. Проверка и (при необходимости) регистрация:

docker info | grep -iE "Runtimes|Default Runtime"   # в списке должен быть "nvidia"
# если nvidia нет:
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Вариант B — device_ids с MIG-UUID (compose-native, не требует runtime:):

  threat-detector:
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["MIG-5f4e3d2c-1111-2222-3333-444455556666"]
              capabilities: [gpu]
    # НЕТ gpus:, НЕТ NVIDIA_VISIBLE_DEVICES

device_ids принимает MIG-UUID напрямую. Используйте либо Вариант A, либо Вариант B — не оба сразу.

Быстрая проверка вне compose

Прежде чем править стенд, убедитесь, что инстанс вообще выбирается:

docker run --rm --runtime=nvidia \
  -e NVIDIA_VISIBLE_DEVICES=MIG-5f4e3d2c-1111-2222-3333-444455556666 \
  nvidia/cuda:12.8.1-base-ubuntu22.04 nvidia-smi -L

Ожидается одна строка — этот MIG-инстанс. Если карту пересоздавали или хост перезагружали, UUID инстанса меняется — перепроверьте nvidia-smi -L.

Шаг 3 — проверить, что контейнер видит ровно один (нужный) инстанс:

docker exec llm-firewall-threat-detector nvidia-smi -L
# Ожидаем одну строку MIG-инстанса, а не список из всех GPU.

Параметризация UUID через .env (UUID не хранить в репозитории)

MIG-UUID уникален для конкретной машины — его нельзя коммитить в compose-файл. Вынесите его в .env на стороне сервера:

# /opt/llm-firewall/.env
THREAT_DETECTOR_GPU_DEVICE=MIG-5f4e3d2c-1111-2222-3333-444455556666
CONTENT_SAFETY_GPU_DEVICE=MIG-6a7b8c9d-aaaa-bbbb-cccc-ddddeeeeffff
# docker-compose.yml
  threat-detector:
    environment:
      NVIDIA_VISIBLE_DEVICES: "${THREAT_DETECTOR_GPU_DEVICE:-all}"
  content-safety:
    environment:
      NVIDIA_VISIBLE_DEVICES: "${CONTENT_SAFETY_GPU_DEVICE:-all}"

Значение по умолчанию :-all сохраняет прежнее поведение на одно-GPU-серверах, где переменная не задана. Для срабатывания NVIDIA_VISIBLE_DEVICES сервису нужен runtime: nvidia (Вариант A выше) и отсутствие gpus: all / count:.

Разнесение сервисов по разным инстансам

Каждая из ML-моделей (threat-detector, content-safety) требует ~10 GB VRAM (≈8 GB веса + KV cache и overhead). MIG-инстанс не «видит» память соседних инстансов — модели доступен только объём его профиля, поэтому слишком мелкий слайс приводит к CUDA out of memory при загрузке модели, даже если на физической карте 80 GB.

MIG-профиль (H100) VRAM инстанса Пригодность
1g.10gb ~10 GB ❌ впритык/недостаточно для одной модели
2g.20gb / 3g.20gb ~20 GB ✅ одна модель с запасом (один сервис на инстанс)
3g.40gb / 4g.40gb ~40 GB ✅ обе модели на одном инстансе

Поэтому на нарезанной карте обычно разносят сервисы по двум разным инстансам (≥20 GB каждый), указав каждому свой UUID (как в примере выше) — это изолирует их по VRAM и compute. Сажать threat-detector и content-safety на один инстанс имеет смысл только при профиле ≥ ~40 GB.

Нехватка памяти на слайсе

Если модель падает с CUDA out of memory именно на MIG-инстансе — слайс мал. Варианты: (1) выбрать MIG-инстанс с бóльшим профилем (≥20 GB на сервис), (2) развести два ML-сервиса по разным инстансам, (3) если у администратора GPU есть возможность — перенарезать карту на профили нужного размера. Уменьшить аппетит моделей нельзя: они грузятся в float16 без квантизации.

Совместимость драйвера/тулкита

Работа с MIG требует NVIDIA Container Toolkit ≥ 1.14 и драйвера с поддержкой MIG (datacenter-карты: A100, A30, H100 и др.). Сам режим MIG включается на хосте администратором GPU (nvidia-smi -mig 1 + создание инстансов через nvidia-smi mig -cgi/-cci) и в этой документации не описывается — предполагается, что инстансы уже нарезаны.

Переменные окружения по сервисам

API Gateway (порт 8085)

Переменная Значение Описание
GATEWAY_SERVER_PORT 8080 Внутренний порт (маппится 8085→8080)
GATEWAY_SERVER_HOST 0.0.0.0 Адрес привязки
GATEWAY_REDIS_ADDRESS redis:6379 Адрес Redis
GATEWAY_SERVICES_PROFILES_REGISTRY_URL http://profiles-registry:8000 URL Profiles Registry
GATEWAY_SERVICES_NORMALIZER_URL http://request-normalizer:8081 URL Normalizer
GATEWAY_SERVICES_PII_DETECTOR_URL http://pii-detector:8082 URL PII Detector
GATEWAY_SERVICES_THREAT_DETECTOR_URL http://threat-detector:8090 URL Threat Detector
GATEWAY_SERVICES_THREAT_DETECTOR_TIMEOUT 30000 Таймаут Threat Detector (мс)
GATEWAY_SERVICES_PDP_URL http://pdp:8080 URL PDP
GATEWAY_SERVICES_CONTENT_POLICY_URL http://content-policy-service:8089 URL Content Policy Service
GATEWAY_SERVICES_CONTENT_POLICY_TIMEOUT 5000 Таймаут Content Policy (мс)
GATEWAY_SERVICES_TRANSLATION_URL http://translation-service:8087 URL Translation Service
GATEWAY_SERVICES_TRANSLATION_TIMEOUT 5000 Таймаут Translation (мс)
GATEWAY_SERVICES_CONTENT_SAFETY_URL http://content-safety:8088 URL Content Safety
GATEWAY_SERVICES_CONTENT_SAFETY_TIMEOUT 10000 Таймаут Content Safety (мс)
GATEWAY_TRANSLATION_ENABLED false Перевод RU→EN; по умолчанию отключён, true — включить
GATEWAY_AUTH_ENABLED false Аутентификация (true для Keycloak)
EVENTS_ENABLED true Отправка событий в Redis Stream
GATEWAY_METRICS_ENABLED true Prometheus-метрики
GATEWAY_LLM_INSECURE_SKIP_VERIFY true Пропуск проверки TLS-сертификатов LLM backend
GATEWAY_REDIS_PASSWORD `` Пароль Redis (пустой по умолчанию)
LOG_LEVEL info Уровень логирования
LOG_FORMAT json Формат логов

Threat Detector (порт 8090)

Переменная Значение Описание
THREAT_DETECTOR_HOST 0.0.0.0 Адрес привязки
THREAT_DETECTOR_PORT 8090 Порт сервиса
THREAT_DETECTOR_MODEL_PATH /models/threat-model Путь к модели (директория)
THREAT_DETECTOR_ML_DEVICE cuda Устройство inference; поддерживается только cuda
THREAT_DETECTOR_N_THREADS 4 Количество потоков
NVIDIA_VISIBLE_DEVICES all Видимые GPU

Content Safety (порт 8088)

Переменная Значение Описание
CONTENT_SAFETY_PORT 8088 Порт сервиса
CONTENT_SAFETY_ML_USE_LOCAL true Использовать локальную модель
CONTENT_SAFETY_ML_DEVICE cuda Устройство inference; поддерживается только cuda
NVIDIA_VISIBLE_DEVICES all Видимые GPU

Translation Service (порт 8087)

Переменная Значение Описание
TRANSLATION_SERVICE_HOST 0.0.0.0 Адрес привязки
TRANSLATION_SERVICE_PORT 8087 Порт сервиса
TRANSLATION_SERVICE_MODEL_PATH /app/models/translation-model Путь к модели перевода
TRANSLATION_SERVICE_MODEL_PATH_CT2 /app/models/translation-model-ct2 Путь к CT2-оптимизированной модели
TRANSLATION_SERVICE_USE_CT2 true Использовать оптимизированный движок перевода
TRANSLATION_SERVICE_MODEL_DEVICE cuda Устройство inference; поддерживается только cuda
TRANSLATION_SERVICE_GPU_COMPUTE_TYPE float16 Точность вычислений
NVIDIA_VISIBLE_DEVICES all Видимые GPU

PII Detector (порт 8084)

Переменная Значение Описание
PII_DETECTOR_HOST 0.0.0.0 Адрес привязки
PII_DETECTOR_PORT 8082 Внутренний порт (маппится 8084→8082)
PII_DETECTOR_DEFAULT_THRESHOLD 0.8 Порог детекции
PII_DETECTOR_DEFAULT_LANGUAGE en Язык по умолчанию
PII_DETECTOR_ENABLE_NATASHA_NER true Включить расширенный NER для русского
PII_DETECTOR_ENABLE_METRICS true Prometheus-метрики

Content Policy Service (порт 8089)

Переменная Значение Описание
CONTENT_POLICY_PORT 8089 Порт сервиса
CONTENT_POLICY_LOG_LEVEL info Уровень логирования
CONTENT_POLICY_CACHE_MAX_SIZE 1000 Размер LRU-кеша

Event Exporter (порт 8091)

Переменная Значение Описание
EVENT_EXPORTER_PORT 8090 Внутренний порт (маппится 8091→8090)
EVENT_EXPORTER_REDIS_URL redis://redis:6379 Адрес Redis
EVENT_EXPORTER_REDIS_STREAM_KEY security_events Ключ Redis Stream
EVENT_EXPORTER_CONSUMER_GROUP event-exporter-group Consumer group
EVENT_EXPORTER_ADMIN_API_URL http://admin-api:8001 URL Admin API
EVENT_EXPORTER_PROFILES_REGISTRY_URL http://profiles-registry:8000 URL Profiles Registry
EVENT_EXPORTER_BATCH_SIZE 100 Размер батча
EVENT_EXPORTER_CONFIG_POLL_INTERVAL 30s Интервал опроса конфигурации

PDP (порт 8086)

Переменная Значение Описание
PDP_SERVER_HTTP_PORT 8080 Внутренний порт (маппится 8086→8080)
PDP_OPA_SERVER_URL http://opa:8181 URL OPA сервера
PDP_OPA_BUNDLE_URL http://minio:9000 URL MinIO для бандлов
PDP_OPA_BUNDLE_PATH policies/policies/default/bundle.tar.gz Путь к OPA bundle
PDP_OPA_TENANT_ID default Устаревшая. Фиксируется значением default (single-tenant); менять не требуется.
PDP_OPA_ENVIRONMENT production Окружение (production/development)
PDP_METRICS_ENABLED true Prometheus-метрики

Request Normalizer (порт 8081)

Переменная Значение Описание
NORMALIZER_SERVER_HTTP_PORT 8081 Порт сервиса
NORMALIZER_SERVER_HOST 0.0.0.0 Адрес привязки
NORMALIZER_NORMALIZER_DEFAULT_LANGUAGE en Язык по умолчанию
NORMALIZER_NORMALIZER_MAX_PAYLOAD_SIZE_MB 50 Максимальный размер payload (МБ)
NORMALIZER_NORMALIZER_MAX_ATTACHMENT_SIZE_MB 10 Максимальный размер вложения (МБ)
NORMALIZER_NORMALIZER_PROCESSING_TIMEOUT 5s Таймаут обработки
NORMALIZER_METRICS_ENABLED true Prometheus-метрики

Profiles Registry (порт 8000)

Переменная Значение Описание
DATABASE_URL postgresql+asyncpg://postgres:postgres@postgres:5432/profiles_registry URL базы данных
REDIS_URL redis://redis:6379/0 URL Redis
S3_ENDPOINT_URL http://minio:9000 URL MinIO (схема решает TLS)
S3_ACCESS_KEY minioadmin Ключ доступа MinIO
S3_SECRET_KEY minioadmin Секретный ключ MinIO
S3_BUCKET policies Bucket для OPA bundles
POLICY_SYNC_ENABLED true Синхронизация политик
HEALTH_CHECK_ENABLED true Фоновые health checks провайдеров
HEALTH_CHECK_INTERVAL_SECONDS 60 Интервал проверок
HEALTH_CHECK_TIMEOUT_SECONDS 5 Таймаут health check
HEALTH_CHECK_RETRIES 2 Количество повторных попыток

Admin API (порт 8001)

Переменная Значение Описание
ADMIN_DATABASE_URL postgresql+asyncpg://postgres:postgres@postgres:5432/admin_api_db URL базы данных
PROFILES_REGISTRY_URL http://profiles-registry:8000 URL Profiles Registry
REDIS_URL redis://redis:6379 URL Redis
REPORTS_DIR /data/reports Директория для отчётов
S3_URL http://minio:9000 URL MinIO
S3_ACCESS_KEY minioadmin Ключ доступа MinIO
S3_SECRET_KEY minioadmin Секретный ключ MinIO
S3_POLICIES_BUCKET policies Bucket для политик
KEYCLOAK_URL http://keycloak:8080 URL Keycloak
KEYCLOAK_REALM llm-firewall Realm в Keycloak
OAUTH2_PROXY_ENABLED false Включить OAuth2 аутентификацию

Имя переменной для MinIO различается между сервисами

Admin API читает S3_URL, а Profiles Registry (таблица выше) — S3_ENDPOINT_URL. Это разные имена для одного и того же значения (адрес MinIO). Перепутанное имя не вызывает ошибку — Pydantic просто подставляет дефолт http://localhost:9000, и сервис молча не может достучаться до MinIO (для Admin API это ломает ручной CRUD политик через /api/v1/policies и страницу «Policies» в Admin UI, при этом синхронизация бандлов из Profiles Registry продолжает работать). Проверяйте оба имени по-отдельности при диагностике.

Tokenization Vault (порт 8092, internal-only)

Сервис обратимой PII-токенизации (профили с режимом токенизации PII при отправке во внешние LLM). Порт не публикуется на хост — вызывается только api-gateway изнутри docker-сети.

Переменная Значение Описание
VAULT_DATABASE_URL postgresql+asyncpg://postgres:postgres@postgres:5432/vault_db URL базы данных
VAULT_MASTER_KEY (обязательно, без дефолта) Мастер-ключ шифрования токенов (openssl rand -base64 32) — см. Файл переменных окружения

Retention Worker

Переменная Значение Описание
ADMIN_DATABASE_URL postgresql+asyncpg://postgres:postgres@postgres:5432/admin_api_db URL базы данных
RETENTION_CLEANUP_INTERVAL_HOURS 24 Интервал очистки (часы)
RETENTION_INITIAL_DELAY_SECONDS 60 Задержка первого запуска

Admin API Consumer (фоновый воркер)

Переменная Значение Описание
ADMIN_DATABASE_URL postgresql+asyncpg://postgres:postgres@postgres:5432/admin_api_db URL базы данных
REDIS_URL redis://redis:6379 URL Redis
REDIS_STREAM_NAME security_events Имя Redis Stream
REDIS_CONSUMER_GROUP events-consumer-group Consumer group
BATCH_SIZE 100 Размер батча
BLOCK_MS 1000 Таймаут блокирующего чтения (мс)

LLM Gateway Adapter (порт 8095)

Используется для интеграции с внешним LLM Gateway (LiteLLM, Portkey). Если у вас нет такой интеграции — сервис простаивает и не влияет на работу системы. Полное руководство по настройке — см. Интеграция с LiteLLM. Полный список переменных — Переменные окружения.

Переменная Значение Описание
SERVICE_PORT 8000 Внутренний порт (маппится 8095→8000)
LOG_LEVEL INFO Уровень логирования
LOG_FORMAT json Формат логов
ADAPTER_AIGATE_URL http://api-gateway:8080 Base URL api-gateway для guardrail-проверки
ADAPTER_AIGATE_REQUEST_PATH /_aigate/v1/adapters/litellm Канонический scan-эндпоинт api-gateway (Feature 030)
ADAPTER_AIGATE_PROFILE_ID "" id профиля scan_only/dual; передаётся в заголовке X-AIGate-Profile-ID
ADAPTER_AIGATE_TENANT_ID default Значение заголовка X-Tenant-ID. Устаревшая: шлюз принимает и игнорирует (single-tenant), можно не задавать.
ADAPTER_AIGATE_TEAM_HEADER X-LLM-Team Имя header для team-routing
ADAPTER_AIGATE_HTTP_TIMEOUT_CONNECT_SEC 0.5 httpx connect-timeout
ADAPTER_AIGATE_HTTP_TIMEOUT_READ_SEC 1.0 httpx read-timeout (на k8s с реальными ML detectors поднимают до 5.0)
ADAPTER_AIGATE_HTTP_TIMEOUT_WRITE_SEC 0.5 httpx write-timeout
ADAPTER_AIGATE_HTTP_TIMEOUT_POOL_SEC 0.5 httpx connection-pool acquire timeout

OPA (порт 8181)

Переменная Значение Описание
AWS_ACCESS_KEY_ID minioadmin Ключ доступа (для S3-совместимого MinIO)
AWS_SECRET_ACCESS_KEY minioadmin Секретный ключ (для S3-совместимого MinIO)
AWS_REGION us-east-1 Регион (формальный, для S3 API)

Настройка Keycloak (production)

Для production-среды с аутентификацией:

  1. Установите OAUTH2_PROXY_ENABLED=true в .env.
  2. Добавьте сервис Keycloak в docker-compose.yml.
  3. Выполните скрипт инициализации init-keycloak.sh для создания:

    • Realm llm-firewall.
    • Роли: admin, operator, viewer.
    • Начальных пользователей.

Подробная инструкция: см. файл AUTH_MODES_GUIDE.md в директории compose.