fix(bridge): resubscribe on every (re)connect; emqx v0.2.1 dashboard off; iot-service v0.1.1

This commit is contained in:
“Naeel”
2026-08-16 15:24:26 +04:00
parent 3ec8fe86c2
commit d970958e5c
5 changed files with 83 additions and 17 deletions
+58
View File
@@ -847,3 +847,61 @@ EMQX_LOG__CONSOLE_HANDLER__LEVEL=debug (диагностика)
(devices + bridge) + authorization postgres + http-фолбэк; монолит создаёт
bridge-строку в iot_devices (EnsureBridgeDevice).
4. Процедура деплоя для чужого кластера (документ).
---
## 26. Tail 2 выполнен + найден и исправлен баг реконнекта бриджа (14:30 GMT+03)
### 26.1 EMQX v0.2.1 — dashboard выключен
- `emqx/emqx.conf`: `dashboard { listeners.http { enable = false } }`.
Причина: на CPU-квоте 500m swagger-генерация dashboard падает с таймаутами
(crash-loop emqx_dashboard_listener), засоряет логи.
- `emqx/Makefile`: VERSION → v0.2.1. Сборка локально, smoke-тест
(docker run -p 18083:8083 + wscat -s mqtt — соединение держится), пуш
`naeel/iot-emqx:v0.2.1` + latest (digest 16974eac84e0).
- Деплой на платформу: `kubectl -n 2fdd9658-… set image deployment/containerk8s
app=naeel/iot-emqx:v0.2.1` + patch CPU: limits cpu=2, memory=1Gi
(deck-рекомендация: задавать CPU ≥1000m при создании).
- Проверка v0.2.1: под Running, bridge-подключение живо (PINGREQ/PINGRESP),
внешний wss: wscat держит соединение, curl без subprotocol → 400 (норма),
dashboard-падений в логах нет.
### 26.2 БАГ: бридж не переподписывался после реконнекта (найден в 26.1)
- Симптом: живая публикация (paho, rc=0) → в EMQX PUBLISH принят,
authorization_permission_allowed, publish_to — но до PG не дошёл;
в логах монолита после реконнекта нет второго "bridge: subscribed".
- Хронология: монолит v0.1.0 рестартован в 11:11 (AUTH_TEST_MODE=false),
"bridge: subscribed" в 11:11:18; EMQX перезапущен (v0.2.1), бридж
реконнект в 11:14:08 — БЕЗ повторной подписки; сессия EMQX потеряна →
подписчиков на +/telemetry/+ нет → сообщения молча теряются.
- Причина в коде: `SetCleanSession(false)` + подписка один раз в Run();
paho при реконнекте полагается на возобновление сессии сервером,
resubscribe не выполнялся.
- ФИКС `internal/service/bridge/bridge.go`: подписка перенесена в
OnConnectHandler (выполняется при КАЖДОМ подключении); handler передаётся
в connectMQTT; Run() больше не подписывается вручную.
- Монолит: Makefile VERSION → v0.1.1; go build/vet OK; образ
`naeel/iot-service:v0.1.1` + latest (digest ba120dff63d7) собраны и запушены.
- Деплой: `kubectl -n 4504e05b-… set image deployment/containerk8s
app=naeel/iot-service:v0.1.1`. В логах нового пода: connected + subscribed
(11:22:25), после вытеснения старого пода (close 1000 — EMQX кикает
дубль clientid) реконнект 11:22:25.109 + ПОВТОРНЫЙ subscribed — фикс работает.
### 26.3 Живой e2e после фикса (PASS)
- paho-mqtt (websockets, path=/mqtt) → wss://exqx.containerk8s.dev.nubes.ru,
client e2e-paho-2, username test_dev-001 → publish test/telemetry/dev-001
{"e2e_v011":true,"temp":42.0}.
- API (JWT структурный, Bearer): GET /v1/namespaces/test/iot/telemetry →
count=2: id=2 ts=2026-08-16T14:23:22+03:00 payload {"temp":42.0,"e2e_v011":true}.
- Цепочка подтверждена: устройство → wss → EMQX → bridge → SQS iot-telemetry →
consumer → PG (tenant_test) → API.
### 26.4 Инструментальные заметки
- Сырые MQTT-пакеты через python websocket-client снаружи → EMQX рвёт с
{error,bad_encoding} (оба теста); wscat и paho работают штатно →
для e2e-тестов использовать paho или wscat, не велосипеды на сырых кадрах.
- JWT для тестов API: структурный (3 части, payload с sub+exp), подпись не
проверяется (validateJWT) — минтить python-ом.
- EMQX-логика e2e-диагностики: grep EMQX-логов по clientid → CONNECT/auth →
authorization_permission_allowed → publish_to; монолит: auth/acl 200,
bridge subscribed; PG: API telemetry.