Приложение Д. Исходные тексты схем Mermaid¶
Приложение содержит исходный Mermaid-код графических схем ПД. Диаграммы остаются в основных разделах и приложениях документа, а этот раздел предназначен для копирования, проверки и редактирования кода схем в Mermaid-редакторе.
Перечень схем¶
Исходные тексты Mermaid¶
ПД-MER-001. 2.1. Участники взаимодействия¶
Расположение схемы: Раздел 2. Описание автоматизируемых функций.
flowchart LR
users["Пользовательские роли<br/>функциональный администратор, эксперт, аналитик, ОТиПБ"] --> ui["Web UI и API BOX5-DIT-MGSN"]
ui --> core["Внутренние подсистемы BOX5-DIT-MGSN"]
core --> data["Kafka, хранилища, наблюдаемость"]
core --> ext["Внешние системы и источники данных"]
svc["Сервисные учётные записи"] --> core
sysadmins["Системные администраторы"] --> ops["Контур развёртывания<br/>конфигурация, мониторинг, сопровождение"]
ops --> core
ops --> data
ПД-MER-002. А.1. Контекст решения¶
Расположение схемы: Приложение А. Схема функциональной структуры (С2).
flowchart LR
classDef external fill:#fff7e6,stroke:#b7791f,color:#1f2937;
classDef user fill:#eef6ff,stroke:#2563eb,color:#1f2937;
classDef core fill:#eefaf3,stroke:#15803d,color:#1f2937;
subgraph users["Пользователи"]
operator["Эксперт центра компетенций<br/>События и сценарии"]
admin["Функциональный администратор<br/>Полный доступ в UI"]
engineer["Аналитик данных<br/>Камеры, модели, сценарии"]
otipb["Сотрудник ОТиПБ<br/>Видео и нарушения"]
end
subgraph sources["Источники данных"]
cameras["IP-камеры<br/>live-видеопотоки"]
vms["CSVN / VMS<br/>Cisco, Milestone, Macroscop<br/>архивные записи"]
virtualVideo["Виртуальные камеры<br/>подгруженные видеозаписи"]
asutp["АСУ ТП<br/>сигналы и состояния"]
pkkot["ПК-КОТ<br/>справочники и статусы"]
keycloak["Keycloak / OpenID Connect<br/>SSO-авторизация"]
end
sova["ИТ-решение BOX5-DIT-MGSN<br/>видеоаналитика, события,<br/>интеграционный контур"]
subgraph consumers["Внешние получатели данных"]
notify["Email<br/>канал уведомлений"]
extApi["Внешние API<br/>получателей данных"]
end
operator -->|"видео, нарушения,<br/>сценарии и модели"| sova
admin -->|"полный доступ<br/>по всем площадкам"| sova
engineer -->|"камеры, модели,<br/>сценарии и нарушения"| sova
otipb -->|"просмотр видео,<br/>нарушения вручную"| sova
cameras -->|"RTSP<br/>прямой видеопоток"| sova
vms -->|"API систем видеонаблюдения<br/>архивные видеозаписи"| sova
virtualVideo -->|"HTTP / MP4<br/>файлы для анализа"| sova
asutp -->|"Kafka / Avro"| sova
pkkot -->|"PostgreSQL / HTTP"| sova
keycloak -->|"OIDC / authorization code"| sova
sova -->|"email-уведомления"| notify
sova -->|"события,<br/>статусы, медиа"| extApi
class operator,admin,engineer,otipb user;
class cameras,vms,virtualVideo,asutp,pkkot,keycloak,notify,extApi external;
class sova core;
ПД-MER-003. А.2.1. Пользовательский и прикладной контур¶
Расположение схемы: Приложение А. Схема функциональной структуры (С2).
flowchart LR
classDef core fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef edge fill:#eef6ff,stroke:#2563eb,color:#1f2937;
ui["Пользовательский контур<br/>ui-rest"]
stats["Статистика и события<br/>statistics"]
inf["Видеоаналитика и инференс<br/>inference, extended-inference"]
svr["Интеграционный контур<br/>severstal"]
sandbox["Песочница сценариев<br/>node-red-sandbox"]
ui -->|"API-доступ"| stats
ui -->|"управление<br/>видеоаналитикой"| inf
ui -->|"customer-domain API"| svr
ui -->|"работа<br/>со сценариями"| sandbox
stats -->|"лента событий,<br/>отчёты"| ui
class ui edge;
class stats,inf,svr,sandbox core;
ПД-MER-004. А.2.2. Событийный обмен¶
Расположение схемы: Приложение А. Схема функциональной структуры (С2).
flowchart TB
classDef core fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef infra fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
kafka[("Событийная шина<br/>kafka-domain")]
inf["inference,<br/>extended-inference"]
stats["statistics"]
svr["severstal"]
sandbox["node-red-sandbox"]
inf <-->|"результаты,<br/>heartbeats"| kafka
stats <-->|"события,<br/>команды"| kafka
svr <-->|"синхронизация,<br/>статусы"| kafka
sandbox -->|"модельные<br/>и sandbox-события"| kafka
class inf,stats,svr,sandbox core;
class kafka infra;
ПД-MER-005. А.2.3. Данные и хранилища¶
Расположение схемы: Приложение А. Схема функциональной структуры (С2).
flowchart LR
classDef core fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef infra fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
stats["statistics"]
inf["inference"]
svr["severstal"]
subgraph stores["Хранилища данных"]
pg[("PostgreSQL")]
ch[("ClickHouse")]
redis[("Redis")]
minio[("MinIO / DTS")]
end
stats -->|"пользователи,<br/>камеры, события"| pg
stats -->|"аналитика,<br/>витрины"| ch
inf -->|"модели,<br/>состояние"| pg
inf -->|"изображения,<br/>видеофрагменты"| minio
svr -->|"справочники,<br/>сценарии, активы"| pg
svr -->|"медиа<br/>и файлы"| minio
class stats,inf,svr core;
class pg,ch,redis,minio infra;
ПД-MER-006. А.2.4. Эксплуатационная инфраструктура¶
Расположение схемы: Приложение А. Схема функциональной структуры (С2).
flowchart LR
classDef core fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef infra fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
domains["Подсистемы BOX5-DIT-MGSN<br/>ui-rest, statistics, inference,<br/>severstal, node-red-sandbox"]
obs["Наблюдаемость<br/>elk-log"]
domains -.->|"логи,<br/>метрики"| obs
class domains core;
class obs infra;
ПД-MER-007. А.3. Ключевые потоки данных¶
Расположение схемы: Приложение А. Схема функциональной структуры (С2).
flowchart TB
classDef external fill:#fff7e6,stroke:#b7791f,color:#1f2937;
classDef core fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef infra fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
cameras["IP-камеры<br/>RTSP live"]
virtualVideo["Виртуальные камеры<br/>подгруженные записи"]
media["Медиасервер<br/>и балансировщик"]
nri["NRI-инференс"]
kafka[("Kafka")]
stats["Статистика и события"]
ui["Web UI"]
severstalSrc["ПК-КОТ, CSVN/VMS, АСУ ТП"]
svr["Интеграционный контур"]
storage[("PostgreSQL / ClickHouse / MinIO / Redis")]
engineer["Аналитик данных"]
sandbox["Node-RED Sandbox"]
notify["Email / внешние API"]
obs["Prometheus / Loki"]
cameras -->|"live-видео"| media
virtualVideo -->|"видеофайл / URL"| media
media -->|"кадры"| nri
nri -->|"события,<br/>heartbeat"| kafka
kafka -->|"принятые события"| stats
stats -->|"лента событий,<br/>отчёты"| ui
stats -->|"события и медиа"| notify
severstalSrc -->|"справочники,<br/>топология, архивы,<br/>сигналы"| svr
svr -->|"нормализованные данные"| kafka
svr -->|"справочники<br/>и сценарии"| storage
stats -->|"события,<br/>отчёты, аудит"| storage
nri -->|"изображения,<br/>видеофрагменты"| storage
engineer -->|"разработка"| sandbox
sandbox -->|"версии сценариев"| svr
sandbox -->|"flows и модели"| nri
media -.->|"метрики и логи"| obs
nri -.->|"метрики и логи"| obs
stats -.->|"метрики и логи"| obs
svr -.->|"метрики и логи"| obs
class cameras,virtualVideo,severstalSrc,engineer,notify external;
class media,nri,stats,ui,svr,sandbox core;
class kafka,storage,obs infra;
ПД-MER-008. Б.1. Общая схема соединений по группам сервисов¶
Расположение схемы: Приложение Б. Схема соединений (С4).
flowchart LR
classDef external fill:#fff7e6,stroke:#b7791f,color:#1f2937;
classDef edge fill:#eef6ff,stroke:#2563eb,color:#1f2937;
classDef domain fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef infra fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
classDef sandboxCls fill:#fff1f2,stroke:#be123c,color:#1f2937;
users["Пользователи<br/>web UI"]
video["IP-камеры,<br/>CSVN/VMS,<br/>виртуальные камеры"]
industrial["ПК-КОТ,<br/>АСУ ТП"]
sso["Keycloak / OIDC"]
email["SMTP / Email"]
externalApi["Внешние системы<br/>получатели данных"]
ui["ui-rest<br/>edge и API gateway"]
stats["statistics<br/>события, отчёты, аудит, auth"]
inference["inference + extended-inference<br/>медиа, NRI, модели, ресурсы"]
severstal["severstal<br/>интеграционный контур"]
kafka["kafka-domain<br/>основная событийная шина"]
data["data-storage<br/>MinIO / DTS"]
obs["elk-log<br/>Prometheus / Loki"]
sandbox["node-red-sandbox<br/>подготовка сценариев"]
users -->|"HTTP/HTTPS, WS"| ui
sso -->|"OIDC authorization code"| users
video -->|"RTSP, VMS API, HTTP upload"| inference
video -->|"VMS API, архивы"| severstal
industrial -->|"PostgreSQL, HTTP, Kafka/Avro"| severstal
ui -->|"HTTP/gRPC, REST"| stats
ui -->|"HTTP/gRPC, REST"| inference
ui -->|"customer-domain API"| severstal
ui -->|"S3 proxy"| data
ui -->|"/sandbox"| sandbox
stats <-->|"events, audit, commands"| kafka
inference <-->|"inference events, heartbeats"| kafka
severstal <-->|"sync, statuses, events"| kafka
sandbox -.->|"публикация flows"| ui
stats -->|"SMTP"| email
stats -->|"события, отчёты, медиа"| externalApi
severstal -->|"event statuses"| externalApi
stats -->|"files, media"| data
inference -->|"images, video fragments"| data
severstal -->|"files, exports"| data
stats -.->|"metrics, logs"| obs
inference -.->|"metrics, logs"| obs
severstal -.->|"metrics, logs"| obs
ui -.->|"logs"| obs
class users,video,industrial,sso,email,externalApi external;
class ui edge;
class stats,inference,severstal domain;
class kafka,data,obs infra;
class sandbox sandboxCls;
ПД-MER-009. Б.2.1. ui-rest: внешний вход и API gateway¶
Расположение схемы: Приложение Б. Схема соединений (С4).
flowchart LR
classDef external fill:#fff7e6,stroke:#b7791f,color:#1f2937;
classDef edge fill:#eef6ff,stroke:#2563eb,color:#1f2937;
classDef domain fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef infra fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
browser["Пользовательский браузер"]
nginx["ui-nginx<br/>80, 443"]
react["ui-react<br/>SPA HTTP 8000"]
gateway["ui-rest-to-gprc<br/>REST / GraphQL / WS"]
stats["statistics services"]
inf["inference services"]
svr["severstal services"]
minio["ds-minio / DTS"]
kafka["inf-kafka"]
clickhouse["ClickHouse<br/>analytics routes"]
sandbox["node-red-sandbox-nginx"]
browser -->|"HTTP/HTTPS"| nginx
nginx -->|"/"| react
nginx -->|"/api/*, /api/ws, /api/graphql"| gateway
nginx -->|"/api/s3*"| minio
nginx -->|"/sandbox/"| sandbox
gateway -->|"HTTP/gRPC"| stats
gateway -->|"HTTP/gRPC, REST"| inf
gateway -->|"CUSTOM_DOMAINS=[severstal]"| svr
gateway -->|"S3 API / files"| minio
gateway -->|"Kafka audit/ws"| kafka
gateway -->|"ClickHouse client"| clickhouse
class browser external;
class nginx,react,gateway edge;
class stats,inf,svr domain;
class minio,kafka,clickhouse,sandbox infra;
ПД-MER-010. Б.2.2. statistics: авторизация, события, отчёты и аудит¶
Расположение схемы: Приложение Б. Схема соединений (С4).
flowchart TB
classDef edge fill:#eef6ff,stroke:#2563eb,color:#1f2937;
classDef service fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef data fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
classDef external fill:#fff7e6,stroke:#b7791f,color:#1f2937;
gateway["ui-rest-to-gprc"]
keycloak["Keycloak / OIDC"]
smtp["SMTP / Email"]
kafka["inf-kafka"]
minio["ds-minio / DTS"]
auth["st-auth"]
access["st-access"]
camera["st-camera-storage"]
event["st-event-storage"]
statistic["st-event-statistic"]
audit["st-audit"]
reportEmail["st-report-email"]
reportPdf["st-report-pdf-xlsx-generator"]
pg[("PostgreSQL sidecars")]
redis[("Redis sidecars")]
ch[("ClickHouse sidecars")]
gateway -->|"HTTP/gRPC"| auth
gateway -->|"HTTP/gRPC"| access
gateway -->|"HTTP/gRPC"| camera
gateway -->|"HTTP/gRPC"| event
gateway -->|"HTTP/gRPC"| statistic
gateway -->|"HTTP/gRPC"| audit
gateway -->|"HTTP/gRPC"| reportEmail
gateway -->|"HTTP/gRPC"| reportPdf
auth -->|"OIDC code exchange"| keycloak
auth -->|"SMTP reset mail"| smtp
reportEmail -->|"SMTP notifications"| smtp
camera <-->|"camera/object topics"| kafka
event <-->|"event topics"| kafka
statistic <-->|"event analytics topics"| kafka
audit <-->|"add_audit_record"| kafka
access -->|"privilege topics"| kafka
reportEmail <-->|"notification topics"| kafka
auth --> pg
access --> pg
camera --> pg
event --> pg
statistic --> ch
audit --> pg
reportEmail --> pg
reportPdf --> minio
event --> minio
camera --> minio
auth --> redis
access --> redis
class gateway edge;
class auth,access,camera,event,statistic,audit,reportEmail,reportPdf service;
class pg,redis,ch,kafka,minio data;
class keycloak,smtp external;
ПД-MER-011. Б.2.3. inference и extended-inference: медиаконтур и NRI¶
Расположение схемы: Приложение Б. Схема соединений (С4).
flowchart TB
classDef external fill:#fff7e6,stroke:#b7791f,color:#1f2937;
classDef edge fill:#eef6ff,stroke:#2563eb,color:#1f2937;
classDef service fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef data fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
gateway["ui-rest-to-gprc"]
cameras["IP-камеры<br/>RTSP"]
virtual["Виртуальные камеры<br/>HTTP/MP4"]
kafka["inf-kafka"]
minio["ds-minio"]
mediaserver["inf-mediaserver"]
balancer["inf-load-balancer"]
nri["inf-nri-inference"]
monitoring["inf-monitoring"]
images["inf-image-storage"]
extractor["inf-report-video-extractor"]
flows["inf-flows-manager"]
resources["inf-vl-resource-manager"]
converters["mm-conversion / yolo-conversion"]
guardant["inf-guardant-control-center"]
coturn["inf-coturn"]
pg[("PostgreSQL sidecars")]
redis[("Redis sidecars")]
cameras -->|"RTSP"| mediaserver
virtual -->|"HTTP/MP4"| mediaserver
mediaserver -->|"frames / streams"| balancer
balancer -->|"camera tasks"| nri
nri -->|"events, heartbeat"| kafka
nri -->|"images, fragments"| images
nri -->|"model artifacts"| registry
registry["svr-models-registry"]
gateway -->|"HTTP/gRPC"| balancer
gateway -->|"HTTP/gRPC"| mediaserver
gateway -->|"HTTP/gRPC"| monitoring
gateway -->|"HTTP/gRPC"| flows
gateway -->|"HTTP/gRPC"| resources
flows -->|"flow versions"| nri
resources -->|"GPU reservations"| nri
registry -->|"artifacts"| minio
images -->|"images"| minio
extractor -->|"video fragments"| minio
monitoring <-->|"status topics"| kafka
converters -->|"converted artifacts"| registry
balancer --> guardant
mediaserver --> coturn
balancer --> pg
monitoring --> pg
flows --> pg
resources --> redis
images --> redis
class cameras,virtual external;
class gateway edge;
class mediaserver,balancer,nri,monitoring,images,extractor,flows,resources,converters,guardant,coturn,registry service;
class kafka,minio,pg,redis data;
ПД-MER-012. Б.2.4. severstal: интеграционный контур с системами заказчика¶
Расположение схемы: Приложение Б. Схема соединений (С4).
flowchart TB
classDef external fill:#fff7e6,stroke:#b7791f,color:#1f2937;
classDef edge fill:#eef6ff,stroke:#2563eb,color:#1f2937;
classDef service fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef data fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
gateway["ui-rest-to-gprc<br/>customer-domain API"]
vms["CSVN / VMS<br/>Cisco, Milestone, Macroscop"]
pkkot["ПК-КОТ"]
asutpExt["АСУ ТП<br/>signal Kafka"]
kafka["inf-kafka"]
minio["ds-minio / DTS"]
integration["svr-severstal-integration"]
pkdb["svr-postgres-pk-kot"]
org["svr-severstal-org-sync"]
asutp["svr-asutp"]
asutpKafka["svr-asutp-kafka"]
schema["svr-asutp-schema-registry"]
nifi["svr-severstal-nifi-integration"]
scenario["svr-scenario-storage"]
liteScenario["svr-lite-scenario-storage"]
asset["svr-asset-storage"]
launch["svr-launch-storage"]
registry["svr-models-registry"]
translations["svr-translations-store"]
security["svr-security-notice<br/>audit consumer"]
pg[("PostgreSQL sidecars")]
redis[("svr-asutp-redis")]
gateway -->|"HTTP/gRPC/REST"| integration
gateway -->|"HTTP/gRPC"| scenario
gateway -->|"HTTP/gRPC"| liteScenario
gateway -->|"HTTP/gRPC"| asset
gateway -->|"HTTP/gRPC"| launch
gateway -->|"HTTP/gRPC"| registry
gateway -->|"HTTP/gRPC"| translations
vms -->|"SOAP/WSDL или HTTP VMS API"| integration
pkkot -->|"PostgreSQL read"| pkdb
pkdb -->|"read model"| integration
integration -->|"HTTP push statuses"| pkkot
org -->|"org/camera sync"| integration
asutpExt -->|"Kafka / Avro"| asutpKafka
asutpKafka --> asutp
schema -->|"Schema Registry API"| asutp
asutp -->|"unit state events"| kafka
integration <-->|"status, sync, events"| kafka
security -->|"consume add_audit_record only"| kafka
scenario --> pg
liteScenario --> pg
asset --> pg
launch --> pg
registry --> pg
translations --> pg
integration --> pg
nifi --> pg
asutp --> pg
asutp --> redis
scenario --> minio
registry --> minio
class vms,pkkot,asutpExt external;
class gateway edge;
class integration,pkdb,org,asutp,asutpKafka,schema,nifi,scenario,liteScenario,asset,launch,registry,translations,security service;
class kafka,minio,pg,redis data;
ПД-MER-013. Б.2.5. Инфраструктурные домены: kafka-domain, data-storage, elk-log¶
Расположение схемы: Приложение Б. Схема соединений (С4).
flowchart LR
classDef edge fill:#eef6ff,stroke:#2563eb,color:#1f2937;
classDef domain fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef infra fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
classDef external fill:#fff7e6,stroke:#b7791f,color:#1f2937;
ui["ui-rest"]
stats["statistics"]
inf["inference"]
svr["severstal"]
kafka["inf-kafka"]
minio["ds-minio"]
dts["ds-data-temporary-storage"]
dsGateway["ds-domain-gateway"]
prom["log-prometheus"]
loki["log-loki"]
stats <-->|"Kafka"| kafka
inf <-->|"Kafka"| kafka
svr <-->|"Kafka"| kafka
ui -->|"/api/s3*"| minio
ui -->|"DTS API"| dts
stats -->|"S3 / HTTP"| minio
inf -->|"S3 / HTTP"| minio
svr -->|"S3 / HTTP"| minio
dsGateway --> minio
stats -.->|"/metrics"| prom
inf -.->|"/metrics"| prom
svr -.->|"/metrics"| prom
ui -.->|"docker logs"| loki
stats -.->|"docker logs"| loki
inf -.->|"docker logs"| loki
svr -.->|"docker logs"| loki
class ui edge;
class stats,inf,svr domain;
class kafka,minio,dts,dsGateway,prom,loki infra;
ПД-MER-014. Б.2.6. node-red-sandbox: песочница сценариев¶
Расположение схемы: Приложение Б. Схема соединений (С4).
flowchart TB
classDef external fill:#fff7e6,stroke:#b7791f,color:#1f2937;
classDef edge fill:#eef6ff,stroke:#2563eb,color:#1f2937;
classDef service fill:#fff1f2,stroke:#be123c,color:#1f2937;
classDef data fill:#f5f3ff,stroke:#6d28d9,color:#1f2937;
user["Аналитик данных"]
box["Основной UI/API BOX5-DIT-MGSN<br/>ui-nginx"]
nginx["nr-sbx-nginx<br/>81 / /sandbox"]
frontend["nr-sbx-frontend"]
backend["nr-sbx-backend"]
nodeRed["nr-sbx-node-red-vl"]
nri["nr-sbx-nri<br/>Jupyter 18889"]
celery["nr-sbx-celery"]
flower["nr-sbx-flower"]
mm["nr-sbx-mm-conversion"]
yolo["nr-sbx-yolo-conversion"]
kafka["sandbox Kafka"]
redis["sandbox Redis"]
volumes[("shared volumes<br/>flows, models, configs")]
minio["ds-minio"]
user -->|"HTTP /sandbox"| box
box -->|"proxy"| nginx
user -->|"direct 18889"| nri
nginx --> frontend
nginx --> backend
nginx --> nodeRed
nginx --> flower
backend -->|"REST / Socket.IO"| frontend
backend -->|"Node-RED API"| nodeRed
backend -->|"tasks"| celery
backend --> redis
backend --> kafka
celery --> redis
celery --> kafka
celery --> mm
celery --> yolo
celery --> minio
nri --> nodeRed
nri --> volumes
nodeRed --> volumes
mm --> volumes
yolo --> volumes
backend -.->|"publish flows / Box API"| box
class user external;
class box,nginx edge;
class frontend,backend,nodeRed,nri,celery,flower,mm,yolo service;
class kafka,redis,volumes,minio data;
ПД-MER-015. В.1. Схема внешних взаимодействий¶
Расположение схемы: Приложение В. Реестр внешних систем.
flowchart LR
classDef source fill:#fff7e6,stroke:#b7791f,color:#1f2937;
classDef auth fill:#eef6ff,stroke:#2563eb,color:#1f2937;
classDef core fill:#eefaf3,stroke:#15803d,color:#1f2937;
classDef consumer fill:#fdf2f8,stroke:#be185d,color:#1f2937;
cameras["IP-камеры<br/>live RTSP"]
vms["CSVN / VMS<br/>Cisco, Milestone, Macroscop"]
virt["Виртуальные камеры<br/>загруженные записи"]
pkkot["ПК-КОТ<br/>справочники и статусы"]
asutp["АСУ ТП<br/>сигналы Kafka / Avro"]
keycloak["Keycloak / OpenID Connect<br/>SSO"]
email["SMTP / Email<br/>уведомления"]
consumers["Системы заказчика<br/>API / выгрузки данных"]
sova["BOX5-DIT-MGSN<br/>продуктовый контур"]
cameras -->|"RTSP"| sova
vms -->|"VMS API / архивы"| sova
virt -->|"HTTP / MP4"| sova
pkkot <-->|"PostgreSQL read / HTTP push"| sova
asutp -->|"Kafka / Schema Registry"| sova
keycloak -->|"OIDC authorization code"| sova
sova -->|"SMTP"| email
sova -->|"HTTP API / выгрузки данных"| consumers
class cameras,vms,virt,pkkot,asutp source;
class keycloak auth;
class email,consumers consumer;
class sova core;