From 8e35f9fe5c0f3b9208f11636b81fec00de969d1b Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sun, 11 Oct 2026 19:45:37 +0300 Subject: [PATCH] =?UTF-8?q?docs(history):=20e2e=20=D1=82=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=B4=D0=B5=D0=BD=D0=B0=20(API=20->=20wss=20MQTT=20->=20EMQX?= =?UTF-8?q?=20->=20SQS=20->=20consumer=20->=20tenant=20PG=20->=20API)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-10-11-session-log.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/HISTORY/2026-10-11-session-log.md b/HISTORY/2026-10-11-session-log.md index 37f7fe4..74b2e6a 100644 --- a/HISTORY/2026-10-11-session-log.md +++ b/HISTORY/2026-10-11-session-log.md @@ -177,3 +177,31 @@ jlib.k8s [correctReplicaActive] | Под(ы) не работают: 'containerk8 Осталось (не блокеры): end-to-end телеметрия (устройство → MQTT → SQS → per-tenant PG), домен EMQX `wss://exqx-iot/mqtt` для внешних устройств, Terraform на PROD. + +## 8. E2E-тест телеметрии — ✅ ПРОЙДЕН (2026-10-11) + +Проверен полный путь снаружи кластера: HTTP API → MQTT (`wss`) → EMQX → bridge → SQS → +consumer → per-tenant PostgreSQL → HTTP API. + +1. **Устройство через API** (`/tmp/e2e_api.py`, PyJWT HS256 `sub=`): + `POST /v1/namespaces/e2e-nubes/iot/devices {"name":"dev1","device_id":"d-01"}` → **201**, + выданы `mqtt_username=e2e-nubes_d-01`, `mqtt_password=347425f2…753e`, + `telemetry_topic=e2e-nubes/telemetry/d-01`. + ⚠ `GET …/devices/dev1` пароль НЕ возвращает (как и задокументировано ранее). +2. **Публикация через внешний MQTT** `wss://exqx-iot.containerk8s.dev.nubes.ru/mqtt` + (`/tmp/e2e_mqtt.py`; MQTT-over-WS написан вручную на stdlib — локально нет + paho/websockets): `HTTP/1.1 101 Switching Protocols` → **`CONNACK rc=0`** + (auth прошёл: bcrypt-хеш сверен EMQX напрямую с `iot_devices`) → `PUBLISH + e2e-nubes/telemetry/d-01 {"temp":21.5,…}`. + ACL: разрешён только свой топик — публикация в него не отклонена. +3. **Доставка**: лог iot-service — `iotpg: created tenant DB namespace=e2e-nubes + db=tenant_e2e_nubes`; в `iotdb` появилась строка `e2e-nubes/dev1 (d-01)`. +4. **Чтение**: `GET /v1/namespaces/e2e-nubes/iot/telemetry?device_id=d-01` → **200** + `{"count":1,"items":[{"id":1,"device_id":"d-01","payload":{"ts":1791737028, + "src":"e2e-manual","temp":21.5}}]}`; в PG `tenant_e2e_nubes.iot_telemetry` — + 1 строка, `payload` совпадает побайтово, `message_id=30cf2047a060…` (SHA256-дедуп). + +Следствия: внешний MQTT-домен EMQX годится для устройств; SQS-креды, PG-DSN, ACL и +дедуп работают. Тестовые артефакты: устройство `e2e-nubes/dev1`, БД `tenant_e2e_nubes`. + +Осталось (не блокеры): Terraform на PROD; чистка тестовых артефактов e2e (по команде).