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

Внешние сервисы

Около 5 мин

Внешние сервисы

Развёртывание сервисов, от которых зависит StormBPMN: объектное хранилище, Redis, PlantUML, конвертация документов и почта. Базовый чек-лист и балансировщик — в обзоре Production-установки.

S3-хранилище для файлов

Что хранится в S3:

  • Изображения бизнес-процессов - схемы и диаграммы
  • Аватары пользователей - профильные изображения
  • Шаблоны документов - для генерации отчетов
  • Вложения - файлы, прикрепленные к процессам

Что выбрать, если нет корпоративного S3

StormBPMN работает с любым S3-совместимым хранилищем. Два простых варианта для self-host:

  • MinIO — привычный вариант (см. ниже). Учтите: в свежих релизах community-консоль MinIO урезали до простого браузера объектов — управление бакетами/политиками из веб-интерфейса убрали.
  • SeaweedFS — лёгкое S3-хранилище одним контейнером со встроенным веб-интерфейсом (Filer). Рекомендуем, если нужен простой UI и минимум возни.

Рекомендуемое решение: MinIO

Инфо

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

Установка MinIO

# Запуск MinIO в Docker
docker run -d \
  -p 9000:9000 \
  -p 9001:9001 \
  --name minio \
  -v /mnt/data:/data \
  -e "MINIO_ROOT_USER=stormbpmn-s3-user" \
  -e "MINIO_ROOT_PASSWORD=stormbpmn-s3-password" \
  quay.io/minio/minio server /data --console-address ":9001"

Создание дефолтного бакета

curl -fO https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mv mc /usr/local/bin/
mc alias set minio http://localhost:9000 "stormbpmn-s3-user" "stormbpmn-s3-password"
mc mb minio/storm-uploads

Настройка переменных окружения

ПеременнаяОписаниеПример значения
S3_ENDPOINTURL хранилищаhttp://192.168.0.4:9000
S3_ACCESS_KEYКлюч доступаstormbpmn-s3-user
S3_SECRET_KEYСекретный ключstormbpmn-s3-password
S3_BUCKET_UPLOADSБакет по умолчаниюstorm-uploads
S3_BUCKET_USERSБакет для пользователейstorm-users
S3_BUCKET_IMPORTSБакет для импортовstorm-imports
S3_SINGLE_USERS_BUCKETРежим единого бакета для пользователейtrue

При использовании другого S3-хранилища, совместимого с AWS SDK v2, может также понадобиться:

  • Установить переменную S3_REGION, соответствующую конфигурации вашего хранилища
  • Установить переменную S3_VIRTUAL_HOST=true для vHosted типа адресации (по умолчанию false для Path-Style)

Единый пользовательский бакет

  • Для свежей установки рекомендуем использовать S3_SINGLE_USERS_BUCKET=true.
  • Если у вас уже установлен Storm и подключен к S3-хранилищу, в котором каждый пользователь имеет свой бакет (вида user123), вы можете смигрировать их в единый бакет (например, storm-users), указать его в переменной S3_BUCKET_USERS и переключить режим работы на S3_SINGLE_USERS_BUCKET=true. В таком случае путь до пользовательских файлов будет выглядеть как s3://storm-users/user123/...

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

После настройки при сохранении диаграмм должны отображаться их миниатюры в карточном представлении.

Документация MinIO

Полное руководство по установке: MinIO Documentationopen in new window

Альтернатива: SeaweedFS (простое S3 со встроенным UI)

SeaweedFSopen in new window — лёгкое S3-совместимое хранилище. Запускается одним контейнером, имеет встроенный веб-интерфейс (Filer) и совместимо с адресацией path-style, которую использует StormBPMN. Хороший выбор, если корпоративного S3 нет, а MinIO не устраивает.

Шаг 1. Учётные данные доступа

S3 в SeaweedFS по умолчанию открыт без пароля — обязательно задайте ключи доступа через конфиг. Создайте файл s3-config.json:

{
  "identities": [
    {
      "name": "stormbpmn",
      "credentials": [
        { "accessKey": "stormbpmn-s3-user", "secretKey": "stormbpmn-s3-password" }
      ],
      "actions": ["Admin", "Read", "Write", "List", "Tagging"]
    }
  ]
}

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

docker run -d \
  --name seaweedfs \
  --restart unless-stopped \
  -p 8333:8333 \
  -p 8888:8888 \
  -v /mnt/seaweedfs:/data \
  -v "$(pwd)/s3-config.json:/etc/seaweedfs/s3-config.json:ro" \
  chrislusf/seaweedfs server \
    -dir=/data \
    -s3 \
    -s3.port=8333 \
    -s3.config=/etc/seaweedfs/s3-config.json

Команда server поднимает master, volume, filer и S3-шлюз в одном процессе.

ПортНазначение
8333S3 API (его указываем в S3_ENDPOINT)
8888Filer — веб-интерфейс для просмотра файлов

Шаг 3. Создание бакета

