Конфигурация¶
Переменные окружения (.env)¶
Все общие параметры конфигурации задаются в файле .env в директории compose/. Этот файл используется Docker Compose для подстановки значений в docker-compose.yml.
Создание файла .env¶
Полный пример файла .env¶
# ============================================================
# AppSec.GenAI Infrastructure Configuration
# ============================================================
# PostgreSQL
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres_secure_password_change_me
# S3/MinIO admin credentials
S3_ADMIN_USER=minioadmin
S3_ADMIN_PASSWORD=minioadmin_change_me
# Keycloak
KEYCLOAK_ADMIN=admin
KEYCLOAK_ADMIN_PASSWORD=admin_change_me
# Grafana (если используется)
GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=admin_change_me
# Elasticsearch (если используется)
ELASTIC_PASSWORD=elastic_change_me
# General
COMPOSE_PROJECT_NAME=appsec-genai
Описание переменных¶
| Переменная | Описание | Значение по умолчанию | Обязательная |
|---|---|---|---|
POSTGRES_USER |
Имя суперпользователя PostgreSQL | postgres |
Да |
POSTGRES_PASSWORD |
Пароль суперпользователя PostgreSQL | postgres_secure_password_change_me |
Да |
S3_ADMIN_USER |
Имя администратора MinIO (S3) | minioadmin |
Да |
S3_ADMIN_PASSWORD |
Пароль администратора MinIO (S3) | minioadmin_change_me |
Да |
KEYCLOAK_ADMIN |
Имя администратора Keycloak | admin |
Да |
KEYCLOAK_ADMIN_PASSWORD |
Пароль администратора Keycloak | admin_change_me |
Да |
GRAFANA_ADMIN_USER |
Имя администратора Grafana | admin |
Нет |
GRAFANA_ADMIN_PASSWORD |
Пароль администратора Grafana | admin_change_me |
Нет |
ELASTIC_PASSWORD |
Пароль Elasticsearch | elastic_change_me |
Нет |
COMPOSE_PROJECT_NAME |
Префикс имён контейнеров и сети | appsec-genai |
Да |
ENVIRONMENT |
Режим работы (dev, staging, production) |
dev |
Нет |
DEBUG |
Режим отладки (true/false) |
false |
Нет |
LOG_LEVEL |
Уровень логирования (DEBUG, INFO, WARNING, ERROR) |
INFO |
Нет |
AUTH_ENABLED |
Включение аутентификации через Keycloak | false |
Нет |
S3_PUBLIC_ENDPOINT |
Публичный URL MinIO для presigned URLs | http://localhost:9000 |
Нет |
Смените пароли перед эксплуатацией
Все значения по умолчанию предназначены исключительно для разработки. Перед развёртыванием в боевой среде обязательно замените все пароли на надёжные значения длиной не менее 16 символов.
Конфигурация PostgreSQL¶
Конфигурационный файл: compose/postgres/postgres.conf
Текущая конфигурация¶
# Connection Settings
listen_addresses = '*'
port = 5432
max_connections = 200
# Memory Settings
shared_buffers = 256MB
effective_cache_size = 1GB
work_mem = 16MB
maintenance_work_mem = 64MB
# Write Ahead Log
wal_level = replica
max_wal_size = 1GB
min_wal_size = 80MB
# Logging
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_min_duration_statement = 1000
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
# Performance
random_page_cost = 1.1
effective_io_concurrency = 200
# Autovacuum
autovacuum = on
autovacuum_max_workers = 3
Описание параметров¶
Подключения¶
| Параметр | Значение | Описание |
|---|---|---|
listen_addresses |
* |
Приём подключений на всех интерфейсах |
port |
5432 |
Порт PostgreSQL |
max_connections |
200 |
Максимальное количество одновременных подключений. Каждый микросервис использует пул из 20 подключений + 10 overflow |
Память¶
| Параметр | Значение | Описание |
|---|---|---|
shared_buffers |
256MB |
Общий буфер данных в памяти. Рекомендуется 25% RAM, выделенной PostgreSQL |
effective_cache_size |
1GB |
Оценка доступной памяти для кеширования дисковых операций |
work_mem |
16MB |
Память для операций сортировки и хеширования на один запрос |
maintenance_work_mem |
64MB |
Память для операций обслуживания (VACUUM, CREATE INDEX) |
WAL (Write-Ahead Log)¶
| Параметр | Значение | Описание |
|---|---|---|
wal_level |
replica |
Уровень WAL для поддержки репликации |
max_wal_size |
1GB |
Максимальный размер WAL до принудительного checkpoint |
min_wal_size |
80MB |
Минимальный размер WAL |
Логирование¶
| Параметр | Значение | Описание |
|---|---|---|
log_min_duration_statement |
1000 |
Логирование запросов длительностью более 1 секунды |
log_checkpoints |
on |
Логирование контрольных точек |
log_connections |
on |
Логирование новых подключений |
log_lock_waits |
on |
Логирование ожидания блокировок |
Рекомендации для production (64+ ГБ RAM)¶
При наличии 64 ГБ и более оперативной памяти рекомендуется обновить параметры:
# Memory Settings (for 64 GB RAM)
shared_buffers = 4GB
effective_cache_size = 16GB
work_mem = 64MB
maintenance_work_mem = 512MB
# Connection Settings
max_connections = 400
# WAL
max_wal_size = 4GB
min_wal_size = 512MB
# Checkpoints
checkpoint_completion_target = 0.9
# Performance
random_page_cost = 1.1
effective_io_concurrency = 200
default_statistics_target = 200
Конфигурация Redis¶
Конфигурационный файл: compose/redis/redis.conf
Текущая конфигурация¶
# Network
bind 0.0.0.0
protected-mode no
port 6379
# General
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
# Persistence — RDB snapshots
save 900 1 # Каждые 15 мин если >= 1 изменение
save 300 10 # Каждые 5 мин если >= 10 изменений
save 60 10000 # Каждую минуту если >= 10000 изменений
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data
# Append-only file (AOF)
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# Memory Management
maxmemory 512mb
maxmemory-policy allkeys-lru
# Lazy freeing
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
# Limits
maxclients 10000
Описание параметров¶
| Параметр | Значение | Описание |
|---|---|---|
bind |
0.0.0.0 |
Приём подключений на всех интерфейсах |
protected-mode |
no |
Отключён для работы внутри Docker-сети |
maxmemory |
512mb |
Максимальный объём памяти |
maxmemory-policy |
allkeys-lru |
Стратегия вытеснения: удалять самые давно используемые ключи |
appendonly |
yes |
Включена запись AOF-журнала |
appendfsync |
everysec |
Синхронизация AOF на диск каждую секунду |
Распределение баз данных по сервисам¶
Redis использует нумерованные базы данных для изоляции данных микросервисов:
| База данных | Сервисы | Назначение |
|---|---|---|
| DB 0 | Model Management, Jailbreak Service | Кеш моделей, статусы задач Jailbreak |
| DB 1 | Scan Orchestrator, Auth Service | Статусы сканирований, сессии авторизации |
| DB 2 | ASR Adversarial, License Service | Статусы задач ASR, кеш лицензий |
| DB 3 | CV Adversarial | Статусы задач CV |
Для production
В production-среде рекомендуется:
- Установить
requirepass <ПАРОЛЬ>для авторизации. - Увеличить
maxmemoryдо2gbили более. - Включить
protected-mode yesи ограничитьbindконкретными интерфейсами.
Конфигурация NATS JetStream¶
Кластер из 3 узлов¶
NATS развёрнут в виде кластера из 3 узлов для обеспечения отказоустойчивости и репликации данных.
| Узел | Client port | Monitoring port | Cluster port | IP-адрес |
|---|---|---|---|---|
| nats-1 | 4222 | 8222 | 6222 | 172.28.0.20 |
| nats-2 | 4223 | 8223 | 6223 | 172.28.0.21 |
| nats-3 | 4224 | 8224 | 6224 | 172.28.0.22 |
Конфигурация узла (nats-1.conf)¶
Каждый узел имеет идентичную структуру конфигурации (различается только server_name):
# NATS Server Configuration - Node 1
server_name: "nats-1"
# Network
host: 0.0.0.0
port: 4222
# HTTP Monitoring
http_port: 8222
# JetStream
jetstream {
store_dir: "/data"
max_memory_store: 1GB
max_file_store: 10GB
}
# Cluster Configuration
cluster {
name: appsec-genai-cluster
listen: 0.0.0.0:6222
routes: [
nats://nats-1:6222
nats://nats-2:6222
nats://nats-3:6222
]
}
# Logging
debug: false
trace: false
logtime: true
log_file: "/data/nats-server.log"
# Limits
max_payload: 10MB
max_pending: 64MB
max_connections: 1000
Описание параметров JetStream¶
| Параметр | Значение | Описание |
|---|---|---|
store_dir |
/data |
Директория хранения данных JetStream |
max_memory_store |
1GB |
Максимальный объём данных в памяти |
max_file_store |
10GB |
Максимальный объём данных на диске |
max_payload |
10MB |
Максимальный размер одного сообщения |
max_connections |
1000 |
Максимальное количество клиентских подключений |
Подключение микросервисов¶
Все микросервисы подключаются к первому узлу кластера с автоматическим failover:
При недоступности nats-1 клиент автоматически переключается на nats-2 или nats-3.
Конфигурация MinIO (S3)¶
Параметры¶
| Параметр | Значение | Описание |
|---|---|---|
| API endpoint | http://minio:9000 |
Внутренний адрес S3 API |
| Console | http://localhost:9001 |
Веб-консоль администрирования |
| Region | us-east-1 |
Регион (обязательный параметр для S3-совместимости) |
| Режим | Single-node | Однонодовый режим |
Бакеты¶
При инициализации создаётся 10 бакетов:
| Бакет | Назначение | Типичный размер |
|---|---|---|
attack-artifacts |
Общие артефакты атак | До 10 ГБ |
scan-reports |
Отчёты по сканированию | До 5 ГБ |
model-artifacts |
Артефакты моделей | До 1 ГБ |
model-weights |
Веса моделей (VGG19, ResNet50, Whisper) | До 5 ГБ |
cv-images |
Изображения для CV-атак | До 10 ГБ |
cv-attack-artifacts |
Результаты CV-атак (adversarial images) | До 50 ГБ |
audio-samples |
Аудиофайлы для ASR-атак | До 10 ГБ |
asr-attack-artifacts |
Результаты ASR-атак (adversarial audio) | До 50 ГБ |
results-artifacts |
Артефакты результатов | До 10 ГБ |
jailbreak-reports |
Отчёты Jailbreak-сервиса | До 5 ГБ |
Политика доступа
По умолчанию все бакеты создаются с политикой public (анонимный доступ на чтение). Это упрощает разработку, но недопустимо в production.
Для production-среды измените политику бакетов:
# Подключение к MinIO
docker exec -it minio mc alias set local http://localhost:9000 minioadmin <ПАРОЛЬ>
# Установка приватной политики
docker exec -it minio mc anonymous set private local/model-weights
docker exec -it minio mc anonymous set private local/cv-images
# ... и так для каждого бакета
После этого доступ к файлам будет осуществляться только через presigned URLs, генерируемые сервисами.
Безопасность¶
Обязательные действия перед production¶
Контрольный список безопасности
- Сменить все пароли в файле
.envна надёжные (минимум 16 символов). - Настроить firewall — открыть только порты 8080 и 3000 для внешнего доступа.
- Установить
requirepassв конфигурации Redis. - Изменить политику бакетов MinIO с public на private.
- Включить аутентификацию:
AUTH_ENABLED=trueвui-gateway. - Настроить TLS-терминирование через обратный прокси (nginx/Envoy).
Рекомендации по TLS¶
Для production-среды рекомендуется настроить TLS-терминирование с помощью обратного прокси-сервера (nginx, Traefik, Envoy):
# Пример конфигурации nginx
server {
listen 443 ssl http2;
server_name genai.example.com;
ssl_certificate /etc/ssl/certs/genai.crt;
ssl_certificate_key /etc/ssl/private/genai.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# UI
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# API Gateway
location /api/ {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# WebSocket
location /ws {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Безопасность NATS¶
Для production-среды рекомендуется включить TLS и аутентификацию в NATS:
# В файле nats-X.conf
tls {
cert_file: "/etc/nats/certs/server.crt"
key_file: "/etc/nats/certs/server.key"
ca_file: "/etc/nats/certs/ca.crt"
verify: true
}
authorization {
users = [
{ user: "service", password: "$2a$11$..." }
]
}
Безопасность API-ключей¶
API-ключи LLM-провайдеров
API-ключи для LLM-провайдеров (OpenAI, GigaChat и др.) задаются пользователями через веб-интерфейс при регистрации моделей. Эти ключи хранятся в зашифрованном виде в базе данных. Никогда не размещайте API-ключи в файле .env или конфигурационных файлах.