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

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

Предварительные требования

Необходимое программное обеспечение

На машине, где будет разворачиваться приложение, должны быть установлены следующие пакеты:

Обязательные пакеты:

  • docker - Docker Engine.
  • docker-compose или docker compose (v2) - Docker Compose.
  • openssl - для генерации TLS сертификатов (если используется TLS).
  • ssh / openssh-client - SSH клиент (если используется SSH).
  • scp - для копирования файлов по SSH (если используется SSH).
  • curl или wget - для проверки доступности сервисов.

Проверка установки пакетов:

# Проверка Docker
docker --version
docker compose version

# Проверка OpenSSL
openssl version

# Проверка SSH
ssh -V

# Проверка SCP
scp -V

Установка пакетов:

sudo apt-get update
sudo apt-get install -y docker.io docker-compose openssl openssh-client curl
sudo yum install -y docker docker-compose openssl openssh-clients curl
# или для новых версий
sudo dnf install -y docker docker-compose openssl openssh-clients curl

Другие требования

  • Сетевой доступ к приватному registry registry.appsec.global.
  • Получен доступ к архиву от вендора и он скачен на машину.
  • Получены от вендора УЗ для доступа к registry.
  • Права root или sudo на конечной машине (для установки пакетов и настройки Docker).
  • Решение о способе подключения к Docker daemon: SSH или TLS (выберите один вариант).

Важно!

Перед началом установки определитесь, какой способ подключения к Docker daemon вы будете использовать:

  • SSH - более простой способ, требует настройки SSH-ключей.
  • TLS - более безопасный способ, требует настройки TLS-сертификатов.

В зависимости от выбора, во время установки выполните либо Шаг 5 (SSH), либо Шаг 6 (TLS).

Шаг 1: Подготовка рабочей директории

Предполагается, что архив уже скачан и распакован в директорию (например, /opt/genai/release_X.Y.Z или /home/user/genai).

Важно!

  1. Замените путь на реальный путь к вашей директории с распакованным архивом.
  2. Замените X.Y.Z на номер версии релиза.

Перейдите в директорию с распакованным архивом:

cd /path/to/release_directory

где release_directory - это директория, куда вы распаковали архив от вендора.

Проверьте структуру директории:

ls -la

Должны присутствовать следующие директории и файлы:

  • docker-compose-example.yml.
  • nginx/ (с файлами template_nginx.conf и conf.d/template_default.conf).
  • static/.
  • model/.
  • ssh/.
  • docker_certificates/.

Шаг 2: Переименование файлов конфигурации

2.1. Переименование docker-compose файла

cp docker-compose-example.yml docker-compose.yml

2.2. Переименование nginx конфигураций

# Переименование основного конфига nginx
cp nginx/template_nginx.conf nginx/nginx.conf

# Переименование конфига default.conf
cp nginx/conf.d/template_default.conf nginx/conf.d/default.conf

Проверьте, что файлы созданы:

ls -la nginx/
ls -la nginx/conf.d/

Шаг 3: Настройка docker-compose.yml

Откройте файл docker-compose.yml для редактирования:

nano docker-compose.yml
# или
vim docker-compose.yml

Замените содержимое файла следующим:

services:

  genai-db:
    image: registry.appsec.global/appsecgenai/release/postgres:X.Y.Z
    container_name: genai-db
    ports:
      - "5433:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    env_file:
      - .env

  genai:
    image: registry.appsec.global/appsecgenai/release/core:X.Y.Z
    container_name: genai
    depends_on:
      - genai-db
    ports:
      - "8003:8003"
    volumes:
      - ./static:/app/static:Z
      - ./model:/app/model:Z
      - ./docker_certificates:/app/docker_certificates:Z # Если используем TLS
      - ./ssh/id_ed25519:/home/genai/.ssh/id_ed25519:Z # Если используем SSH
    env_file:
      - .env
    restart: unless-stopped
    entrypoint: ["/app/entrypoint.sh"]

  acoustic-poisoner:
    image: registry.appsec.global/appsecgenai/release/acoustic-poisoner:X.Y.Z
    container_name: appsecgenai-acoustic-poisoner
    ports:
      - "8008:8008"
    labels:
      - "keyword=acoustic-poisoners"

  frontend:
    image: registry.appsec.global/appsecgenai/release/ui:X.Y.Z
    container_name: genai-ui
    ports:
      - "80:8080"
    depends_on:
      - genai
    restart: unless-stopped
    volumes:
      - ./static:/usr/share/nginx/html/static
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:ro

volumes:
  postgres_data:

Важно!

  • Если используете SSH, оставьте только volume для SSH и удалите строку с docker_certificates.
  • Если используете TLS, оставьте только volume для docker_certificates и удалите строку с SSH.

Шаг 4: Создание файла .env

В архиве должен быть файл env (или .env.example), который является шаблоном для создания файла .env.

4.0. Создание файла .env из шаблона

Создайте файл .env на основе шаблона:

# Если в архиве есть файл env
cp env .env

# Или если файл называется .env.example
cp .env.example .env

Проверьте, что файл создан:

ls -la .env

Откройте файл для редактирования:

nano .env
# или
vim .env

Важно!

Файл env (или .env.example) содержит только шаблоны с описаниями на русском языке. Вам необходимо заменить все описания на реальные значения.

Список всех переменных окружения