docker exec -i seaweedfs weed shell <<< "s3.bucket.create -name storm-uploads"

Либо любым S3-клиентом с теми же ключами (например, AWS CLI):

aws --endpoint-url http://localhost:8333 s3 mb s3://storm-uploads

Шаг 4. Переменные окружения StormBPMN

S3_ENDPOINT=http://<хост-seaweedfs>:8333
S3_ACCESS_KEY=stormbpmn-s3-user
S3_SECRET_KEY=stormbpmn-s3-password
S3_BUCKET_UPLOADS=storm-uploads
S3_SINGLE_USERS_BUCKET=true
# Адресация path-style включена по умолчанию (S3_VIRTUAL_HOST=false) — менять не нужно.

Шаг 5. Проверка

  • Откройте веб-интерфейс Filer: http://<хост-seaweedfs>:8888 — там видны бакеты и файлы.
  • В StormBPMN сохраните диаграмму — в карточном представлении должна появиться её миниатюра, а в бакете storm-uploads (в Filer) — соответствующий объект.

Документация SeaweedFS

S3 API и его настройка: SeaweedFS — Amazon S3 APIopen in new window.



Redis: совместное редактирование диаграмм

Redis используется для функции совместного редактирования диаграмм в реальном времени. Он обеспечивает:

  • Pub/Sub - доставка сообщений между экземплярами приложения (курсоры, изменения XML, присутствие)
  • Хранение сессий - информация о текущих участниках совместного редактирования

Когда нужен Redis?

  • Один экземпляр StormBPMN — Redis не требуется. Данные хранятся в памяти приложения (InMemory-режим)
  • Несколько экземпляров (multi-instance / HA) — Redis обязателен для синхронизации между нодами

Установка

# Запуск Redis в Docker
docker run -d \
  -p 6379:6379 \
  --name redis \
  redis:7-alpine

Для production рекомендуется задать пароль:

docker run -d \
  -p 6379:6379 \
  --name redis \
  redis:7-alpine \
  redis-server --requirepass your-secure-password

Настройка переменных окружения

ПеременнаяОписаниеПример значенияОбязательно
REDIS_ENABLEDВключение RedistrueДля multi-instance
REDIS_HOSTХост Redis192.168.0.7При REDIS_ENABLED=true
REDIS_PORTПорт Redis6379При REDIS_ENABLED=true
REDIS_PASSWORDПароль Redisyour-passwordЕсли задан на сервере
REDIS_DATABASEНомер базы данных Redis0Опционально (по умолч. 0)
REDIS_TIMEOUTТаймаут подключения1000msОпционально

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

После настройки откройте одну диаграмму в двух вкладках браузера — вы должны видеть аватары других участников на холсте и синхронизацию изменений в реальном времени.

Настройка балансировщика для WebSocket

Совместное редактирование использует WebSocket (STOMP over SockJS) через путь /ws. Убедитесь, что балансировщик проксирует WebSocket-соединения. Пример конфигурации приведен в разделе выше.

Sticky Sessions

При использовании нескольких нод за балансировщиком WebSocket-соединения должны поддерживать sticky sessions (привязку к ноде) — иначе SockJS fallback может не работать корректно.



PlantUML сервер (опционально)

Обеспечивает генерацию UML-диаграмм в интерфейсе приложения.

Инфо

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

Установка

# Запуск PlantUML сервера
docker run -d \
  -p 8090:8080 \
  --name plantuml \
  plantuml/plantuml-server:jetty

Настройка

ПеременнаяОписаниеПример значения
PLANTUML_SERVERURL сервера PlantUMLhttp://192.168.0.5:8090/


Сервис конвертации документов

Обеспечивает конвертацию HTML в PDF и другие форматы документов.

Инфо

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

Установка Gotenberg

# Запуск Gotenberg
docker run -d \
  -p 3001:3000 \
  --name gotenberg \
  gotenberg/gotenberg:8

Можно использовать наш образ Gotenberg

Если в организации запрещены внешние реестры (Docker Hub), используйте зеркало Gotenberg в нашем приватном реестре — это официальный образ gotenberg/gotenberg:8, подписанный той же подписью Cosign, что и основной образ StormBPMN, и доступный по тем же учётным данным cr.selcloud.ru:

docker run -d \
  -p 3001:3000 \
  --name gotenberg \
  cr.selcloud.ru/stormbpmn-enterprise/gotenberg:8

Подпись проверяется так же, как у основного образа (см. Changelog → «Проверка подписи образа (Cosign)»). Перенос образа в корпоративный реестр — по инструкции из Быстрого старта.

Настройка

ПеременнаяОписаниеПример значения
GOTENBERG_URLURL сервиса конвертацииhttp://192.168.0.5:3001

Дополнительная настройка для сложных сетевых конфигураций

Если используются балансировщики или сложная SSL конфигурация, может потребоваться указать прямой адрес контейнера:

В административном интерфейсе:

  • gotenbergOverrideBaseUrl - прямой адрес: http://corp.storm.internal


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

Выбор провайдера почты

