Архитектура проекта#

1. Архитектурная модель#

ioot-pro-cabinet реализует каркас Master Cloud Layer для платформы Green Robot/IOOT PRO и ориентирован на конфигурационный, backend-driven UI.

1.1. Логические уровни (по базовой модели green-robot)#

  1. Field Device Layer (IOOT PRO устройства)
    AT32/ESP32 блоки с обменом PDO/SDO, преобразованием и transport-частью.

  2. Local Controller Layer (локальный контроллер объекта)
    Локальный исполнительный/супервизорный контур с CANopen, local broker и локальными сервисами.

  3. Tenant Cloud Layer (контур клиента)
    Облако клиента: приём телеметрии, агрегирование данных, команды, конфигурации, обновления, PostgreSQL.

  4. Master Cloud Layer (контур управления парком)
    Многоклиентский уровень: подписки, политикеы, глобальные аналитические и синхронные механизмы.

  5. Client Applications Layer (клиентские UI)
    Веб-интерфейс с карточным модульным shell и адаптивным (mobile-first) подходом.

1.2. Что сейчас реализовано в коде#

  • Master Cloud Layer (каркас):

    • backend-go/internal/api — HTTP роутинг и базовые endpointы.

    • backend-go/internal/api/plugins/<module>/plugin.go — plugin-style обработчики backend для каждого модуля.

    • backend-go/internal/modules — модульный реестр (metadata + зависимости + install state).

    • backend-go/internal/modules/catalog/<module>/definition.go — описание каждого backend-модуля в своей директории.

    • backend-go/internal/app — загрузка конфигурации (yaml + env).

    • backend-go/cmd/server/main.go — точка запуска API сервера.

  • Client Applications Layer (каркас):

    • frontend-vue/src/App.vue — shell приложения и базовые карточки.

    • frontend-vue/src/modules/<module>/manifest.js — описание frontend-модуля в своей директории.

    • frontend-vue/src/modules/registry.js — сборка frontend-реестра модулей и порядка карточек.

    • frontend-vue/src/styles.css — единый UI-стиль.

  • Инфраструктурный каркас:

    • docker-compose.yml — PostgreSQL + NanoMQ + backend.

    • scripts/dev.sh, scripts/docker.sh.

1.3. Каркас данных и сервисов (желаемая логика)#

  1. Конфигурационный/контекстный старт

    • backend-driven catalog (modules/scheme) определяет доступные модули.

    • UI выбирает module_view, display_module, show_filters.

  2. Модульная логика backend

    • API ресурсы формируют схему (GET /api/v1/<resource>/scheme) и данные (GET /api/v1/<resource>/list).

  3. Реактивная выдача и управление

    • live-потоки через WebSocket/MQTT для статусов и событий.

  4. Master-level интеграции

    • ограниченный обмен служебными данными tenant<->master;

    • отдельные контуры подписок/политик/обновлений.

1.4. Коммуникационный слой#

  • HTTP REST — синхронные операции и конфигурирование.

  • WebSocket/MQTT — телеметрия, статусы и события.

  • Swagger/OpenAPI — источник истины по контрактам.

  • Контекстные заголовки для маршрутизации и трассировки:

    • X-Route-Path

    • X-Route-Module

    • X-Route-Filter

    • X-Client-Version

    • X-Client-Build-Time

1.5. Разделение стеков (синхронизировано с green-robot)#

  • Backend: Go

  • Database: PostgreSQL

  • Message broker: NanoMQ (в составе docker-compose)

  • Frontend: Vue 3 (в текущем проекте; в базовой green-robot-архитектуре указан Vue 2+TypeScript как целевой стек)

1.6. Scope текущего этапа#

  • Закрыт каркас уровней и контрактов API.

  • Введен модульный runtime-реестр (backend-go/internal/modules) с install/uninstall.

  • Каждый модуль описывает оба контура:

    • frontend (dashboard block/component),

    • backend (набор API routes),

    • database (миграции и таблицы),

    • permissions (role/resource/actions).

  • Production runtime использует shared persistence/migration layer (postgres|sqlite) для modules/auth/site-policy/status, а modules_state_path остается только legacy import path для совместимости с прежними JSON sidecar-файлами.

  • UI-состав дашборда синхронизируется с установленными модулями.

  • Введены read-only контуры модели БД и прав:

    • GET /api/v1/modules/database/list

    • GET /api/v1/modules/permissions/list

  • Не реализованы пока:

    • production-grade domain services (tenant-master sync, analytics, policy updates как отдельные сервисы);

    • PWA/offline и специализированные отраслевые сценарии.

  • Реализован security-контур JWT + RBAC:

    • JWT (HMAC-SHA256) принимается через HttpOnly cookie и Authorization: Bearer;

    • middleware применяет role/scope гварды для master/tenant endpoint-групп;

    • tenant scope принудительно применяется для industry-*, melioration-*, poultry-*, swine-*;

    • для tenant scope включена boundary-проверка tenant_id / target_tenant_id в query и JSON body.

    • добавлена вычисляемая permission matrix (/api/v1/auth/permissions/scheme|list) для UI/API операций.

    • добавлен security-log (/api/v1/auth/security-log/scheme|list) для событий auth/action (allow|deny).

  • Реализован operability/release-ready контур:

    • публичные probes /health, /live, /ready;

    • диагностический runtime snapshot по shared persistence, migrations, зависимостям и состоянию модулей;

    • локальный quality gate (ci-local, smoke, release-checklist);

    • deployment package, production runbook и release gate.

