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

Установка и подключение

Около 3 мин

Установка и подключение модуля симуляций

На этой странице — развёртывание контейнера storm-des и его подключение к основному приложению. Предполагается, что базовая установка StormBPMN уже выполнена по разделу «Установка».

Порядок действий:

  1. Получить образ storm-des;
  2. Запустить контейнер рядом с основным приложением (общая база данных, общая docker-сеть);
  3. Указать основному приложению адрес сервиса (DES_BASE_URL) и перезапустить его;
  4. Проверить работоспособность.

Лицензия

Модуль симуляций лицензируется отдельно — убедитесь, что он включён в вашу лицензию (см. обзор модуля). Доступ к образу выдаётся вместе с модулем.

Шаг 1. Получение образа

Образ storm-des находится в том же приватном реестре, что и основной образ StormBPMN, и доступен по тем же учётным данным:

docker pull cr.selcloud.ru/stormbpmn-enterprise/storm-des:<версия>

Версии должны совпадать

Используйте storm-des той же версии, что и основной образ StormBPMN — они собираются из одной кодовой базы, и совместимость гарантируется только для одинаковых версий. Актуальная версия указана в разделе Changelog.

Перенос образа в корпоративный реестр и проверка подписи Cosign выполняются теми же шагами, что и для основного образа — см. «Ручная установка» и Changelog → «Проверка подписи образа».

Шаг 2. Запуск контейнера

Пример docker-compose.yml (или добавьте сервис в существующий compose-файл основного приложения — тогда контейнеры автоматически окажутся в одной docker-сети):

services:
    storm-des:
        image: cr.selcloud.ru/stormbpmn-enterprise/storm-des:<версия>
        container_name: storm-des
        restart: unless-stopped
        environment:
            # Та же база PostgreSQL, что у основного приложения
            - SPRING_DATASOURCE_URL=jdbc:postgresql://<хост-БД>:5432/<база>
            - SPRING_DATASOURCE_USERNAME=<пользователь>
            - SPRING_DATASOURCE_PASSWORD=<пароль>
            # ОБЯЗАТЕЛЬНО: тот же часовой пояс, что у контейнера основного приложения
            - TZ=Europe/Moscow
            # Память JVM — под рекомендуемую конфигурацию (16 GB на контейнер)
            - JAVA_OPTS=-Xms4g -Xmx12g -XX:+UseG1GC -XX:+ExitOnOutOfMemoryError
        deploy:
            resources:
                limits:
                    memory: 14G
        healthcheck:
            test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:8081/actuator/health || exit 1"]
            interval: 30s
            timeout: 10s
            retries: 3
            start_period: 90s
        logging:
            driver: "json-file"
            options:
                max-size: "10m"
                max-file: "3"

Часовой пояс: TZ обязан совпадать с основным приложением

Отметки времени запуска и завершения симуляций пишутся в базу в часовом поясе JVM. Если TZ контейнера storm-des не совпадает с TZ основного приложения, защитный механизм приложения считает идущие симуляции «зависшими» и принудительно завершает их с ошибкой. Симптом — симуляции падают с сообщением «DES-нода не ответила», хотя сервис жив.

Порт наружу не публиковать

Порт 8081 нужен только основному приложению. Если оба контейнера в одной docker-сети, секция ports не нужна вовсе — приложение обратится по имени сервиса (http://storm-des:8081). Если контейнеры на разных хостах — откройте порт только для хоста приложения средствами файрвола.

Переменные окружения storm-des

ПеременнаяПо умолчаниюОписание
SPRING_DATASOURCE_URLJDBC-адрес базы приложения. Обязательно
SPRING_DATASOURCE_USERNAMEПользователь БД. Обязательно
SPRING_DATASOURCE_PASSWORDПароль БД. Обязательно
TZЧасовой пояс. Обязательно, должен совпадать с основным приложением
JAVA_OPTSавтоматически по памяти контейнераПараметры JVM; для предсказуемости рекомендуем задать -Xmx явно
SIMULATION_MAX_CONCURRENT2Сколько симуляций считается параллельно; остальные ждут в очереди
SIMULATION_TIMEOUT_MINUTES10Жёсткий лимит одного прогона — дольше этого симуляция принудительно останавливается
DES_NODE_IDимя хоста контейнераИмя ноды в отчётах и метриках; менять нужно только при нескольких нодах на одном хосте
HIKARI_MAX_POOL_SIZE5Размер пула соединений с БД
SIMULATION_DEBUG_ENABLEDfalseСохранять файлы отладки прогонов (см. Эксплуатация)

Шаг 3. Подключение основного приложения

Добавьте контейнеру основного приложения переменные окружения и перезапустите его:

ПеременнаяПо умолчаниюОписание
DES_BASE_URLhttp://localhost:8081Адрес сервиса симуляций, например http://storm-des:8081. По нему приложение проверяет конфигурации симуляций и строит предпросмотры
SIMULATION_JANITOR_STALE_QUEUED_MINUTES30Через сколько минут ожидания в очереди симуляция помечается ошибкой (защита от неработающего storm-des)
SIMULATION_JANITOR_STUCK_RUNNING_MINUTES20Через сколько минут без ответа от ноды идущая симуляция помечается ошибкой

Сам прогон симуляции через DES_BASE_URL не ходит — он передаётся через очередь в базе данных. Поэтому кратковременная недоступность storm-des не роняет запущенные из очереди задачи: они дождутся, пока сервис вернётся (в пределах лимита SIMULATION_JANITOR_STALE_QUEUED_MINUTES).

Шаг 4. Проверка работоспособности

  1. Здоровье сервиса — с хоста, где работает storm-des:

    curl -s http://localhost:8081/actuator/health
    # {"status":"UP"}
    
  2. Связность с приложением — из контейнера основного приложения должен отвечать адрес из DES_BASE_URL:

    docker exec <контейнер-приложения> wget -qO- http://storm-des:8081/actuator/health
    
  3. Сквозная проверка — в приложении откройте раздел «Симуляции», создайте симуляцию на любой диаграмме и запустите её. Прогон должен перейти из «В очереди» в «Выполняется» и завершиться отчётом.

Если на каком-то шаге не получилось — см. «Типовые проблемы».

Масштабирование

Несколько контейнеров storm-des (на одном или разных хостах) разбирают общую очередь параллельно — задача достаётся ровно одной ноде. Чтобы увеличить пропускную способность:

  • поднимите дополнительные контейнеры с теми же настройками БД (при нескольких нодах на одном хосте задайте каждой свой DES_NODE_ID);
  • либо увеличьте SIMULATION_MAX_CONCURRENT и память одной ноды.

Балансировщик не нужен: очередь в базе сама распределяет задачи. DES_BASE_URL при этом указывает на любую живую ноду (или на балансировщик, если хотите отказоустойчивости и для синхронных операций).