Конфигурация системы¶
Структура файлов¶
/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:
Этот блок требует установленного 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-инстанса:
Пример вывода:
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-среды с аутентификацией:
- Установите
OAUTH2_PROXY_ENABLED=trueв.env. - Добавьте сервис Keycloak в docker-compose.yml.
-
Выполните скрипт инициализации
init-keycloak.shдля создания:- Realm
llm-firewall. - Роли:
admin,operator,viewer. - Начальных пользователей.
- Realm
Подробная инструкция: см. файл AUTH_MODES_GUIDE.md в директории compose.