1.7. Отраслевые контуры#

  • Добавлен отдельный документационный каркас docs/industries для изолированных отраслевых пакетов.

  • Каждый отраслевой пакет использует общие контракты ядра, но имеет собственные:

    • архитектуру;

    • backlog задач;

    • KPI/alarms профили;

    • интеграционные адаптеры оборудования.

  • Первый пакет: docs/industries/poultry (на базе источников ../poultry-module).

  • В runtime добавлен industry dispatcher с режимами:

    • cloud-multi — поддержка выбора отрасли;

    • edge-single — фиксированная отрасль на инсталляцию.

  • Для poultry frontend использует единый workspace:

    • cloud/tenant — overview dashboard с KPI summary и переходом в submodule details;

    • edge-single — fullscreen cards-dashboard для 10» HMI с теми же KPI и быстрым переходом в submodule details;

    • при отсутствии явного route/module-контекста edge-single открывает poultry workspace как primary fullscreen-экран.

  • Добавлен endpoint GET /api/v1/app/context для bootstrap-контекста (deployment mode, active industry, feature flags, user scope).

  • app/context возвращает runtime policy snapshot (permissions.ui/api, capabilities, guards) и используется как source-of-truth для UI/API guard-слоя (tenant/master, role, feature_flags), включая capability-флаги sidebar_menu и sidebar_menu_update.

  • modules/scheme дополнен catalog_enrichment и используется shell-runtime для связки Sidebar -> Content -> Infobar.

  • Shell поддерживает отдельный UI-access ресурс ui.sidebar.menu: доступ к burger-меню и его редактированию определяется role-based UI policy, а выход вынесен в topbar и остается доступным вне burger-контура.

  • Порядок модулей синхронизируется между dashboard и burger-меню через общий drag-and-drop layout persistence; быстрые fullscreen-кнопки рядом с burger формируются из закрепленных модулей sidebar.

  • Пользовательские shell-настройки (theme, dashboard_layout, quick_module_ids) сохраняются через backend auth/ui-preferences с изоляцией по tenant/site/industry и shared persistence layer; локальный localStorage используется только как fallback-кеш в degraded/offline режиме.

  • Shell profile вынесен в отдельный versioned runtime-контур auth/shell-profile: доступны list, export, import, rollback для снапшотов theme/layout/quick modules/ui-access по ключу tenant/site/industry, backend source-of-truth хранится в shared SQL persistence.

  • Для pilot-контура подготовлены preset-артефакты cloud-multi и edge-single; shell acceptance smoke выделен в отдельный сценарий и включен в release/smoke pipeline reference runtime.

  • В reference runtime теперь присутствуют pilot process-артефакты: bootstrap-package (scripts/pilot-bootstrap.py), evidence bundle (scripts/pilot-evidence-bundle.py), rollback/restore drill (scripts/pilot-rollback-drill.py) и единый sign-off bundle (scripts/pilot-signoff.py), использующие существующие API app/context, modules/list, modules/site-policy/*, auth/shell-profile/*, auth/security-log/*.

  • Для pilot-артефактов введен внешний retention storage (scripts/pilot-artifact-retention.py) с archive-root, index.json и record.json.

  • Для pilot observability добавлен нормализованный summary endpoint GET /api/v1/operability/pilot-summary и alerting CLI scripts/pilot-observability-check.py.

  • Для перехода pilot -> production добавлен формальный gate scripts/pilot-promotion-check.py, а для multi-site эксплуатации — scripts/fleet-rollout-registry.py, scripts/incident-handover-package.py и scripts/package-immutability-check.py.

  • Клиент status/stream работает в resilient-режиме: WebSocket reconnect/backoff и fallback на HTTP polling при разрыве realtime-канала.

  • Для отрасли melioration реализованы API-контуры:

    • scheme|list для field/irrigation-machine/irrigation-drip/soil-moisture/weather/control-mode;

    • ingest-маршруты machine/drip/soil/weather и weather/telemetry.

  • melioration-field рассчитывает агрегированный водный баланс по источникам и времени (mm primary, m3 derived) с D-008 policy (station primary, service fallback).

  • Добавлен profile-service для отраслевых нормативов (/api/v1/industry-profiles/*): YAML import/export, versioning и rollback профилей между хозяйствами.

  • Добавлен отраслевой industry alarm-bus (/api/v1/industry-alarms/*) и bridge в status для критичных/высоких тревог с передачей correlation_id.

  • В отраслевых API формализованы ключи изоляции tenant_id / industry_code / site_id для фильтрации и трассировки данных.

  • В modules/permissions добавлены отраслевые границы обновления прав по industry_code (policy conflict при попытке update вне выбранной отрасли).

  • Добавлен modules/site-policy контур частичной активации модулей на уровне site с фильтрацией выдачи модулей/прав/DB-модели по site_id; policy сохраняется в shared SQL persistence, а не в transient runtime store.