diff --git a/HISTORY/2026-08-16-session-log.md b/HISTORY/2026-08-16-session-log.md
index 7a276f7..bdbe56c 100644
--- a/HISTORY/2026-08-16-session-log.md
+++ b/HISTORY/2026-08-16-session-log.md
@@ -1221,3 +1221,21 @@ paho connect() rc=0 даже при CONNACK≠0 (on_connect обязателен
- «MQTT endpoint (exqx)»: почему 400 в браузере и что делать.
- v0.1.9 (digest fb488a8666ab) задеплоен, страница проверена в браузере
(структура отрисована корректно).
+
+---
+
+## 35. SVG-схема пайплайна на лендинге (v0.1.12) (20:10 GMT+03)
+
+- Две попытки Gemini дали негодные схемы (первая — всё сжато в одну строку
+ с обрезками; вторая — «бридж»/«потребитель» стали отдельными узлами,
+ дублирование, оторванные подписи). Решение: схема нарисована ВРУЧНУЮ.
+- `internal/service/api/ui/static/pipeline.svg` — 1440x300, 5 блоков
+ (Устройство | EMQX | Очередь | PostgreSQL | API/Консоль), подложка
+ «ПЛАТФОРМА» пунктиром вокруг трёх внутренних блоков, 4 стрелки с
+ ярлыками (MQTT over wss / бридж / потребитель / REST) и подписями
+ переходов, подвал «бридж и потребитель — части сервиса iot-service».
+ Палитра дизайн-системы (#2563eb/#eff6ff/#bfdbfe/#d1d5db/#6b7280).
+- landing.html: схема вставлена через
+ (по правилу дизайн-системы — файлом, НЕ инлайн), CSS-флоу удалён.
+- v0.1.12 (digest b6a44303f9f5) задеплоен; проверка: landing 200,
+ pipeline.svg 200 (image/svg+xml, 4591 байт).
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; }
Устройство (датчик, бойлер, счётчик) отправляет показания по протоколу MQTT. Дальше показания проходят по цепочке и попадают в базу данных:
-MQTT (wss) → очередь iot-telemetry
- → PostgreSQL → API / консоль
+
+ Очередь 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 @@ +