ВариантКогда использоватьСложность настройки
ListMonkНужны красивые письма, есть ресурсы на их создание⭐⭐⭐
Простой SMTPНужна базовая функциональность

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

ПараметрОписаниеПример
baseUrlБазовый URL для ссылок в письмахhttps://stormbpmn.company.com

Вариант 1: ListMonk (красивые письма)

Установка ListMonk

# Скачивание конфигурации
 curl -LO https://github.com/knadh/listmonk/raw/master/docker-compose.yml

# Запуск (при необходимости измените порты в docker-compose.yml)
docker compose up -d

Настройка ListMonk

  1. Откройте панель администратора: http://localhost:9000

  2. Создайте супер-пользователя и войдите в систему

  3. Настройте общие параметры (Settings → General):

    • Укажите email по умолчанию для отправки

    Настройка email по умолчанию

  4. Настройте SMTP (Settings → SMTP):

    • Указать параметры корпоративного SMTP сервера
    • Протестировать соединение

    Настройка SMTP

  5. Создайте API пользователя:

    • Users → New → Тип: API
    • Роль: Super Admin
    • Сохраните API токен

    Создание API пользователя

Переменные окружения для StormBPMN

EMAIL_PROVIDER=listmonk
LISTMONK_BASE_URL=http://localhost:9000/api
LISTMONK_USERNAME=stormbpmn  # имя API пользователя
LISTMONK_PASSWORD=api-token-here  # API токен

Шаблоны писем

Создайте шаблоны писем в listmonk по данным темам и зафиксируйте ID каждого шаблона в админке Stormbpmn.

Синтаксис подстановок

Listmonk использует синтаксис Go-шаблонов: переменные доступны через {{ .Tx.Data.имя }}, а не {имя}. Например, {{ .Tx.Data.diagram_name }}.

Шаблоны

Тип уведомленияНастройка в админкеВозможные подстановки
Новый комментарийcommentEmailTemplateId{{ .Tx.Data.comment_author }}, {{ .Tx.Data.diagram_name }}, {{ .Tx.Data.diagram_url }}, {{ .Tx.Data.html_text }}
Запрос на согласованиеapprovalTemplateId{{ .Tx.Data.invite_author }}, {{ .Tx.Data.diagram_name }}, {{ .Tx.Data.diagram_url }}
Восстановление пароляrestorePasswordTemplateId{{ .Tx.Data.restoreCode }}
Согласование завершеноapprovalCompletedTemplateId{{ .Tx.Data.diagram_name }}, {{ .Tx.Data.diagram_url }}
Активация пользователяuserActivationTemplateId{{ .Tx.Data.activation_token }}
Приглашение к диаграммеsecureUpdateTemlateId{{ .Tx.Data.invite_author }}, {{ .Tx.Data.diagram_name }}, {{ .Tx.Data.diagram_url }}
Приглашение + регистрацияinviteDiagramAndRegisterTemplateId{{ .Tx.Data.invite_author }}, {{ .Tx.Data.diagram_name }}, {{ .Tx.Data.diagram_url }}, {{ .Tx.Data.register_url }}
Приглашение в командуteamInviteTemplateId{{ .Tx.Data.invite_author }}, {{ .Tx.Data.team_name }}
Приглашение в команду + регистрацияteamInviteAndRegisterTemplateId{{ .Tx.Data.invite_author }}, {{ .Tx.Data.team_name }}, {{ .Tx.Data.register_url }}
Запрос доступа к диаграммеaccessRequestTemplateId{{ .Tx.Data.requester_name }}, {{ .Tx.Data.diagram_name }}, {{ .Tx.Data.diagram_url }}, {{ .Tx.Data.request_message }}

Опечатка в ключе

Ключ secureUpdateTemlateId указан с опечаткой намеренно — именно так он называется в настройках системы (без p в Temlate).

Укажите ID шаблон в адмнике Stormbpmn

Шаблоны в админке

Вариант 2: Простой SMTP

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

ПараметрОписаниеПример
EMAIL_PROVIDERВключить простой SMTPsmtp
SMTP_HOSTSMTP хостsmtp.company.com
SMTP_PORTSMTP порт587
SMTP_USERNAMESMTP пользовательstormbpmn@company.com
SMTP_PASSWORDSMTP парольsecure-password
SMTP_FROMEmail отправителяstormbpmn@company.com
SMTP_PROTOCOLSMTP/STARTTLS/SMTPS. STARTTLS - по-умолчаниюSTARTTLS
SMTP_USE_AUTHtrue/false. Использовать авторизацию. true - по-умолчаниюtrue

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

EMAIL_PROVIDER=smtp
SMTP_PROTOCOL=
SMTP_HOST=
SMTP_PORT=
SMTP_USERNAME=
SMTP_PASSWORD=
SMTP_FROM=
SMTP_USE_AUTH=

Требуется перезагрузка

Все настройки SMTP применяются только после перезагрузки приложения.

Тестирование почтовых уведомлений

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

@your.email@company.com test