From 30e7da8cf81a9c237971f1ef5432b7bb00e58cf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 16 Aug 2026 19:11:17 +0400 Subject: [PATCH] feat(landing): hand-drawn pipeline SVG diagram; v0.1.12 --- Makefile | 2 +- internal/service/api/ui/landing.html | 51 ++++++++++++++- internal/service/api/ui/static/pipeline.svg | 71 +++++++++++++++++++++ 3 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 internal/service/api/ui/static/pipeline.svg diff --git a/Makefile b/Makefile index 33fb9f1..a55878f 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Makefile — монолит iot-service (образ naeel/iot-service). # Старые k8s-цели — в legacy/Makefile.old. -VERSION ?= v0.1.9 +VERSION ?= v0.1.12 IMAGE ?= naeel/iot-service LDFLAGS = -X main.version=$(VERSION) diff --git a/internal/service/api/ui/landing.html b/internal/service/api/ui/landing.html index 46dd76f..cb0d321 100644 --- a/internal/service/api/ui/landing.html +++ b/internal/service/api/ui/landing.html @@ -143,6 +143,41 @@ pre code { background: none; border: none; padding: 0; } line-height: 1.7; } .hint-box code { font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 13px; } +/* Схема пайплайна */ +.flow { + display: flex; + flex-wrap: wrap; + gap: 4px; + align-items: stretch; + margin: 10px 0 4px; +} +.flow-node { + border: 1px solid var(--brand-gray); + border-radius: 10px; + background: #fff; + padding: 10px 12px; + min-width: 110px; + text-align: center; + box-shadow: 0 1px 2px rgba(0,0,0,0.04); +} +.flow-node .fn-title { font-weight: 600; font-size: 13.5px; } +.flow-node .fn-sub { + font-family: ui-monospace, Menlo, Consolas, monospace; + font-size: 11.5px; + color: var(--text-muted); + margin-top: 3px; + word-break: break-all; +} +.flow-node.acc { border-color: #bfdbfe; background: #eff6ff; } +.flow-node.acc .fn-title { color: var(--brand-primary); } +.flow-arrow { + align-self: center; + color: var(--text-muted); + font-size: 16px; + padding: 0 2px; +} +.flow-caption { color: var(--text-muted); font-size: 12px; margin-top: 6px; } +.pipeline { width: 100%; max-width: 760px; display: block; margin: 12px auto 4px; } @@ -172,10 +207,20 @@ pre code { background: none; border: none; padding: 0; }

Устройство (датчик, бойлер, счётчик) отправляет показания по протоколу MQTT. Дальше показания проходят по цепочке и попадают в базу данных:

-
- устройство → MQTT (wss) → очередь iot-telemetry - → PostgreSQL → API / консоль + Схема пайплайна IoT +
+ Между брокером и базой работают бридж и потребитель (части iot-service): + бридж кладёт показания в очередь, потребитель пишет их в базу.
+

+ Очередь iot-telemetry — внутренний буфер сервиса: она + защищает показания от потерь при всплесках и сбоях базы. Пользователю + креды очереди НЕ нужны — сервис ходит в неё сам. Если требуется + посмотреть сообщения вручную — консоль очереди: + sqs.containerk8s.dev.nubes.ru/ui + (вход по API-токену Nubes; описание — на + sqs.containerk8s.dev.nubes.ru). +

У каждого устройства — свои логин и пароль, поэтому чужое устройство не сможет писать в ваш топик. Данные разных проектов (namespace) лежат в diff --git a/internal/service/api/ui/static/pipeline.svg b/internal/service/api/ui/static/pipeline.svg new file mode 100644 index 0000000..45161dd --- /dev/null +++ b/internal/service/api/ui/static/pipeline.svg @@ -0,0 +1,71 @@ + + + + + + + + + + ПЛАТФОРМА + + + + + + + + + + + MQTT over wss + + + бридж + + + потребитель + + + REST + + + {namespace}/ + telemetry/{device_id} + + кладёт показания + пишет в базу + чтение истории + + + + Устройство + датчик · MQTT-клиент + + + + EMQX + брокер · wss /mqtt + + + + Очередь + iot-telemetry + + + + PostgreSQL + база на namespace + + + + API / Консоль + чтение истории + + + бридж и потребитель — части сервиса iot-service +