Обязательные переменные:

  • Django: DEBUG, SECRET_KEY, DJANGO_ALLOWED_HOSTS, CSRF_TRUSTED_ORIGINS.
  • База данных: DATABASE_NAME, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, DATABASE_DUMP.
  • PostgreSQL: POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD.
  • Docker: IS_DOCKER_TLS, IP_DOCKER, IS_DOCKER_LOCAL + (SSH: DOCKER_USER, DOCKER_KEY_PATH, DOCKER_PASSPHRASE) или (TLS: DOCKER_TLS_PORT, IS_DOCKER_TLS_VERIFY).
  • Сервисы: ADDRESS_HOST_PLATFORM, ADDRESS_SCANER_PLATFORM, ADDRESS_ACUSTIC_POISONER.
  • Токены: GIGA_TOKEN, OPENAPI_TOKEN.
  • Email: EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD, DEFAULT_FROM_EMAIL.

Опциональные переменные:

  • DOCKER_EXCLUDE_KEYWORDS, DEFAULT_NUM_JAILBREAK, LARGE_MODEL_TIMEOUT_REQUEST, POLIGON, ONLINE_LLM, INTERVAL_EMAIL.
  • Дополнительно: TF_CPP_MIN_LOG_LEVEL.

Ниже приведено детальное описание всех переменных окружения с примерами значений. Используйте это описание для заполнения файла .env:

4.1. Базовые настройки Django

DEBUG

Описание: Режим отладки Django. Включает детальные сообщения об ошибках и отладочную информацию.

Тип: Boolean (True/False).

Обязательная: Да.

Значения:

  • True - режим отладки включен (для разработки)
  • False - режим отладки выключен (для production)

Пример:

DEBUG=False

SECRET_KEY

Описание: Секретный ключ Django, используемый для криптографической подписи сессий, CSRF токенов и других целей безопасности. Должен быть уникальным и храниться в секрете.

Тип: String.

Обязательная: Да.

Генерация SECRET_KEY:

python3 -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"

Пример:

SECRET_KEY=django-insecure-abc123xyz789-change-this-to-random-secret-key

DJANGO_ALLOWED_HOSTS

Описание: Список разрешенных хостов для работы приложения. Django будет обрабатывать запросы только с указанных хостов. Используется для защиты от атак Host header.

Тип: String (разделенные запятыми).

Обязательная: Да.

Формат: Список хостов через запятую, без пробелов.

Примеры:

# Для локальной разработки
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1

# Для production с доменом
DJANGO_ALLOWED_HOSTS=genai.example.com,192.168.1.100

# Для Docker (имя контейнера)
DJANGO_ALLOWED_HOSTS=genai,localhost,127.0.0.1

CSRF_TRUSTED_ORIGINS

Описание: Список доверенных источников для CSRF защиты. Django будет принимать POST запросы только с указанных источников.

Тип: String (разделенные запятыми).

Обязательная: Да.

