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

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

Около 7 мин

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

Развёртывание сервисов, от которых зависит 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 -fLO 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_EXTERNAL_ENDPOINTАдрес, по которому браузер открывает ссылки на файлы (необязательно)https://s3.company.com

S3_EXTERNAL_ENDPOINT

Сервер Storm ходит в хранилище по S3_ENDPOINT (обычно внутренний адрес), а пользователям выдаются временные (presigned) ссылки на файлы, которые открывает их браузер. Если внутренний адрес недоступен с компьютеров пользователей, задайте в S3_EXTERNAL_ENDPOINT внешний адрес того же хранилища. Если переменная не задана, ссылки строятся по S3_ENDPOINT. Работу этого адреса из браузера проверяет «Проверка системы». После изменения .env перезапустите контейнер.

При использовании другого 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
GOTENBERG_WAIT_FOR_EXPRESSIONНеобязательно. JavaScript-выражение, которого Gotenberg ждёт на странице перед печатью в PDF. Менять не нужно: значение по умолчанию подходит для страниц Stormwindow.overlayReady != undefined && window.overlayReady

Значение по умолчанию — публичный демо-сервис

Если GOTENBERG_URL не задан, используется https://demo.gotenberg.dev — публичный демо-сервис в интернете. Схемы и документы пользователей при выгрузке в PDF уходили бы стороннему сервису, а из закрытой сети он вообще недоступен. В production разверните собственный контейнер Gotenberg (см. выше) и обязательно задайте GOTENBERG_URL. Проверка системы считает демо-адрес ошибкой.

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

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

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

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

Gotenberg открывает страницы Storm сам, поэтому этот адрес должен быть доступен из контейнера Gotenberg. Если «Проверка системы» сообщает, что Gotenberg не смог открыть страницу приложения, укажите здесь внутренний адрес Storm.



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

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

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

Свёрстанные письма в обоих вариантах

В сборках после 7 октября 2026 все уведомления (комментарии, согласования, приглашения, запросы доступа, симуляции, восстановление пароля и др.) приходят свёрстанными: карточка с логотипом, заголовком, кнопкой и текстовой версией письма. Для SMTP вёрстка встроена в приложение и внешних ресурсов не требует — логотип вложен в само письмо. Для ListMonk такие же шаблоны заводятся одной кнопкой — см. ниже.

Обязательно укажите это значение в административной панели, чтобы в письмах формировались правильные 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»

В сборках после 7 октября 2026 шаблоны не нужно создавать вручную. Откройте в админ-панели Настройки приложения → вкладка «📧 Электронная почта» и нажмите «Настроить базовые шаблоны в Listmonk». Stormbpmn:

  1. создаёт в ListMonk транзакционный шаблон на каждый тип уведомления — с именами вида Storm BPMN · NEW_COMMENT, в той же вёрстке, что и письма простого SMTP;
  2. записывает ID каждого шаблона в соответствующую настройку (commentEmailTemplateId и т.д. — таблица ниже).

Дальше шаблоны можно править прямо в ListMonk: меняйте тексты, цвета, логотип — Stormbpmn по-прежнему отправляет письма по ID из настроек.

Повторное нажатие безопасно:

  • шаблон, который уже есть в ListMonk под таким именем, не пересоздаётся и не перезаписывается — ваши правки в нём сохраняются;
  • настройка, в которой уже стоит ID другого шаблона (вы привязали повод к своему), не меняется — такие настройки перечисляются в предупреждении после нажатия;
  • пустые настройки (и заглушка 0) заполняются.

Права и адрес приложения

Пользователю ListMonk из LISTMONK_USERNAME нужны права на шаблоны (Super Admin, как в шаге выше). Логотип в письмах ListMonk подгружается по адресу <baseUrl>/email/storm-logo.png — проверьте, что baseUrl указан и открывается у получателей.

Если ListMonk отказал (неверный логин, недоступен), кнопка показывает причину и список уже настроенных поводов — повторное нажатие доделает остальные.

Ручная настройка

Если вы ведёте свои шаблоны, создайте их в 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 }}
Письма прогревов (Мастер Шторм)retentionEmailTemplateId{{ .Tx.Data.subject }}, {{ .Tx.Data.body }} — тело уже готовым HTML, выводите через {{ with .Tx.Data.body }}{{ Safe . }}{{ end }}. См. «Прогревы»

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

Ключ 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_AUTHfalse — не использовать авторизацию, даже если задан SMTP_USERNAME. Без SMTP_USERNAME авторизация не используется при любом значенииfalse

Письма при простом SMTP уже свёрстаны (карточка, кнопка, текстовая версия), логотип вложен в письмо — из закрытого контура ничего не загружается. Проверить отправку можно кнопкой «Отправить тестовое письмо» на вкладке «📧 Электронная почта» админ-панели: при ошибке она показывает настоящую причину отказа SMTP.

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

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

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

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

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

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

@your.email@company.com test