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

Установка и запуск

Раздел описывает развёртывание платформы AppSec.GenAI на одном хосте через Docker Compose из вендорской поставки. Этот сценарий предназначен для пилотных проектов, демонстраций и оценочного тестирования.

Подготовка сервера

Обновление системы

sudo apt-get update && sudo apt-get upgrade -y
sudo dnf update -y

Настройка лимитов файловых дескрипторов

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). Проверить текущие лимиты можно командой:

ulimit -n   # Ожидается: 65536
ulimit -u   # Ожидается: 32768

Настройка параметров виртуальной памяти

Добавьте параметры ядра, необходимые для корректной работы 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:

sudo usermod -aG docker $USER
newgrp 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. Перед загрузкой выполните аутентификацию:

docker login registry.appsec.global
# Username и Password предоставляет вендор

Стандартные образы

Помимо проприетарных образов 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 и заполнить.

cd $DEPLOY_DIR
mv env .env

Откройте .env в редакторе:

nano .env
# или
vim .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, значение будет таким:

    S3_PUBLIC_ENDPOINT=http://192.168.2.12:9000
    
  • Использовать localhost или 127.0.0.1 нельзя — браузер пользователя интерпретирует их как свой собственный хост.

  • Если на сервере настроен внешний reverse proxy для MinIO — укажите его публичный URL (например, https://s3.example.com).

Публичный ключ лицензирования

LICENSE_CENTER_PUBLIC_KEY — публичный ключ для проверки подписи лицензий. Значение по умолчанию заполнено в шаблоне env и обычно не требует изменения; при ротации ключей актуальное значение предоставляет вендор.


Загрузка образов

Перед первым запуском загрузите все образы из реестра:

cd $DEPLOY_DIR
docker compose pull

Размер загрузки

Полный набор образов занимает порядка 25 ГБ. При первой загрузке процесс может занять от 15 до 60 минут в зависимости от скорости канала. Рекомендуется выполнять загрузку с устойчивым подключением.


Запуск платформы

После загрузки образов поднимите стек:

docker compose up -d

Команда стартует все контейнеры в фоновом режиме. Платформа выполняет миграции БД, инициализацию хранилищ и seed-данных автоматически.

Проверьте статус контейнеров:

docker compose ps

Время инициализации

Полная инициализация при первом запуске занимает 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 контейнеры. Каждый микросервис имеет свой контейнер миграций, который:

  1. Запускается после готовности PostgreSQL (service_healthy).
  2. Выполняет миграции для создания/обновления таблиц в соответствующей схеме.
  3. Завершается с кодом 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) или другой ненулевой код, проверьте его логи:

docker logs <имя-контейнера-миграций>

Типичные причины:

  • 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".

Доступ к веб-интерфейсу

После успешного запуска всех сервисов откройте в браузере:

http://<IP_СТЕНДА>:8080

Где <IP_СТЕНДА> — тот же адрес, который указан в S3_PUBLIC_ENDPOINT.

Установка завершена

Если веб-интерфейс загружается и отображает главную страницу AppSec.GenAI — установка выполнена успешно. Для настройки параметров системы перейдите к разделу Конфигурация.