Документация ISPF
Страница для реестра российского ПО (п. 4 «ж»): функциональные характеристики, установка и эксплуатация. Ниже — выдержки из документации репозитория IoT-Solutions/ispf на GitVerse.
1. Функциональные характеристики
Для кого продукт
| Роль | Задачи | С чего начать |
|---|---|---|
| Оператор | Мониторинг, управление, work queue, отчёты | Руководство оператора |
| Администратор | Дерево объектов, дашборды, workflow, пользователи | Быстрый старт → Web Console |
| Разработчик решений | Deploy приложений, функции, operator UI, отчёты | Разработчик решений |
| Разработчик платформы | Драйверы, REQ-PF, расширения ядра | Roadmap |
| DevOps / SRE | Развёртывание, профили, инфраструктура | Развёртывание |
Что решает ISPF
Типичный стек SCADA/MES растёт отдельными модулями: OPC-сервер, historian, HMI, workflow, отчёты. ISPF объединяет их вокруг одного object tree с единым API и UI.
Диаграмма (Mermaid) — см. полную документацию на GitVerse.
Главный принцип
Бизнес-логика живёт на платформе — в blueprints, переменных, событиях, функциях и workflow дерева объектов. Платформа даёт generic-движки (CEL, bindings, BPMN, script runtime, драйверы); решение конфигурирует их декларативно. Bundle deploy — это упаковка конфигурации, а не отдельный runtime. Кратко: application-principles. Детали: architecture. Бэклог: roadmap.
Ключевые возможности
- - Единая модель — устройство, дашборд, workflow и правило тревоги — узлы дерева; логика через variables, events, functions и BPMN.
- - Bundles, а не форки ядра — отраслевые решения деплоятся как конфигурация в механизмы платформы (applications).
- - Стек — Spring Boot 4, Java 25, PostgreSQL/TimescaleDB, React 19, REST + WebSocket; опционально NATS/MQTT/Keycloak.
- - ~60 driver packs (не внутри
ispf-server.jar; maturity разный — см. drivers). - - Платформа AGPL v3 — опционально Enterprise dual-license; driver packs и application bundles могут иметь отдельные условия (license, plugins).
Возможности продукта
1. Object tree
Центральная абстракция. У каждого узла есть путь (root.platform.devices.pump-01), тип, переменные, события и функции.
| Тип узла | Назначение |
|---|---|
PLATFORM, DEVICES, DASHBOARDS, … | Системные каталоги (root.platform.*) |
DEVICE | Физическое или виртуальное устройство с драйвером |
DASHBOARD | HMI-экран (layout JSON + виджеты) |
WORKFLOW | BPMN-процесс автоматизации |
ALERT / CORRELATOR | Правила автоматизации (узлы дерева) |
MODEL | Шаблон (blueprint) для создания объектов |
APPLICATION | Зарегистрированное deploy-приложение |
USER / ROLE | Пользователи и роли (зеркало security API) |
CUSTOM | Произвольный контейнер (fallback) |
Подробнее: object-model, glossary.
2. Модели (шаблоны)
BlueprintDefinition описывает набор переменных, событий, функций и CEL-привязок. MIXIN’ы auto-apply только при непустом Applicability condition (CEL). Демо-blueprint mqtt-sensor-v1 — fixture через templateId.
Подробнее: blueprints, 0018-fixture-models-and-cel-applicability.
3. Драйверы устройств
SPI DeviceDriver связывает протоколы с переменными объектов. Администратор задаёт driverId, конфигурацию и point mapping; runtime опрашивает устройство и пишет значения в дерево.
Демо после первого старта:
| Объект | Драйвер | Назначение |
|---|---|---|
demo-sensor-01 | virtual | Синусоида температуры + alarm binding |
snmp-localhost | snmp | SNMP-агент localhost |
Подробнее: drivers.
4. Дашборды и HMI
Dashboard Builder (admin) и Operator HMI (read-only) используют одни и те же виджеты:
| Категория | Виджеты |
|---|---|
| Values | value, indicator, sparkline, chart, gauge |
| Tables | object-table, card-grid, work-queue |
| Navigation | dashboard-link (переключение экранов) |
| SCADA | scada-mimic (P&ID / однолинейные мнемосхемы) |
| Other | text, iframe, image, event-log, function-button |
Привязка данных: objectPath (статика) или selectionKey (выбор строки таблицы). Сетка layout — 84×8 (dashboards).
Подробнее: dashboards, scada, справочник виджетов: widgets.
5. Workflow (BPMN)
Визуальный BPMN-редактор в Web Console. Service tasks (в т.ч. вызов application functions), user tasks (очередь оператора), gateway с CEL, параллельные ветки, signals и NATS.
Подробнее: workflows.
2. Установка
Попробовать ISPF (≈15 минут)
Вариант A — all-in-one JAR (быстрее всего)
Скачайте ispf-*-portable.zip с GitVerse Releases (JDK 25). Распакуйте, затем:
# Windows: двойной клик по start.bat
# Linux / macOS:
./start.sh
Отдельный PostgreSQL не нужен — portable использует встроенный H2 (после первого старта файл data/ispf-local.mv.db).
Откройте http://localhost:8080 — логин admin / admin. Дальше с §2 Вход (порт 8080 вместо 5173).
Вариант B — из исходников
Требования
| Компонент | Версия |
|---|---|
| JDK | 25 (Gradle toolchain; JavaLanguageVersion.of(25)) |
| Gradle | Wrapper в репозитории |
| Node.js | 20+ |
| Docker Desktop | Опционально — только для полного стека PostgreSQL / Keycloak / MQTT |
1. Запуск API + консоли
# Терминал 1 — профиль local (H2 file DB; sync небольшого набора dev driver packs)
./gradlew :packages:ispf-server:bootRun --args="--spring.profiles.active=local"
# Терминал 2 — Web Console
cd apps/web-console && npm install && npm run dev
| URL | Назначение |
|---|---|
| http://localhost:8080 | Консоль администратора (all-in-one JAR) |
| http://localhost:5173 | Консоль администратора (Vite dev) |
| http://localhost:8080?mode=operator | Operator HMI (all-in-one JAR) |
| http://localhost:5173?mode=operator | Operator HMI (Vite dev) |
| http://localhost:8080/api/v1/info | Версия / capabilities |
| http://localhost:8080/actuator/health | Health |
bootRun по умолчанию вызывает syncDevDriverPacks (≈8 packs). Полный каталог: -Dispf.driver.packs=all.
2. Вход (local)
Пустая БД создаёт пользователей: admin / admin (также developer / developer, operator / operator). Войдите через экран логина Web Console.
API (Bearer — нужен для большинства вызовов):
TOKEN=$(curl -s -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin"}' | jq -r .token)
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/api/v1/objects
Заголовок X-ISPF-Role по умолчанию выключен (ispf.security.local-role-header-enabled=false). Не рассчитывайте на селектор Role в шапке для обычного local. Подробнее: security.
3. Первые шаги в UI

- 1. Откройте дерево объектов — ветка
root.platform. - 2. Раскройте
devices→demo-sensor-01— temperature, threshold, alarm. - 3. Дважды кликните
dashboards.demo-sensor— Dashboard Builder. - 4. Раскройте
alert-rules→temperature-threshold-exceeded— CEL-правило. - 5. Дважды кликните
workflows.demo-alarm-handler— демо BPMN. - 6. Режим оператора:
http://localhost:8080?mode=operator(all-in-one JAR) илиhttp://localhost:5173?mode=operator(Vite), или вход какoperator.
Язык: селектор в шапке (English удобен для OSS-скриншотов).
4. Старт драйвера demo-sensor
curl -X POST "http://localhost:8080/api/v1/drivers/runtime/start?devicePath=root.platform.devices.demo-sensor-01" \
-H "Authorization: Bearer $TOKEN"
Температура — синусоида; при превышении порога срабатывают alarmActive и alert rule.
Дальше после демо
- - Обзор продукта · Модель объектов · Дашборды · Автоматизация
- - Разработчик решений — реальный bundle
- - Архитектура · API
3. Эксплуатация
Руководство оператора
Руководство для пользователей с ролью operator — мониторинг оборудования, задачи из work queue, события и отчёты.
Обзор продукта: product. Технические детали UI: web-console.
Вход
URL консоли: all-in-one JAR — http://<host>:8080; Vite dev — http://<host>:5173. Подробнее: getting-started.
- 1. Откройте Web Console по одному из URL выше.
- 2. Войдите учётной записью оператора (демо:
operator/operator). - 3. После входа откроется Operator HMI — полноэкранный режим без дерева объектов и редакторов.

Если у вас роль admin, но нужен режим оператора:
http://<host>:8080?mode=operator
# или (Vite dev):
http://<host>:5173?mode=operator
Для конкретного приложения:
http://<host>:8080?mode=operator&app=platform
# или (Vite dev):
http://<host>:5173?mode=operator&app=platform
Автозапуск приложения
Администратор может настроить auto-start для вашей учётной записи: после входа сразу откроется нужное operator app (например, platform или отраслевое приложение).
Operator HMI

Слева — дашборд (виджеты, графики, таблицы); справа — сайдбар Work Queue / журнал событий; внизу справа — ИИ-помощник смены (read-only).
Что доступно оператору
| Действие | Доступно |
|---|---|
| Просмотр дашбордов и значений | ✓ |
| Live-обновления (WebSocket) | ✓ |
| Вызов функций (кнопки на дашборде) | ✓ |
| Work queue: Claim / Complete | ✓ |
| Журнал событий | ✓ |
| Редактирование layout, объектов, workflow | ✗ |
| Управление пользователями | ✗ |
| Deploy приложений | ✗ |
Работа с дашбордами
Навигация между экранами
Если в приложении несколько дашбордов, они отображаются как вкладки вверху экрана. Переключайте вкладки для перехода между экранами (например, «Обзор», «Детали», «Отчёты»).
Виджет dashboard-link на экране может открыть другой дашборд — в текущей вкладке или в модальном окне.
Виджеты на экране
| Виджет | Что показывает | Действия оператора |
|---|---|---|
| value / indicator | Текущее значение переменной | Только просмотр |
| chart / sparkline | График тренда | Только просмотр |
| gauge | Шкала | Только просмотр |
| object-table | Таблица объектов | Клик по строке → selection для других виджетов |
| card-grid | Карточки объектов | Клик → selection |
| function-button | Кнопка действия | Клик → invoke функции объекта |
| work-queue | Список BPMN-задач | Claim / Complete |
| event-log | Журнал событий | Просмотр, фильтр |
| spreadsheet | Сетка A1 с формулами | Ввод значений и формул (если editable) |
| text / image | Статический контент | — |
Полный справочник виджетов: widgets.
На экранах с таблицей устройств (object-table с selectionKey) клик по строке обновляет связанные виджеты — графики и индикаторы показывают данные выбранного устройства.
Виджет spreadsheet
Виджет spreadsheet — таблица с адресацией ячеек в стиле Excel (A1, B2, …). Значения и формулы пересчитываются на экране без round-trip к серверу (кроме live-ячеек binding).
Подробная инструкция: spreadsheet-widget.
Кратко:
| Элемент | Назначение |
|---|---|
| Formula bar | Слева — адрес выбранной ячейки; справа — значение или формула для редактирования |
| Grid | Отображаемые результаты; в режиме free — любая ячейка редактируема (кроме binding-ячеек) |
| Toolbar | В режиме free: undo/redo, copy/paste, экспорт CSV |
Выделение и ввод (free mode):
- 1. Клик по ячейке — выделить; содержимое появляется в formula bar.
- 2. Двойной клик или F2 — редактирование прямо в ячейке.
- 3. Formula bar — число (
10), текст или формула (=A1+B2); Enter — сохранить. - 4. Tab / Shift+Tab — следующая / предыдущая ячейка; стрелки — перемещение по сетке.
Горячие клавиши (free mode, фокус на сетке):
| Клавиши | Действие |
|---|---|
| F2 | Редактировать ячейку |
| Enter | Открыть редактирование / после ввода — вниз |
| Esc | Отменить редактирование |
| Ctrl+Z / Ctrl+Y | Undo / redo |
| Ctrl+C / Ctrl+V | Copy / paste ячейки |
Сохранение: введённые значения и формулы сохраняются автоматически (сессия дашборда или переменная объекта — как настроено разработчиком). После F5 данные остаются, если виджет привязан к переменной (persistMode: variable).
Лабораторный пример: дашборд root.platform.dashboards.lab-calculator — шаблонный калькулятор (режим configured): редактируются только A2 и B2; суммы пересчитываются автоматически.
Динамический выбор объекта
На экранах с таблицей устройств (object-table с selectionKey) клик по строке обновляет связанные виджеты — графики и индикаторы показывают данные выбранного устройства.
Work Queue
Work Queue содержит BPMN user tasks, назначенные операторам.
Типичный поток
- 1. Workflow запускается (вручную администратором или по событию).
- 2. Процесс доходит до user task → задача появляется в Work Queue.
- 3. Оператор нажимает Claim — задача закрепляется за ним.
- 4. Оператор выполняет действие (например, подтверждение на дашборде).
- 5. Нажимает Complete — workflow продолжается.
Где смотреть
- - Sidebar справа в Operator HMI — панель Work Queue.
- - Виджет work-queue на дашборде — встроенная очередь на экране.
Если задача недоступна
- - Задача уже claimed другим оператором — дождитесь завершения или обратитесь к администратору.
- - Статус workflow
STOPPED— новые задачи не создаются.
Журнал событий
Sidebar Event Journal показывает недавние события платформы:
- - Превышение порога датчика
- - Срабатывание alert rule
- - Ручная публикация события
- - Системные уведомления
Уровни: DEBUG, INFO, WARNING, ERROR, CRITICAL.
Виджет event-log на дашборде может фильтровать события по конкретному объекту.
4. Развёртывание (prod / Docker)
Docker Compose
docker compose up -d
| Сервис | Image | Порты | Credentials |
|---|---|---|---|
| postgres | timescale/timescaledb:latest-pg16 | 5432 | ispf/ispf |
| redis | redis:7-alpine | 6379 | — |
| nats | nats:2.10-alpine (-js) | 4222, 8222 | — |
| mosquitto | eclipse-mosquitto:2 | 1883 | config: deploy/mosquitto/ |
| keycloak | keycloak:26.0 dev | 8180 | admin/admin |
Volume: ispf_pg_data.
Profiles Compose не используются — все сервисы стартуют вместе.
Spring Boot Server
Артефакт: :packages:ispf-server:bootRun или JAR из build/libs/.
Переменные окружения
| Переменная | Default | Описание |
|---|---|---|
ISPF_DB_URL | jdbc:postgresql://localhost:5432/ispf | JDBC URL |
ISPF_DB_USER | ispf | DB user |
ISPF_DB_PASSWORD | ispf | DB password |
ISPF_SERVER_PORT | 8080 | HTTP port |
ISPF_OAUTH_ISSUER | Keycloak realm URL | JWT issuer |
ISPF_MQTT_ENABLED | false | MQTT integration |
ISPF_MQTT_BROKER | tcp://localhost:1883 | Broker URL |
ISPF_NATS_ENABLED | false | NATS integration |
ISPF_NATS_URL | nats://localhost:4222 | NATS URL |
ISPF_BOOTSTRAP_FIXTURES_ENABLED | true | Demo/lab fixture models и demo-узлы (mqtt-sensor-v1, …). См. 0018-fixture-models-and-cel-applicability. Prod VPS: vps-deploy-direct.ps1 выставляет false; lab demo — vps-factory-reset.sh --fixtures. |
Профили
| Profile | Файл | Сценарий |
|---|---|---|
| default | application.yml | PostgreSQL + JWT |
| local | application-local.yml | H2 file, Bearer после POST /api/v1/auth/login (X-ISPF-Role выключен по умолчанию) |
| dev | application-dev.yml | Full stack + MQTT/NATS |
| test | application-test.yml | H2 memory, tests |
База данных
- - Flyway — миграции при старте (
ddl-auto: validate); locations поRelationalDialect(см. 0037-relational-core-portability) - - local: H2
./data/ispf-local(PostgreSQL compatibility mode) - - prod: PostgreSQL; TimescaleDB extension (docker image
timescale/timescaledb) — hypertablesvariable_samplesиevent_history, retention 90d (0009-timescaledb-retention, 0015-event-history-timescale)
Режимы хранилища
| Режим | Metadata (ISPF_DB_*) | События | История переменных |
|---|---|---|---|
| Одна БД (default) | PostgreSQL | ISPF_EVENT_JOURNAL_STORE=jdbc | ISPF_VARIABLE_HISTORY_STORE=jdbc |
| Split telemetry | PostgreSQL | clickhouse / cassandra | clickhouse / cassandra |
Одна БД — штатный сценарий: конфигурация, объекты, event_history и variable_samples в одном PostgreSQL. ClickHouse/Cassandra — только при высокой нагрузке на time-series.
Опционально: ISPF_METADATA_DB_KIND (postgresql, h2, mssql, …) — см. storage-portability-inventory.
Смена движка metadata (greenfield, до v1.0): новая пустая БД, Flyway baseline выбранного dialect, конфигурация — импорт бандлов. In-place миграция PG→MSSQL не поддерживается.
Platform Data Sources (root.platform.data-sources.*): internal — схема в ISPF_DB; external — JDBC к внешней БД для отчётов и SQL bindings (не metadata).
Messaging
| Broker | Включение | Использование |
|---|---|---|
| MQTT | ispf.mqtt.enabled=true | Device drivers |
| NATS | ispf.nats.enabled=true | Workflow messageTask |
Production quick start (BL-127)
Одна команда поднимает lab / localhost стек на Linux-хосте с Docker (PostgreSQL + Redis + ispf-server + nginx для UI). Не привязан к VPS ispf.example.invalid.
Не для internet-facing production без hardening: порты привязаны к 127.0.0.1, demo-fixtures выключены, дефолтные пароли БД (ispf/ispf) нужно сменить перед выносом в сеть. Образы — pinned tags из deploy/air-gap-images.env. Полный чеклист prod: DEMOSTANDS.md § Production.
Требования: Docker Engine + Compose v2, JDK 25 (для сборки), Node.js 20+ (для UI).
bash deploy/prod-quickstart.sh
Скрипт:
- 1. Собирает
ispf-serverJAR (bootJar, без тестов). - 2. Собирает
apps/web-console(npm ci && npm run build). - 3. Копирует JAR в
deploy/staging/ispf-server.jar. - 4. Запускает
deploy/docker-compose.prod-stack.yml. - 5. Ждёт readiness через
deploy/health-check.sh.
| Endpoint | URL |
|---|---|
| API info | http://127.0.0.1:8080/api/v1/info |
| Actuator health | http://127.0.0.1:8080/actuator/health (не проксируется через nginx) |
| Web UI (nginx) | http://127.0.0.1:8088/ |
Остановка:
docker compose -f deploy/docker-compose.prod-stack.yml down
Volumes PostgreSQL сохраняются (ispf_prod_pg). Полная очистка: добавьте -v.
Файлы:
| Файл | Назначение |
|---|---|
deploy/docker-compose.prod-stack.yml | postgres, redis, ispf-server (Temurin JRE + mounted JAR), nginx |
deploy/air-gap-images.env | Pinned image tags (shared with BL-128 air-gap pack) |
deploy/nginx-local-prod.conf | proxy /api/, /ws/ → server; static SPA (без /actuator/) |
deploy/health-check.sh | Poll /actuator/health + smoke /api/v1/info |
Prod VPS: для ispf.example.invalid по-прежнему используйте deploy/vps-deploy-direct.ps1 (direct SCP + staging), не этот quick start.
Kubernetes Helm chart (BL-186)
Chart: deploy/helm/ispf. Устанавливается Helm 3.14+; lint/template smoke без кластера.
# Статический smoke (локальный helm или Docker alpine/helm)
bash deploy/helm/ispf/validate.sh
# Install
helm upgrade --install ispf deploy/helm/ispf \
--namespace ispf --create-namespace \
--set secrets.dbPassword='change-me' \
--set ispf.bootstrap.fixturesEnabled=false
# Runtime smoke
kubectl -n ispf rollout status deploy/ispf --timeout=180s
kubectl -n ispf port-forward svc/ispf 8080:80 &
curl -sf http://127.0.0.1:8080/actuator/health
curl -sf http://127.0.0.1:8080/api/v1/info
| Артефакт | Назначение |
|---|---|
deploy/helm/ispf/Chart.yaml | Метаданные chart |
deploy/helm/ispf/values.yaml | Defaults (historian tiers, analytics replicas, edge hints) |
deploy/helm/ispf/validate.sh | Gate helm lint + helm template (CI job helm-chart) |
deploy/helm/ispf/README.md | Заметки по install |
ARM edge в K8s: edge.enabled=true / edge.arm64=true (см. edge/arm64). Compose-профиль для Pi/шлюзов: BL-187.