Формат: Список URL через запятую, включая протокол (http:// или https://).

Примеры:

# Для локальной разработки
CSRF_TRUSTED_ORIGINS=http://localhost,http://127.0.0.1

# Для production
CSRF_TRUSTED_ORIGINS=https://genai.example.com,http://192.168.1.100:8003

# С портами
CSRF_TRUSTED_ORIGINS=http://localhost:8003,http://192.168.1.100:8003

4.2. Настройки базы данных

DATABASE_NAME

Описание: Имя базы данных PostgreSQL, к которой будет подключаться приложение.

Тип: String.

Обязательная: Да.

Пример:

DATABASE_NAME=genai_db

DATABASE_USERNAME

Описание: Имя пользователя для подключения к базе данных PostgreSQL.

Тип: String.

Обязательная: Да.

Пример:

DATABASE_USERNAME=genai_user

DATABASE_PASSWORD

Описание: Пароль пользователя базы данных. Используйте надежный пароль в production.

Тип: String.

Обязательная: Да.

Пример:

DATABASE_PASSWORD=your-strong-password-here

DATABASE_HOST

Описание: Хост базы данных. В Docker Compose используйте имя сервиса контейнера с БД.

Тип: String.

Обязательная: Да.

Примеры:

# Для Docker Compose (имя сервиса)
DATABASE_HOST=genai-db

# Для внешней БД
DATABASE_HOST=192.168.1.100

DATABASE_PORT

Описание: Порт базы данных PostgreSQL. Стандартный порт PostgreSQL - 5432.

Тип: Integer.

Обязательная: Да.

Пример:

DATABASE_PORT=5432

DATABASE_DUMP

Описание: Флаг для загрузки дампа базы данных при первом запуске. Используется в entrypoint.sh контейнера. После успешной загрузки дампа установите в False.

Тип: Boolean (True/False).

Обязательная: Да (при первом запуске).

Значения:

  • True - загрузить дамп БД при запуске контейнера.
  • False - не загружать дамп (используйте после первого запуска).

Пример:

# При первом запуске
DATABASE_DUMP=True

# После загрузки дампа
DATABASE_DUMP=False

POSTGRES_DB

Описание: Имя базы данных для инициализации PostgreSQL контейнера. Должно совпадать с DATABASE_NAME.

Тип: String.

Обязательная: Да.

Важно: Значение должно совпадать с DATABASE_NAME.

Пример:

POSTGRES_DB=genai_db

POSTGRES_USER

Описание: Имя пользователя для инициализации PostgreSQL контейнера. Должно совпадать с DATABASE_USERNAME.

Тип: String.

Обязательная: Да.

Важно: Значение должно совпадать с DATABASE_USERNAME.

Пример:

POSTGRES_USER=genai_user

POSTGRES_PASSWORD

Описание: Пароль пользователя для инициализации PostgreSQL контейнера. Должен совпадать с DATABASE_PASSWORD.

Тип: String.

Обязательная: Да.

Важно: Значение должно совпадать с DATABASE_PASSWORD.

Пример:

POSTGRES_PASSWORD=your-strong-password-here

4.3. Настройки Docker подключения

Выберите один из вариантов: SSH или TLS.

IS_DOCKER_TLS

Описание: Флаг выбора способа подключения к Docker daemon. Определяет, будет ли использоваться SSH или TLS для подключения к удаленному Docker.

Тип: Boolean (True/False).

Обязательная: Да.

Значения:

  • False - использовать SSH подключение.
  • True - использовать TLS подключение.

Пример:

# Для SSH
IS_DOCKER_TLS=False

# Для TLS
IS_DOCKER_TLS=True

IP_DOCKER

Описание: IP-адрес или hostname машины, где находится Docker daemon с моделями для сканирования.

Тип: String.

Обязательная: Да.

Примеры:

# IP адрес
IP_DOCKER=192.168.1.100

# Hostname
IP_DOCKER=docker-server.example.com

IS_DOCKER_LOCAL

Описание: Указывает, находятся ли Docker образы с моделями в той же Docker сети, что и GenAI, или на удаленной машине.

Тип: Boolean (True/False).

Обязательная: Да.

Значения:

  • True - Docker образы находятся в той же сети (локально).
  • False - Docker образы находятся на удаленной машине.

Пример:

IS_DOCKER_LOCAL=False

DOCKER_EXCLUDE_KEYWORDS

Описание: Список ключевых слов для исключения контейнеров из отображения в UI при Docker сканировании. Контейнеры, имена или образы которых содержат эти ключевые слова, не будут показаны в интерфейсе.

Тип: String (разделенные запятыми или пробелами).

Обязательная: Нет.

Примеры:

# Через запятую
DOCKER_EXCLUDE_KEYWORDS=acoustic-poisoner,nginx,postgres,appsecgenai

# Через пробел (если поддерживается)
DOCKER_EXCLUDE_KEYWORDS=acoustic-poisoner nginx postgres

SSH подключение (IS_DOCKER_TLS=False)

Если выбран SSH способ подключения, настройте следующие переменные:

DOCKER_USER

Описание: Имя пользователя для SSH подключения к машине с Docker daemon.

Тип: String.

Обязательная: Да (для SSH).

Пример:

DOCKER_USER=genai

DOCKER_KEY_PATH

Описание: Путь к приватному SSH ключу внутри контейнера. Ключ должен быть смонтирован как volume в docker-compose.yml.

Тип: String (путь к файлу).

Обязательная: Да (для SSH).

Важно!

Имя файла ключа должно быть именно id_ed25519.

Пример:

DOCKER_KEY_PATH=/home/genai/.ssh/id_ed25519

DOCKER_PASSPHRASE

Описание: Парольная фраза для SSH ключа, если ключ защищен паролем. Если ключ не защищен паролем, оставьте пустым.

Тип: String.

Обязательная: Нет (только если ключ защищен паролем).

Пример:

# Если ключ защищен паролем
DOCKER_PASSPHRASE=your-passphrase-here

# Если ключ не защищен
DOCKER_PASSPHRASE=

Пример полной конфигурации для SSH:

IS_DOCKER_TLS=False
IS_DOCKER_LOCAL=False
IP_DOCKER=192.168.1.100
DOCKER_USER=genai
DOCKER_KEY_PATH=/home/genai/.ssh/id_ed25519
DOCKER_PASSPHRASE=
DOCKER_EXCLUDE_KEYWORDS=acoustic-poisoner,nginx,postgres,appsecgenai

TLS подключение (IS_DOCKER_TLS=True)

Если выбран TLS способ подключения, настройте следующие переменные:

DOCKER_TLS_PORT

Описание: Порт для TLS подключения к Docker daemon. Стандартный порт - 2376.

Тип: Integer.

Обязательная: Да (для TLS).

Пример:

DOCKER_TLS_PORT=2376

IS_DOCKER_TLS_VERIFY

Описание: Флаг проверки TLS сертификатов при подключении к Docker daemon.

Тип: Integer (0 или 1).

Обязательная: Да (для TLS).

Значения:

  • 1 - проверка сертификатов включена (рекомендуется).
  • 0 - проверка сертификатов выключена (небезопасно, только для тестирования).

Пример:

IS_DOCKER_TLS_VERIFY=1

Пример полной конфигурации для TLS:

IS_DOCKER_TLS=True
IS_DOCKER_LOCAL=False
IP_DOCKER=192.168.1.100
DOCKER_TLS_PORT=2376
IS_DOCKER_TLS_VERIFY=1
DOCKER_EXCLUDE_KEYWORDS=acoustic-poisoner,nginx,postgres,appsecgenai

4.4. Настройки адресов сервисов

ADDRESS_HOST_PLATFORM

Описание: Адрес платформы хоста (песочницы) или адрес, где развернуто приложение. Используется для взаимодействия с платформой хоста.

Тип: String (URL).

Обязательная: Да.

Формат: http://IP:PORT или http://hostname:PORT.

Примеры:

# С IP адресом
ADDRESS_HOST_PLATFORM=http://192.168.1.100:8060

# С hostname
ADDRESS_HOST_PLATFORM=http://platform.example.com:8060

# Если в той же Docker сети, можно использовать имя контейнера
ADDRESS_HOST_PLATFORM=http://platform-container:8060

ADDRESS_SCANER_PLATFORM

Описание: Адрес сканера платформы - адрес, где развернуто приложение GenAI. Используется для внутренних ссылок и уведомлений.

Тип: String (URL).

Обязательная: Да.

Формат: http://IP:PORT или http://hostname:PORT.

Примеры:

# С IP адресом
ADDRESS_SCANER_PLATFORM=http://192.168.1.100:8003

# С доменом
ADDRESS_SCANER_PLATFORM=http://genai.example.com:8003

# Для Docker сети
ADDRESS_SCANER_PLATFORM=http://genai:8003

ADDRESS_ACUSTIC_POISONER

Описание: Адрес сервиса acoustic-poisoner (аудио отравителя). Используется для отправки аудио файлов на анализ.

Тип: String (URL).

Обязательная: Да.

Формат: http://IP:PORT или http://hostname:PORT.

Важно!

Если сервис находится в той же Docker сети, можно использовать имя контейнера.

Примеры:

# С IP адресом
ADDRESS_ACUSTIC_POISONER=http://192.168.1.100:8008

# С именем контейнера (если в той же Docker сети)
ADDRESS_ACUSTIC_POISONER=http://appsecgenai-acoustic-poisoner:8008

# С hostname
ADDRESS_ACUSTIC_POISONER=http://acoustic-poisoner.example.com:8008

4.5. Настройки токенов LLM

GIGA_TOKEN

Описание: Токен API для доступа к сервису Gigachat (российский LLM от Сбера). Используется для генерации ответов через Gigachat API.

Тип: String.

Обязательная: Да.

Где получить: Токен выдается при регистрации в сервисе Gigachat.

Пример:

GIGA_TOKEN=YmFmY2Y5ODktODQyZS00NzkzLWEzYmQtODM4MjA3ODA0NzNkOjZkMGU1ZTEzLTA3NWYtNDhkNS04N2FlLTcyODY0M2FmNGY2MQ==

OPENAPI_TOKEN

Описание: Токен API для доступа к OpenAI API (ChatGPT). Используется для генерации ответов через ChatGPT API.

Тип: String.

Обязательная: Да.

Где получить: Токен выдается в личном кабинете OpenAI (https://platform.openai.com/api-keys).

Формат: Обычно начинается с sk-.

Пример:

OPENAPI_TOKEN=sk-A6csRK61HQ6DpsI_UL3h3m5_1UZkJoh-5V7MQWGjE6Fg34Ua2_Oya-x_SP0

4.6. Настройки электронной почты

EMAIL_HOST

Описание: Хост SMTP сервера для отправки электронной почты.

Тип: String.

Обязательная: Да.

Примеры:

# Yandex
EMAIL_HOST=smtp.yandex.ru

# Gmail
EMAIL_HOST=smtp.gmail.com

# Другой SMTP сервер
EMAIL_HOST=smtp.example.com

EMAIL_PORT

Описание: Порт SMTP сервера для отправки электронной почты.

Тип: Integer.

Обязательная: Да.

Типичные значения:

  • 465 - SSL/TLS (SMTPS).
  • 587 - STARTTLS.
  • 25 - обычный SMTP (не рекомендуется).

Пример:

EMAIL_PORT=465

EMAIL_HOST_USER

Описание: Имя пользователя (email адрес) для аутентификации на SMTP сервере.

Тип: String (email адрес).

Обязательная: Да.

Пример:

EMAIL_HOST_USER=your-email@example.com

EMAIL_HOST_PASSWORD

Описание: Пароль для аутентификации на SMTP сервере. Для некоторых почтовых сервисов (например, Gmail) может потребоваться специальный пароль приложения.

Тип: String.

Обязательная: Да.

Важно!

Не используйте основной пароль от почты, если почтовый сервис поддерживает пароли приложений.

Пример:

EMAIL_HOST_PASSWORD=your-email-password-or-app-password

DEFAULT_FROM_EMAIL

Описание: Email адрес, который будет указан как отправитель в письмах. Обычно совпадает с EMAIL_HOST_USER.

Тип: String (email адрес).

Обязательная: Да.

Пример:

DEFAULT_FROM_EMAIL=your-email@example.com

4.7. Опциональные настройки

DEFAULT_NUM_JAILBREAK

Описание: Количество попыток jailbreak (обхода ограничений) по умолчанию при атаках на LLM модели.

Тип: Integer.

Обязательная: Нет.

Значение по умолчанию: 3.

Пример:

DEFAULT_NUM_JAILBREAK=3

LARGE_MODEL_TIMEOUT_REQUEST

Описание: Таймаут запроса к большим моделям в секундах. Если модель не отвечает в течение указанного времени, запрос будет прерван.

Тип: Integer (секунды).

Обязательная: Нет.

Значение по умолчанию: 300 (5 минут).

Примеры:

# 5 минут (300 секунд)
LARGE_MODEL_TIMEOUT_REQUEST=300

# 10 минут (600 секунд)
LARGE_MODEL_TIMEOUT_REQUEST=600

# 1 минута (60 секунд)
LARGE_MODEL_TIMEOUT_REQUEST=60

POLIGON

Описание: Флаг включения/выключения режима "Полигон" (тестовой среды). В режиме полигона могут быть доступны дополнительные функции для тестирования.

Тип: Integer (0 или 1).

Обязательная: Нет.

Значение по умолчанию: 0.

Значения:

  • 0 - режим полигона выключен.
  • 1 - режим полигона включен.

Пример:

POLIGON=0

ONLINE_LLM

Описание: Флаг включения/выключения использования онлайн LLM (языковых моделей через API). Если выключен, используются только локальные модели.

Тип: Integer (0 или 1).

Обязательная: Нет.

Значение по умолчанию: 0.

Значения:

  • 0 - онлайн LLM выключены.
  • 1 - онлайн LLM включены.

Пример:

ONLINE_LLM=0

INTERVAL_EMAIL

Описание: Интервал отправки email уведомлений в секундах. Определяет, как часто система будет отправлять статусные отчеты по email.

Тип: Integer (секунды).

Обязательная: Нет.

Значение по умолчанию: 60 (1 минута).

Примеры:

# Каждую минуту
INTERVAL_EMAIL=60

# Каждые 5 минут
INTERVAL_EMAIL=300

# Каждый час
INTERVAL_EMAIL=3600

4.8. Дополнительные опциональные переменные

Эти переменные могут быть полезны в некоторых случаях, но не являются обязательными:

TF_CPP_MIN_LOG_LEVEL

Описание: Уровень логирования TensorFlow. Контролирует количество выводимых сообщений от TensorFlow.

Тип: Integer (0-3).

Обязательная: Нет.

Значение по умолчанию: 3.

Значения:

  • 0 - все сообщения (DEBUG).
  • 1 - INFO и выше.
  • 2 - WARNING и выше.
  • 3 - только ERROR и FATAL.

Пример:

TF_CPP_MIN_LOG_LEVEL=3

4.8. Полный пример файла .env

Ниже приведен полный пример файла .env со всеми переменными. Используйте файл env (или .env.example) из архива как основу и заполните значения согласно описанию выше.

Важно!

Выберите только один вариант подключения к Docker - либо SSH, либо TLS.

# ============================================
# Django settings
# ============================================
DEBUG=False
SECRET_KEY=django-insecure-change-this-to-random-secret-key-generate-unique
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,genai
CSRF_TRUSTED_ORIGINS=http://localhost,http://127.0.0.1,http://localhost:8003

# ============================================
# Database settings
# ============================================
DATABASE_NAME=genai_db
DATABASE_USERNAME=genai_user
DATABASE_PASSWORD=change-this-password-use-strong-password
DATABASE_HOST=genai-db
DATABASE_PORT=5432
DATABASE_DUMP=True

# ============================================
# Postgres initialization settings
# ============================================
POSTGRES_DB=genai_db
POSTGRES_USER=genai_user
POSTGRES_PASSWORD=change-this-password-use-strong-password

# ============================================
# Docker connection settings
# Выберите ОДИН вариант: SSH или TLS
# ============================================

# Вариант 1: SSH подключение (раскомментируйте этот блок)
IS_DOCKER_TLS=False
IS_DOCKER_LOCAL=False
IP_DOCKER=192.168.1.100
DOCKER_USER=genai
DOCKER_KEY_PATH=/home/genai/.ssh/id_ed25519
DOCKER_PASSPHRASE=
DOCKER_EXCLUDE_KEYWORDS=acoustic-poisoner,nginx,postgres,appsecgenai

# Вариант 2: TLS подключение (раскомментируйте этот блок, если используете TLS)
# IS_DOCKER_TLS=True
# IS_DOCKER_LOCAL=False
# IP_DOCKER=192.168.1.100
# DOCKER_TLS_PORT=2376
# IS_DOCKER_TLS_VERIFY=1
# DOCKER_EXCLUDE_KEYWORDS=acoustic-poisoner,nginx,postgres,appsecgenai

# ============================================
# Service addresses
# ============================================
ADDRESS_HOST_PLATFORM=http://192.168.1.100:8060
ADDRESS_SCANER_PLATFORM=http://192.168.1.100:8003
ADDRESS_ACUSTIC_POISONER=http://appsecgenai-acoustic-poisoner:8008

# ============================================
# LLM API Tokens
# ============================================
GIGA_TOKEN=your-gigachat-token-here
OPENAPI_TOKEN=your-openai-token-here

# ============================================
# Email notification settings
# ============================================
EMAIL_HOST=smtp.example.com
EMAIL_PORT=465
EMAIL_HOST_USER=your-email@example.com
EMAIL_HOST_PASSWORD=your-email-password-or-app-password
DEFAULT_FROM_EMAIL=your-email@example.com

# ============================================
# Optional settings
# ============================================
DEFAULT_NUM_JAILBREAK=3
LARGE_MODEL_TIMEOUT_REQUEST=300
POLIGON=0
ONLINE_LLM=0
INTERVAL_EMAIL=60

# ============================================
# Additional optional settings (uncomment if needed)
# ============================================
# TF_CPP_MIN_LOG_LEVEL=3

Важные замечания:

  1. Замените все значения change-this-* и your-* на реальные значения.
  2. Сгенерируйте уникальный SECRET_KEY (см. раздел «4.1. Базовые настройки Django»).
  3. Используйте надежные пароли для базы данных.
  4. Выберите только один вариант подключения к Docker (SSH или TLS).
  5. Убедитесь, что значения DATABASE_NAME = POSTGRES_DB и DATABASE_USERNAME = POSTGRES_USER.
  6. После первого запуска установите DATABASE_DUMP=False.

Сохраните файл и закройте редактор.

Шаг 5: Настройка SSH ключей (если используется SSH)

Если в .env установлено IS_DOCKER_TLS=False, выполните следующие шаги.

5.1. Генерация SSH ключа

Сгенерируйте пару SSH ключей (ed25519):

ssh-keygen -t ed25519 -f ./ssh/id_ed25519 -C "genai-docker-key"

Важно!

  • Файл должен называться именно id_ed25519 (без расширения).
  • Если система запросит парольную фразу, введите её и сохраните в переменной DOCKER_PASSPHRASE в файле .env.
  • Если не хотите использовать парольную фразу, просто нажмите Enter.

5.2. Проверка созданных ключей

ls -la ssh/

Должны быть созданы файлы:

  • ssh/id_ed25519 - приватный ключ.
  • ssh/id_ed25519.pub - публичный ключ.

5.3. Установка прав доступа

chmod 600 ssh/id_ed25519
chmod 644 ssh/id_ed25519.pub

5.4. Копирование публичного ключа на удаленный сервер

Скопируйте содержимое публичного ключа:

cat ssh/id_ed25519.pub

Скопируйте весь вывод команды (начинается с ssh-ed25519 ...).

Подключитесь к серверу, указанному в переменной IP_DOCKER:

ssh your-docker-user@<IP_DOCKER>

На удаленном сервере выполните:

# Создать директорию .ssh если её нет
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# Добавить публичный ключ в authorized_keys
echo "ssh-ed25519 AAAA... ваш-публичный-ключ" >> ~/.ssh/authorized_keys

# Установить правильные права
chmod 600 ~/.ssh/authorized_keys

Важно!

Замените ssh-ed25519 AAAA... ваш-публичный-ключ на реальное содержимое файла id_ed25519.pub.

5.5. Проверка SSH подключения

С локальной машины проверьте подключение:

ssh -i ./ssh/id_ed25519 your-docker-user@<IP_DOCKER>

Если подключение успешно, вы можете выйти из SSH сессии:

exit

Шаг 6: Настройка TLS сертификатов (если используется TLS)

Если в .env установлено IS_DOCKER_TLS=True, выполните следующие шаги.

6.1. Подготовка директории для сертификатов

Убедитесь, что директория существует:

mkdir -p docker_certificates

6.2. Генерация сертификатов на удаленном сервере

Важно!

Сертификаты должны быть сгенерированы на сервере, где запущен Docker daemon (IP указан в IP_DOCKER).

Требования на удаленном сервере:

  • openssl - для генерации сертификатов.
  • sudo - для выполнения команд с правами root.
  • SSH доступ с локальной машины.

Проверка на удаленном сервере:

# Проверить наличие openssl
openssl version

# Проверить наличие sudo
sudo -v

Важно!

  • Замените <IP_DOCKER> на реальный IP-адрес вашего Docker сервера (значение из переменной IP_DOCKER в файле .env).
  • Замените <DOMAIN_NAME> на желаемое доменное имя (например, docker-server или hostname сервера).

6.2.1. Подключение к удаленному серверу

Подключитесь к удаленному серверу, где находится Docker daemon:

ssh your-docker-user@<IP_DOCKER>

Замените your-docker-user на имя пользователя для SSH подключения.

6.2.2. Генерация сертификатов на удаленном сервере

На удаленном сервере выполните следующие команды последовательно:

Шаг 1: Создание директории и резервная копия

# Создать директорию для сертификатов
sudo mkdir -p /etc/docker/ssl

# Создать резервную копию существующих сертификатов (если есть)
sudo mkdir -p /etc/docker/ssl/backup
sudo cp -a /etc/docker/ssl/*.pem /etc/docker/ssl/backup/ 2>/dev/null || true

# Перейти в директорию
cd /etc/docker/ssl

Шаг 2: Генерация CA (Certificate Authority)

# Проверяем, есть ли CA ключ
if [ ! -f "ca-key.pem" ]; then
    echo "Генерация нового CA ключа..."
    sudo openssl genrsa -out ca-key.pem 4096

    echo "Генерация CA сертификата..."
    sudo openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem \
        -subj "/C=RU/ST=Moscow/L=Moscow/O=SwordfishSecurity/CN=docker-ca"
else
    echo "Использование существующего CA ключа..."
fi

Шаг 3: Генерация серверного ключа

echo "Генерация серверного ключа..."
sudo openssl genrsa -out server-key.pem 4096

Шаг 4: Создание конфигурационного файла для универсального сертификата

Создайте конфигурационный файл с Subject Alternative Names (SANs):

# Замените <IP_DOCKER> на реальный IP адрес (например, 192.168.1.100)
# Замените <DOMAIN_NAME> на доменное имя (например, docker-server)

sudo tee server-extfile.cnf > /dev/null <<CONFIG
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]

[v3_req]
subjectAltName = @alt_names
extendedKeyUsage = serverAuth, clientAuth

[alt_names]
DNS.1 = <DOMAIN_NAME>
DNS.2 = localhost
IP.1 = <IP_DOCKER>
IP.2 = 127.0.0.1
IP.3 = ::1
CONFIG

Важно!

Перед выполнением следующей команды замените <IP_DOCKER> и <DOMAIN_NAME> в файле server-extfile.cnf на реальные значения. Или выполните команду замены:

# Установить переменные (замените на ваши значения)
IP_DOCKER="192.168.1.100"  # Замените на IP из переменной IP_DOCKER в .env
DOMAIN_NAME="docker-server"  # Замените на желаемое доменное имя

# Заменить значения в конфигурационном файле
sudo sed -i "s/<IP_DOCKER>/${IP_DOCKER}/g" server-extfile.cnf
sudo sed -i "s/<DOMAIN_NAME>/${DOMAIN_NAME}/g" server-extfile.cnf

Шаг 5: Генерация серверного сертификата

# Генерация запроса на сертификат
echo "Генерация запроса на сертификат..."
sudo openssl req -subj "/CN=${DOMAIN_NAME}" -sha256 -new -key server-key.pem -out server.csr -config server-extfile.cnf

# Генерация универсального сертификата с расширениями (сервер + клиент)
echo "Генерация универсального сертификата с IP в SANs..."
sudo openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
    -CAcreateserial -out server-cert.pem -extensions v3_req -extfile server-extfile.cnf

Шаг 6: Генерация клиентского ключа и сертификата

# Генерация клиентского ключа
echo "Генерация клиентского ключа..."
sudo openssl genrsa -out client-key.pem 4096

# Создание конфигурационного файла для клиентского сертификата
echo "Создание конфигурации для клиентского сертификата..."
sudo tee extfile-client.cnf > /dev/null <<'CONFIG'
extendedKeyUsage = clientAuth
CONFIG

# Генерация запроса на клиентский сертификат
echo "Генерация запроса на клиентский сертификат..."
sudo openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr

# Генерация клиентского сертификата
echo "Генерация клиентского сертификата..."
sudo openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
    -CAcreateserial -out client-cert.pem -extfile extfile-client.cnf

Шаг 7: Копирование универсальных сертификатов

# Копируем универсальные сертификаты как основные (для Docker daemon)
echo "Копирование универсальных сертификатов..."
sudo cp server-cert.pem cert.pem
sudo cp server-key.pem key.pem

Шаг 8: Очистка временных файлов и установка прав

# Удаляем временные файлы
echo "Очистка временных файлов..."
sudo rm -f server.csr client.csr server-extfile.cnf extfile-client.cnf ca.srl

# Устанавливаем правильные права доступа
sudo chmod 600 key.pem ca-key.pem client-key.pem
sudo chmod 644 cert.pem ca.pem client-cert.pem

Шаг 9: Проверка созданных сертификатов

echo ""
echo "✓ Сертификаты успешно созданы!"
echo ""
echo "Проверка сертификата:"
sudo openssl x509 -in cert.pem -text -noout | grep -A 5 "Subject Alternative Name" || echo "SANs не найдены"

Важно!

  • Замените <IP_DOCKER> на реальный IP-адрес вашего Docker сервера (значение из переменной IP_DOCKER в файле .env).
  • Замените <DOMAIN_NAME> на желаемое доменное имя (например, docker-server или hostname сервера).

6.3. Настройка Docker daemon на удаленном сервере

Важно!

Выполняйте эти команды на удаленном сервере, где находится Docker daemon. Если вы еще не подключены к серверу, подключитесь:

ssh your-docker-user@<IP_DOCKER>

Шаг 1: Редактирование конфигурации Docker

Отредактируйте конфигурацию Docker:

sudo nano /usr/lib/systemd/system/docker.service
# или
sudo vim /usr/lib/systemd/system/docker.service

Найдите строку ExecStart и добавьте параметры TLS.

До изменений:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

После изменений (используйте универсальные сертификаты cert.pem и key.pem):

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem --containerd=/run/containerd/containerd.sock

Альтернативный вариант (если используются отдельные серверные сертификаты):

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/server-cert.pem --tlskey=/etc/docker/ssl/server-key.pem --containerd=/run/containerd/containerd.sock

Важно!

  • Рекомендуется использовать универсальные сертификаты cert.pem и key.pem (как в инструкции выше).
  • Используйте server-cert.pem и server-key.pem только если вы создали их отдельно и не копировали в cert.pem и key.pem.

Сохраните файл и перезапустите Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

Шаг 2: Проверка статуса Docker

Проверьте статус Docker:

sudo systemctl status docker

Если Docker не запустился, проверьте логи:

sudo journalctl -u docker.service -n 50

Шаг 3: Проверка прослушивания порта

Проверьте, что порт 2376 прослушивается:

sudo netstat -tlnp | grep 2376
# или
sudo ss -tlnp | grep 2376

Ожидаемый вывод должен показывать, что порт 2376 открыт и прослушивается:

tcp6       0      0 :::2376                 :::*                    LISTEN      1234/dockerd

Шаг 4: Ожидание запуска Docker

Подождите несколько секунд для полного запуска Docker:

echo "Ожидание запуска Docker..."
sleep 3

# Проверка статуса Docker еще раз
sudo systemctl status docker --no-pager | head -5

Теперь можно выйти с удаленного сервера (если еще не вышли):

exit

6.4. Копирование клиентских сертификатов на локальную машину

Выйдите с удаленного сервера (если еще не вышли):

exit

Теперь на локальной машине (где разворачивается AppSec.GenAI) скопируйте клиентские сертификаты с удаленного сервера:

Шаг 1: Создание локальной директории

# Перейти в директорию с проектом (где находится docker-compose.yml)
cd /path/to/release_directory

# Создать локальную директорию для сертификатов
mkdir -p docker_certificates

Шаг 2: Копирование CA сертификата

# Скопировать ca.pem
scp your-docker-user@<IP_DOCKER>:/etc/docker/ssl/ca.pem ./docker_certificates/ca.pem

Шаг 3: Копирование клиентского сертификата

Попробуйте сначала скопировать client-cert.pem, если его нет - используйте cert.pem:

# Проверить наличие client-cert.pem и скопировать
if ssh your-docker-user@<IP_DOCKER> "sudo test -f /etc/docker/ssl/client-cert.pem"; then
    echo "Копирование client-cert.pem..."
    ssh your-docker-user@<IP_DOCKER> "sudo cat /etc/docker/ssl/client-cert.pem" > ./docker_certificates/cert.pem
else
    echo "Копирование cert.pem..."
    ssh your-docker-user@<IP_DOCKER> "sudo cat /etc/docker/ssl/cert.pem" > ./docker_certificates/cert.pem
fi

Шаг 4: Копирование клиентского ключа

Попробуйте сначала скопировать client-key.pem, если его нет - используйте key.pem:

# Проверить наличие client-key.pem и скопировать
if ssh your-docker-user@<IP_DOCKER> "sudo test -f /etc/docker/ssl/client-key.pem"; then
    echo "Копирование client-key.pem..."
    ssh your-docker-user@<IP_DOCKER> "sudo cat /etc/docker/ssl/client-key.pem" > ./docker_certificates/key.pem
else
    echo "Копирование key.pem..."
    ssh your-docker-user@<IP_DOCKER> "sudo cat /etc/docker/ssl/key.pem" > ./docker_certificates/key.pem
fi

Важно!

  • Замените your-docker-user на имя пользователя для SSH подключения.
  • Замените <IP_DOCKER> на реальный IP-адрес вашего Docker сервера (значение из переменной IP_DOCKER в файле .env).

6.5. Установка прав доступа на локальной машине

chmod 644 docker_certificates/ca.pem
chmod 644 docker_certificates/cert.pem
chmod 600 docker_certificates/key.pem

6.6. Проверка сертификатов

Убедитесь, что все три файла присутствуют:

ls -la docker_certificates/

Должны быть файлы:

  • ca.pem.
  • cert.pem.
  • key.pem.

Шаг 7: Настройка nginx

7.1. Редактирование nginx.conf

Файл nginx/nginx.conf уже создан на шаге 2.2. Проверьте его содержимое:

cat nginx/nginx.conf

Он должен содержать базовую конфигурацию (обычно не требует изменений).

7.2. Редактирование default.conf

Откройте файл nginx/conf.d/default.conf:

nano nginx/conf.d/default.conf
# или
vim nginx/conf.d/default.conf

Проверьте содержимое файла:

cat nginx/conf.d/default.conf

В файле должно быть указано genai:8003 в качестве адреса бэкенда, что соответствует имени контейнера в docker-compose.yml.

Важно!

Если имя контейнера в docker-compose.yml отличается от genai, замените все вхождения genai на имя вашего контейнера.

Пример правильной конфигурации (для контейнера genai):

server {
    listen 8080;
    server_name localhost;

    # Root directory for Angular app
    root /usr/share/nginx/html/appsec-genai/browser;

    # Django admin endpoint
    location /admin/ {
        proxy_pass http://genai:8003/admin/;
        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;
        proxy_connect_timeout 600s;
        proxy_send_timeout 600s;
        proxy_read_timeout 600s;
    }

    # Django admin static files
    location /static/admin/ {
        proxy_pass http://genai:8003/static/admin/;
        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;
    }

    # Static files from Django
    location /static/ {
        proxy_pass http://genai:8003/static/;
        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 endpoints - proxy to Django
    location /api/ {
        proxy_pass http://genai:8003;
        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;
        proxy_connect_timeout 600s;
        proxy_send_timeout 600s;
        proxy_read_timeout 600s;
    }

    # Angular app handling with client-side routing support
    location / {
        try_files $uri $uri/ /index.html;
        index index.html index.htm;
        add_header Cache-Control "no-cache, no-store";
    }

    # Error pages
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

Сохраните файл и закройте редактор.

7.3. Проверка конфигурации nginx

После запуска контейнеров можно проверить синтаксис конфигурации nginx:

docker compose exec frontend nginx -t

Если конфигурация корректна, вы увидите сообщение:

nginx: the configuration file /etc/nginx/nginx.conf test is successful

Шаг 8: Подготовка к запуску

8.1. Проверка всех файлов

Убедитесь, что все необходимые файлы на месте:

# Проверка docker-compose.yml
ls -la docker-compose.yml

# Проверка .env
ls -la .env

# Проверка nginx конфигов
ls -la nginx/nginx.conf
ls -la nginx/conf.d/default.conf

# Проверка SSH ключей (если используется SSH)
if [ "$IS_DOCKER_TLS" != "True" ]; then
    ls -la ssh/id_ed25519
fi

# Проверка TLS сертификатов (если используется TLS)
if [ "$IS_DOCKER_TLS" = "True" ]; then
    ls -la docker_certificates/ca.pem
    ls -la docker_certificates/cert.pem
    ls -la docker_certificates/key.pem
fi

8.2. Проверка переменных окружения

Проверьте, что файл .env содержит все необходимые переменные:

cat .env | grep -v "^#" | grep -v "^$"

Шаг 9: Авторизация в Docker registry

Перед загрузкой образов необходимо авторизоваться в приватном registry:

docker login registry.appsec.global

Введите учетные данные, предоставленные вендором:

  • Username: ваш логин.
  • Password: ваш пароль.

Проверьте успешную авторизацию:

docker login registry.appsec.global

Если авторизация прошла успешно, вы увидите сообщение "Login Succeeded".

Шаг 10: Загрузка Docker образов

Загрузите все необходимые образы:

docker compose pull

Эта команда загрузит следующие образы:

  • registry.appsec.global/appsecgenai/release/ui:X.Y.Z.
  • registry.appsec.global/appsecgenai/release/postgres:X.Y.Z.
  • registry.appsec.global/appsecgenai/release/acoustic-poisoner:X.Y.Z.
  • registry.appsec.global/appsecgenai/release/core:X.Y.Z.

Важно!

Замените X.Y.Z на номер версии релиза, указанный вендором (например, 25.4.2, 26.0.0 и т.д.).

Дождитесь завершения загрузки всех образов.

Проверьте загруженные образы:

docker images | grep registry.appsec.global/appsecgenai

Шаг 11: Запуск контейнеров

Запустите все сервисы:

docker compose up -d

Флаг -d запускает контейнеры в фоновом режиме (detached mode).

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

docker compose ps

Все контейнеры должны быть в состоянии "Up" или "Up (healthy)".

Просмотрите логи для проверки:

# Логи всех сервисов
docker compose logs

# Логи конкретного сервиса
docker compose logs genai
docker compose logs genai-db
docker compose logs frontend
docker compose logs acoustic-poisoner

Шаг 12: Проверка работы приложения

12.1. Проверка доступности веб-интерфейса

Откройте браузер и перейдите по адресу, указанному в конфигурации nginx:

  • Если nginx слушает на порту 80: http://localhost или http://<ваш-ip-адрес>.
  • Если используется другой порт: http://localhost:<порт>.

Должна появиться страница авторизации.

12.2. Первоначальный вход

Используйте следующие учетные данные для первого входа:

  • Username: admin.
  • Password: Password.

Важно!

Сразу после первого входа измените пароль администратора!

12.3. Проверка API

Проверьте доступность API:

curl http://localhost:8003/api/

Или откройте в браузере:

http://localhost:8003/api/

12.4. Проверка базы данных

После первого запуска проверьте, что дамп базы данных загружен (если DATABASE_DUMP=True):

docker compose logs genai | grep -i "database\|dump\|migrate"

После успешной загрузки дампа установите в файле .env:

DATABASE_DUMP=False

И перезапустите контейнер:

docker compose restart genai