Установка и запуск¶
Раздел описывает развёртывание платформы AppSec.GenAI на одном хосте через Docker Compose из вендорской поставки. Этот сценарий предназначен для пилотных проектов, демонстраций и оценочного тестирования.
Подготовка сервера¶
Обновление системы¶
Настройка лимитов файловых дескрипторов¶
Docker-контейнеры и сервисы платформы требуют повышенных лимитов на файловые дескрипторы и количество процессов. Добавьте следующие строки в файл /etc/security/limits.conf:
sudo tee -a /etc/security/limits.conf << 'EOF'
# AppSec.GenAI — увеличенные лимиты для Docker
* soft nofile 65536
* hard nofile 65536
* soft nproc 32768
* hard nproc 32768
root soft nofile 65536
root hard nofile 65536
root soft nproc 32768
root hard nproc 32768
EOF
Применение изменений
Изменения вступят в силу после повторного входа в систему (re-login). Проверить текущие лимиты можно командой:
Настройка параметров виртуальной памяти¶
Добавьте параметры ядра, необходимые для корректной работы Redis и подсистем хранения:
# Для Redis — предотвращение ошибок при фоновом сохранении
sudo sysctl -w vm.overcommit_memory=1
# Для подсистем индексирования (если планируется использовать)
sudo sysctl -w vm.max_map_count=262144
Для сохранения настроек после перезагрузки:
sudo tee -a /etc/sysctl.d/99-appsec-genai.conf << 'EOF'
vm.overcommit_memory=1
vm.max_map_count=262144
EOF
sudo sysctl --system
Проверка Docker¶
Убедитесь, что Docker Engine и Docker Compose установлены и работают корректно:
# Версия Docker
docker --version
# Ожидается: Docker version 24.0.x или выше
# Версия Docker Compose
docker compose version
# Ожидается: Docker Compose version v2.20.x или выше
# Статус Docker daemon
sudo systemctl status docker
# Ожидается: Active: active (running)
# Тестовый запуск контейнера
docker run --rm hello-world
Запуск Docker без sudo
Для удобства работы добавьте текущего пользователя в группу docker:
Получение поставки¶
Вендорская поставка предоставляется в виде архива, содержащего конфигурацию Docker Compose. Сами образы контейнеров поставляются через приватный реестр registry.appsec.global и загружаются отдельно (см. ниже).
Состав архива¶
Распакуйте архив поставки в любой рабочий каталог (далее $DEPLOY_DIR). Должна получиться следующая структура:
$DEPLOY_DIR/
├── docker-compose.yml # основной файл оркестрации
├── env # шаблон переменных окружения (без точки)
├── postgres/ # каталог для файлов инициализации PostgreSQL
├── nats/ # каталог для конфигурации NATS
└── redis/ # каталог для конфигурации Redis
Доступ к поставке
Архив поставки, учётные данные для приватного реестра и публичный ключ лицензирования предоставляет вендор после заключения соглашения.
Аутентификация в реестре образов¶
Образы микросервисов AppSec.GenAI публикуются в приватном реестре registry.appsec.global. Перед загрузкой выполните аутентификацию:
Стандартные образы
Помимо проприетарных образов AppSec.GenAI, развёртывание использует публичные образы инфраструктурных сервисов (postgres:16-alpine, redis:7-alpine, nats:2.10-alpine, minio/minio:latest и др.), которые скачиваются с Docker Hub без отдельной аутентификации.
Состав образов¶
В поставке используются следующие проприетарные образы версии 2026.5.1 (актуальная версия указана в docker-compose.yml и может отличаться от приведённой):
| Образ | Назначение |
|---|---|
registry.appsec.global/appsecgenai-release/model-management:2026.5.1 |
Каталог моделей |
registry.appsec.global/appsecgenai-release/scan-profile:2026.5.1 |
Профили сканирования |
registry.appsec.global/appsecgenai-release/results:2026.5.1 |
Результаты и уязвимости |
registry.appsec.global/appsecgenai-release/scan-orchestrator:2026.5.1 |
Оркестрация сканирований |
registry.appsec.global/appsecgenai-release/jailbreak-service:2026.5.1 |
LLM Jailbreak (API + воркеры) |
registry.appsec.global/appsecgenai-release/asr-adversarial-service:2026.5.1 |
ASR Adversarial (API + воркеры) |
registry.appsec.global/appsecgenai-release/cv-adversarial-service:2026.5.1 |
CV Adversarial (API + воркеры) |
registry.appsec.global/appsecgenai-release/license-service:2026.5.1 |
Лицензирование |
registry.appsec.global/appsecgenai-release/ui-gateway:2026.5.1 |
BFF-прослойка для UI |
registry.appsec.global/appsecgenai-release/ui:2026.5.1 |
Веб-интерфейс (Angular) |
registry.appsec.global/appsecgenai-release/simples:2026.5.1 |
Эталонные данные для seed-контейнеров |
Конфигурация переменных окружения¶
В корне $DEPLOY_DIR находится файл env — шаблон переменных окружения. Перед запуском его необходимо переименовать в .env и заполнить.
Откройте .env в редакторе:
Содержимое файла .env¶
Минимальный набор переменных, которые необходимо задать:
# PostgreSQL
POSTGRES_USER=postgres
POSTGRES_PASSWORD=<НАДЁЖНЫЙ_ПАРОЛЬ>
# S3 / MinIO — учётные данные администратора
S3_ADMIN_USER=minioadmin
S3_ADMIN_PASSWORD=<НАДЁЖНЫЙ_ПАРОЛЬ>
# S3 / MinIO — внешний адрес для UI (см. примечание ниже)
S3_PUBLIC_ENDPOINT=http://<IP_ИЛИ_DNS_СТЕНДА>:9000
# Имя проекта (используется как префикс контейнеров и сетей)
COMPOSE_PROJECT_NAME=appsec-genai
# Публичный ключ лицензирования (предоставляет вендор)
LICENSE_CENTER_PUBLIC_KEY=<ЗНАЧЕНИЕ_ИЗ_ШАБЛОНА>
Обязательно смените пароли
Перед эксплуатацией замените все пароли, заданные в шаблоне по умолчанию, на надёжные. Подробное описание всех переменных приведено в разделе Конфигурация.
Параметр S3_PUBLIC_ENDPOINT¶
S3_PUBLIC_ENDPOINT — это внешний адрес S3-хранилища, по которому браузер пользователя обращается к артефактам сканирования (adversarial-изображения, аудиофайлы, отчёты). Параметр критичен: без корректного значения UI не сможет отображать вложения и скачивать отчёты.
Правила заполнения:
- В качестве значения укажите URL вида
http://<IP_ИЛИ_DNS>:9000, где IP/DNS — адрес стенда, доступный с рабочих мест пользователей. -
Если платформа разворачивается на стенде
192.168.2.12, значение будет таким: -
Использовать
localhostили127.0.0.1нельзя — браузер пользователя интерпретирует их как свой собственный хост. - Если на сервере настроен внешний reverse proxy для MinIO — укажите его публичный URL (например,
https://s3.example.com).
Публичный ключ лицензирования¶
LICENSE_CENTER_PUBLIC_KEY — публичный ключ для проверки подписи лицензий. Значение по умолчанию заполнено в шаблоне env и обычно не требует изменения; при ротации ключей актуальное значение предоставляет вендор.
Загрузка образов¶
Перед первым запуском загрузите все образы из реестра:
Размер загрузки
Полный набор образов занимает порядка 25 ГБ. При первой загрузке процесс может занять от 15 до 60 минут в зависимости от скорости канала. Рекомендуется выполнять загрузку с устойчивым подключением.
Запуск платформы¶
После загрузки образов поднимите стек:
Команда стартует все контейнеры в фоновом режиме. Платформа выполняет миграции БД, инициализацию хранилищ и seed-данных автоматически.
Проверьте статус контейнеров:
Время инициализации
Полная инициализация при первом запуске занимает 2–3 минуты (миграции БД, загрузка seed-данных, инициализация MinIO и NATS). Последующие запуски выполняются за 1–2 минуты. ML-воркеры могут прогреваться дополнительно 1–3 минуты.
Порядок загрузки контейнеров¶
Docker Compose автоматически управляет порядком запуска контейнеров на основе зависимостей (depends_on). Загрузка происходит в 7 уровней:
graph TB
subgraph L1["Уровень 1: Инфраструктура"]
PG[postgres]
N1[nats-1]
N2[nats-2]
N3[nats-3]
RD[redis]
MN[minio]
SD[simples-defaults]
end
subgraph L2["Уровень 2: Инициализация"]
MI[minio-init]
NI[nats-init]
M1[model-management-migrations]
M2[scan-profile-migrations]
M3[results-migrations]
M4[scan-orchestrator-migrations]
M5[jailbreak-migrations]
M6[asr-adversarial-migrations]
M7[cv-adversarial-migrations]
M8[license-service-migrations]
end
subgraph L3["Уровень 3: Seed-данные"]
S1[model-management-cv-seed]
S2[scan-profile-seed]
S3[jailbreak-seed]
end
subgraph L4["Уровень 4: API-сервисы"]
A1[model-management]
A2[scan-profile]
A3[results]
A4[jailbreak-api]
A5[asr-adversarial-api]
A6[cv-adversarial-api]
A7[license-service]
end
subgraph L5["Уровень 5: Оркестратор"]
SO[scan-orchestrator]
end
subgraph L6["Уровень 6: Воркеры"]
W1[jailbreak-preparator]
W2[jailbreak-attacker]
W3[jailbreak-judge]
W4[jailbreak-reporter]
W5[asr-preparator]
W6[asr-attacker]
W7[asr-judge]
W8[asr-reporter]
W9[cv-preparator]
W10[cv-attacker]
W11[cv-judge]
W12[cv-reporter]
end
subgraph L7["Уровень 7: Фронтенд"]
UG[ui-gateway]
UI[ui]
end
PG --> M1 & M2 & M3 & M4 & M5 & M6 & M7 & M8
MN --> MI
SD --> MI
N1 & N2 & N3 --> NI
M1 --> S1
M2 --> S2
M5 --> S3
S1 --> A1
S2 --> A2
M3 --> A3
S3 --> A4
M6 --> A5
M7 --> A6
M8 --> A7
A1 & A2 & A3 --> SO
A4 --> W1 --> W2 --> W3 --> W4
A5 --> W5 --> W6 --> W7 --> W8
A6 --> W9 --> W10 --> W11 --> W12
SO & A1 & A2 & A3 --> UG
classDef cluster fill:transparent,stroke:#888,stroke-width:1px
class L1,L2,L3,L4,L5,L6,L7 cluster
Описание уровней¶
| Уровень | Контейнеры | Описание | Условие перехода |
|---|---|---|---|
| 1. Инфраструктура | postgres, nats-½/3, redis, minio, simples-defaults | Базовые сервисы, стартуют параллельно | service_healthy для каждого |
| 2. Инициализация | minio-init, nats-init, 8 контейнеров миграций | Создание бакетов, потоков NATS, миграции БД | service_completed_successfully |
| 3. Seed-данные | 3 контейнера seed | Загрузка начальных данных | service_completed_successfully |
| 4. API-сервисы | 7 API-контейнеров | REST API каждого микросервиса | service_healthy |
| 5. Оркестратор | scan-orchestrator | Зависит от всех API-сервисов | service_healthy |
| 6. Воркеры | 12 воркеров (по 4 на сервис) | Обработчики задач атак | service_started |
| 7. Фронтенд | ui-gateway, ui | Веб-интерфейс и API Gateway | — |
Миграции и начальные данные¶
Автоматические миграции¶
При запуске платформы автоматически выполняются миграции базы данных через one-shot контейнеры. Каждый микросервис имеет свой контейнер миграций, который:
- Запускается после готовности PostgreSQL (
service_healthy). - Выполняет миграции для создания/обновления таблиц в соответствующей схеме.
- Завершается с кодом 0 при успехе.
Миграции выполняются для 8 схем в единой базе данных genai:
| Контейнер миграций | Схема БД | Описание |
|---|---|---|
model-management-migrations |
model_management |
Каталог моделей, контракты, мониторинг |
scan-profile-migrations |
scan_profile |
Профили сканирования, определения атак |
results-migrations |
results |
Результаты, уязвимости, артефакты |
scan-orchestrator-migrations |
scan_orchestrator |
Оркестрация сканирования, задания |
jailbreak-migrations |
jailbreak_service |
Промпты, шаблоны Jailbreak |
asr-adversarial-migrations |
asr_adversarial |
Данные ASR-атак |
cv-adversarial-migrations |
cv_adversarial |
Данные CV-атак |
license-service-migrations |
licensing |
Лицензирование |
Seed-данные¶
После успешного выполнения миграций запускаются контейнеры загрузки начальных данных:
| Контейнер | Загружаемые данные |
|---|---|
scan-profile-seed |
27+ определений атак с JSON Schema, 6 провайдеров LLM |
model-management-cv-seed |
Предварительно настроенные модели CV (VGG19, ResNet50) |
jailbreak-seed |
Библиотека Jailbreak-промптов |
Инициализация MinIO¶
Контейнер minio-init создаёт 10 бакетов и загружает файлы по умолчанию:
| Бакет | Назначение |
|---|---|
attack-artifacts |
Общие артефакты атак |
scan-reports |
Отчёты по сканированию |
model-artifacts |
Артефакты моделей |
model-weights |
Веса моделей (VGG19, ResNet50, Whisper) |
cv-images |
Изображения для CV-атак (panda.jpg) |
cv-attack-artifacts |
Артефакты CV-атак (состязательные изображения) |
audio-samples |
Аудиофайлы для ASR-атак (daba_sample.wav) |
asr-attack-artifacts |
Артефакты ASR-атак (состязательные аудиофайлы) |
results-artifacts |
Артефакты результатов |
jailbreak-reports |
Отчёты Jailbreak-сервиса |
Инициализация NATS JetStream¶
Контейнер nats-init создаёт 6 потоков с репликацией на 3 узла:
| Поток | Subjects | Retention | Max Age | Описание |
|---|---|---|---|---|
ATTACKS |
attacks.*.* |
limits | 7 дней | Распределение заданий атак |
SCANS |
scans.* |
limits | 30 дней | Жизненный цикл сканирований |
RESULTS |
results.*.* |
limits | 90 дней | Результаты и уязвимости |
ARTIFACTS |
artifacts.*.* |
limits | 30 дней | Артефакты атак |
VULNERABILITIES |
vulnerabilities.*.* |
limits | 90 дней | Детали уязвимостей |
NOTIFICATIONS |
notifications.* |
workq | 7 дней | Уведомления |
Проверка установки¶
Проверка контейнеров миграций¶
Все контейнеры миграций и инициализации должны завершиться с кодом 0 (Exited (0)):
docker ps -a --filter "name=migrations" --filter "name=seed" --filter "name=init" \
--format "table {{.Names}}\t{{.Status}}"
Ожидаемый результат:
NAMES STATUS
model-management-migrations Exited (0) 2 minutes ago
scan-profile-migrations Exited (0) 2 minutes ago
results-migrations Exited (0) 2 minutes ago
scan-orchestrator-migrations Exited (0) 2 minutes ago
jailbreak-migrations Exited (0) 2 minutes ago
asr-adversarial-migrations Exited (0) 2 minutes ago
cv-adversarial-migrations Exited (0) 2 minutes ago
license-service-migrations Exited (0) 2 minutes ago
model-management-cv-seed Exited (0) 2 minutes ago
scan-profile-seed Exited (0) 2 minutes ago
jailbreak-seed Exited (0) 2 minutes ago
minio-init Exited (0) 2 minutes ago
nats-init Exited (0) 2 minutes ago
simples-defaults Exited (0) 2 minutes ago
Если миграция завершилась с ошибкой
Если какой-либо контейнер миграций показывает Exited (1) или другой ненулевой код, проверьте его логи:
Типичные причины:
- PostgreSQL ещё не готов — перезапустите контейнер:
docker compose restart <имя>. - Ошибка в миграции — см. раздел Устранение неполадок.
Проверка инфраструктурных сервисов¶
# PostgreSQL
docker exec postgres pg_isready -U postgres
# Redis
docker exec redis redis-cli ping
# NATS (все 3 узла)
curl -s http://localhost:8222/healthz
curl -s http://localhost:8223/healthz
curl -s http://localhost:8224/healthz
# MinIO
curl -s http://localhost:9000/minio/health/live
Проверка микросервисов¶
curl -s http://localhost:8001/healthz # Model Management
curl -s http://localhost:8002/healthz # Scan Profile
curl -s http://localhost:8003/healthz # Results
curl -s http://localhost:8004/healthz # Scan Orchestrator
curl -s http://localhost:8005/healthz # Jailbreak Service
curl -s http://localhost:8025/healthz # ASR Adversarial
curl -s http://localhost:8008/healthz # CV Adversarial
curl -s http://localhost:8009/healthz # License Service
Каждая команда должна вернуть HTTP 200 и JSON со статусом "healthy" или "ok".
Доступ к веб-интерфейсу¶
После успешного запуска всех сервисов откройте в браузере:
Где <IP_СТЕНДА> — тот же адрес, который указан в S3_PUBLIC_ENDPOINT.
Установка завершена
Если веб-интерфейс загружается и отображает главную страницу AppSec.GenAI — установка выполнена успешно. Для настройки параметров системы перейдите к разделу Конфигурация.