Установка и запуск¶
Предварительные требования¶
Необходимое программное обеспечение¶
На машине, где будет разворачиваться приложение, должны быть установлены следующие пакеты:
Обязательные пакеты:
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).
Важно!
- Замените путь на реальный путь к вашей директории с распакованным архивом.
- Замените
X.Y.Zна номер версии релиза.
Перейдите в директорию с распакованным архивом:
где release_directory - это директория, куда вы распаковали архив от вендора.
Проверьте структуру директории:
Должны присутствовать следующие директории и файлы:
docker-compose-example.yml.nginx/(с файламиtemplate_nginx.confиconf.d/template_default.conf).static/.model/.ssh/.docker_certificates/.
Шаг 2: Переименование файлов конфигурации¶
2.1. Переименование docker-compose файла¶
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
Проверьте, что файлы созданы:
Шаг 3: Настройка docker-compose.yml¶
Откройте файл 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
Проверьте, что файл создан:
Откройте файл для редактирования:
Важно!
Файл 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)
Пример:
SECRET_KEY
Описание: Секретный ключ Django, используемый для криптографической подписи сессий, CSRF токенов и других целей безопасности. Должен быть уникальным и храниться в секрете.
Тип: String.
Обязательная: Да.
Генерация SECRET_KEY:
python3 -c "from django.core.management.utils import get_random_secret_key; print(get_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_USERNAME
Описание: Имя пользователя для подключения к базе данных PostgreSQL.
Тип: String.
Обязательная: Да.
Пример:
DATABASE_PASSWORD
Описание: Пароль пользователя базы данных. Используйте надежный пароль в production.
Тип: String.
Обязательная: Да.
Пример:
DATABASE_HOST
Описание: Хост базы данных. В Docker Compose используйте имя сервиса контейнера с БД.
Тип: String.
Обязательная: Да.
Примеры:
# Для Docker Compose (имя сервиса)
DATABASE_HOST=genai-db
# Для внешней БД
DATABASE_HOST=192.168.1.100
DATABASE_PORT
Описание: Порт базы данных PostgreSQL. Стандартный порт PostgreSQL - 5432.
Тип: Integer.
Обязательная: Да.
Пример:
DATABASE_DUMP
Описание: Флаг для загрузки дампа базы данных при первом запуске. Используется в entrypoint.sh контейнера. После успешной загрузки дампа установите в False.
Тип: Boolean (True/False).
Обязательная: Да (при первом запуске).
Значения:
True- загрузить дамп БД при запуске контейнера.False- не загружать дамп (используйте после первого запуска).
Пример:
POSTGRES_DB
Описание: Имя базы данных для инициализации PostgreSQL контейнера. Должно совпадать с DATABASE_NAME.
Тип: String.
Обязательная: Да.
Важно: Значение должно совпадать с DATABASE_NAME.
Пример:
POSTGRES_USER
Описание: Имя пользователя для инициализации PostgreSQL контейнера. Должно совпадать с DATABASE_USERNAME.
Тип: String.
Обязательная: Да.
Важно: Значение должно совпадать с DATABASE_USERNAME.
Пример:
POSTGRES_PASSWORD
Описание: Пароль пользователя для инициализации PostgreSQL контейнера. Должен совпадать с DATABASE_PASSWORD.
Тип: String.
Обязательная: Да.
Важно: Значение должно совпадать с DATABASE_PASSWORD.
Пример:
4.3. Настройки Docker подключения¶
Выберите один из вариантов: SSH или TLS.
IS_DOCKER_TLS
Описание: Флаг выбора способа подключения к Docker daemon. Определяет, будет ли использоваться SSH или TLS для подключения к удаленному Docker.
Тип: Boolean (True/False).
Обязательная: Да.
Значения:
False- использовать SSH подключение.True- использовать TLS подключение.
Пример:
IP_DOCKER
Описание: IP-адрес или hostname машины, где находится Docker daemon с моделями для сканирования.
Тип: String.
Обязательная: Да.
Примеры:
IS_DOCKER_LOCAL
Описание: Указывает, находятся ли Docker образы с моделями в той же Docker сети, что и GenAI, или на удаленной машине.
Тип: Boolean (True/False).
Обязательная: Да.
Значения:
True- Docker образы находятся в той же сети (локально).False- Docker образы находятся на удаленной машине.
Пример:
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_KEY_PATH
Описание: Путь к приватному SSH ключу внутри контейнера. Ключ должен быть смонтирован как volume в docker-compose.yml.
Тип: String (путь к файлу).
Обязательная: Да (для 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).
Пример:
IS_DOCKER_TLS_VERIFY
Описание: Флаг проверки TLS сертификатов при подключении к Docker daemon.
Тип: Integer (0 или 1).
Обязательная: Да (для TLS).
Значения:
1- проверка сертификатов включена (рекомендуется).0- проверка сертификатов выключена (небезопасно, только для тестирования).
Пример:
Пример полной конфигурации для 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-.
Пример:
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_HOST_USER
Описание: Имя пользователя (email адрес) для аутентификации на SMTP сервере.
Тип: String (email адрес).
Обязательная: Да.
Пример:
EMAIL_HOST_PASSWORD
Описание: Пароль для аутентификации на SMTP сервере. Для некоторых почтовых сервисов (например, Gmail) может потребоваться специальный пароль приложения.
Тип: String.
Обязательная: Да.
Важно!
Не используйте основной пароль от почты, если почтовый сервис поддерживает пароли приложений.
Пример:
DEFAULT_FROM_EMAIL
Описание: Email адрес, который будет указан как отправитель в письмах. Обычно совпадает с EMAIL_HOST_USER.
Тип: String (email адрес).
Обязательная: Да.
Пример:
4.7. Опциональные настройки¶
DEFAULT_NUM_JAILBREAK
Описание: Количество попыток jailbreak (обхода ограничений) по умолчанию при атаках на LLM модели.
Тип: Integer.
Обязательная: Нет.
Значение по умолчанию: 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- режим полигона включен.
Пример:
ONLINE_LLM
Описание: Флаг включения/выключения использования онлайн LLM (языковых моделей через API). Если выключен, используются только локальные модели.
Тип: Integer (0 или 1).
Обязательная: Нет.
Значение по умолчанию: 0.
Значения:
0- онлайн LLM выключены.1- онлайн LLM включены.
Пример:
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.
Пример:
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
Важные замечания:
- Замените все значения
change-this-*иyour-*на реальные значения. - Сгенерируйте уникальный
SECRET_KEY(см. раздел «4.1. Базовые настройки Django»). - Используйте надежные пароли для базы данных.
- Выберите только один вариант подключения к Docker (SSH или TLS).
- Убедитесь, что значения
DATABASE_NAME=POSTGRES_DBиDATABASE_USERNAME=POSTGRES_USER. - После первого запуска установите
DATABASE_DUMP=False.
Сохраните файл и закройте редактор.
Шаг 5: Настройка SSH ключей (если используется SSH)¶
Если в .env установлено IS_DOCKER_TLS=False, выполните следующие шаги.
5.1. Генерация SSH ключа¶
Сгенерируйте пару SSH ключей (ed25519):
Важно!
- Файл должен называться именно
id_ed25519(без расширения). - Если система запросит парольную фразу, введите её и сохраните в переменной
DOCKER_PASSPHRASEв файле.env. - Если не хотите использовать парольную фразу, просто нажмите Enter.
5.2. Проверка созданных ключей¶
Должны быть созданы файлы:
ssh/id_ed25519- приватный ключ.ssh/id_ed25519.pub- публичный ключ.
5.3. Установка прав доступа¶
5.4. Копирование публичного ключа на удаленный сервер¶
Скопируйте содержимое публичного ключа:
Скопируйте весь вывод команды (начинается с ssh-ed25519 ...).
Подключитесь к серверу, указанному в переменной 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 сессии:
Шаг 6: Настройка TLS сертификатов (если используется TLS)¶
Если в .env установлено IS_DOCKER_TLS=True, выполните следующие шаги.
6.1. Подготовка директории для сертификатов¶
Убедитесь, что директория существует:
6.2. Генерация сертификатов на удаленном сервере¶
Важно!
Сертификаты должны быть сгенерированы на сервере, где запущен Docker daemon (IP указан в IP_DOCKER).
Требования на удаленном сервере:
openssl- для генерации сертификатов.sudo- для выполнения команд с правами root.- SSH доступ с локальной машины.
Проверка на удаленном сервере:
Важно!
- Замените
<IP_DOCKER>на реальный IP-адрес вашего Docker сервера (значение из переменнойIP_DOCKERв файле.env). - Замените
<DOMAIN_NAME>на желаемое доменное имя (например,docker-serverили hostname сервера).
6.2.1. Подключение к удаленному серверу¶
Подключитесь к удаленному серверу, где находится Docker daemon:
Замените 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: Генерация серверного ключа
Шаг 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. Если вы еще не подключены к серверу, подключитесь:
Шаг 1: Редактирование конфигурации Docker
Отредактируйте конфигурацию Docker:
sudo nano /usr/lib/systemd/system/docker.service
# или
sudo vim /usr/lib/systemd/system/docker.service
Найдите строку ExecStart и добавьте параметры TLS.
До изменений:
После изменений (используйте универсальные сертификаты 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:
Шаг 2: Проверка статуса Docker
Проверьте статус Docker:
Если Docker не запустился, проверьте логи:
Шаг 3: Проверка прослушивания порта
Проверьте, что порт 2376 прослушивается:
Ожидаемый вывод должен показывать, что порт 2376 открыт и прослушивается:
Шаг 4: Ожидание запуска Docker
Подождите несколько секунд для полного запуска Docker:
echo "Ожидание запуска Docker..."
sleep 3
# Проверка статуса Docker еще раз
sudo systemctl status docker --no-pager | head -5
Теперь можно выйти с удаленного сервера (если еще не вышли):
6.4. Копирование клиентских сертификатов на локальную машину¶
Выйдите с удаленного сервера (если еще не вышли):
Теперь на локальной машине (где разворачивается 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. Проверка сертификатов¶
Убедитесь, что все три файла присутствуют:
Должны быть файлы:
ca.pem.cert.pem.key.pem.
Шаг 7: Настройка nginx¶
7.1. Редактирование nginx.conf¶
Файл nginx/nginx.conf уже создан на шаге 2.2. Проверьте его содержимое:
Он должен содержать базовую конфигурацию (обычно не требует изменений).
7.2. Редактирование default.conf¶
Откройте файл 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:
Если конфигурация корректна, вы увидите сообщение:
Шаг 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 содержит все необходимые переменные:
Шаг 9: Авторизация в Docker registry¶
Перед загрузкой образов необходимо авторизоваться в приватном registry:
Введите учетные данные, предоставленные вендором:
- Username: ваш логин.
- Password: ваш пароль.
Проверьте успешную авторизацию:
Если авторизация прошла успешно, вы увидите сообщение "Login Succeeded".
Шаг 10: Загрузка Docker образов¶
Загрузите все необходимые образы:
Эта команда загрузит следующие образы:
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 и т.д.).
Дождитесь завершения загрузки всех образов.
Проверьте загруженные образы:
Шаг 11: Запуск контейнеров¶
Запустите все сервисы:
Флаг -d запускает контейнеры в фоновом режиме (detached mode).
Проверьте статус контейнеров:
Все контейнеры должны быть в состоянии "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:
Или откройте в браузере:
12.4. Проверка базы данных¶
После первого запуска проверьте, что дамп базы данных загружен (если DATABASE_DUMP=True):
После успешной загрузки дампа установите в файле .env:
И перезапустите контейнер: