From f1199e43356ae9893e377d4679fdd44236cc3ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 16 Aug 2026 14:22:35 +0400 Subject: [PATCH] =?UTF-8?q?fix(emqx):=20v0.2.0=20=D0=BE=D1=82=20=D0=BE?= =?UTF-8?q?=D1=84=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B7=D1=8B=20+=20=D1=80=D0=B5=D0=B7=D0=BE=D0=BB?= =?UTF-8?q?=D0=B2=D0=B8=D0=BC=D1=8B=D0=B5=20auth-=D0=B7=D0=B0=D0=B3=D0=BB?= =?UTF-8?q?=D1=83=D1=88=D0=BA=D0=B8=20=E2=80=94=20EMQX=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20(502=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BD=D1=91=D0=BD);=20HISTORY:=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=B2=D1=8F=D0=B7=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-08-16-session-log.md | 41 +++++++++++++++++++++++++++++++ emqx/Dockerfile | 33 ++++++------------------- emqx/Makefile | 2 +- emqx/emqx.conf | 16 ++++++++++-- 4 files changed, 64 insertions(+), 28 deletions(-) diff --git a/HISTORY/2026-08-16-session-log.md b/HISTORY/2026-08-16-session-log.md index a563672..d699b06 100644 --- a/HISTORY/2026-08-16-session-log.md +++ b/HISTORY/2026-08-16-session-log.md @@ -700,3 +700,44 @@ store сам создаст таблицу iot_devices. **Статус:** локально образ рабочий, на платформе boot висит. По договорённости с пользователем — вопрос к Sonnet (диагностика + правильный способ запуска EMQX в контейнере: без su, логи в stdout, env-конфигурация). + +--- + +## 22. EMQX РАБОТАЕТ на платформе (16.08, ~10:21 MSK) — развязка + +**Диагностика по ответу Соннета + эксперименты (хронология):** +1. Гипотеза Соннета «DNS/ndots:5 зависание на резолве заглушки» — ОПРОВЕРГНУТА + замером в поде: `getent hosts iot-service` = 103мс (быстрый NXDOMAIN). +2. deb-сборки (v0.1.4–0.1.6) на платформе «висели»: PID1=beam, CPU ~5с, логов + нет. Эксперимент: **официальный emqx/emqx:5.5.1** в тот же под — заводится, + логи в stdout есть → проблема не платформа, а наша deb-сборка. +3. **Пересборка от официальной базы:** `FROM emqx/emqx:5.5.1 + COPY emqx.conf` + (v0.2.0). Заглушки auth/ACL URL заменены на РЕЗОЛВИМЫЙ адрес shared-sqs + (containerk8s.f1ffb134-…:4100), чтобы пулы HTTP-auth не спотыкались на + nxdomain при старте. +4. **Настоящая причина «зависаний»:** с debug-логами видно — нода НЕ виснет, + а грузится ОЧЕНЬ МЕДЛЕННО при CPU-квоте 500m: каждое приложение ~5–7с + (long_schedule warnings), полная загрузка 5–10 мин. Плюс dashboard-listener + падает с таймаутами (swagger-генерация под троттлингом) — на wss не влияет, + но убрать из конфига в следующей версии. + +**Проверка (внешняя, домен exqx.containerk8s.dev.nubes.ru):** +- curl без subprotocol → 400 Bad Request от Cowboy (EMQX отвечает через edge, + fail_if_no_subprotocol — норма); +- `wscat -n -c wss://…/mqtt -s mqtt` → соединение устанавливается и держится. +- **502 устранён.** + +**Состояние:** EMQX-контейнер рабочий (ns `2fdd9658-…`, образ +`naeel/iot-emqx:v0.2.0`, digest `sha256:e53f9b29…`). Auth/ACL URL пока указывают +на заглушку shared-sqs — после создания iot-service заменить на реальный адрес +монолита (kubectl set env + rollout). + +**Следующие шаги:** +1. Создать контейнер iot-service в deck-UI (env: MQTT_HOST= + containerk8s.2fdd9658-4995-494f-892a-d88dda7da1ee.svc.cluster.local + секреты). +2. kubectl set env в EMQX: EMQX_AUTHENTICATION__1__URL / + EMQX_AUTHORIZATION__SOURCES__1__URL → http://containerk8s.:9090/… +3. End-to-end: устройство (mqtt over wss) → EMQX auth → bridge → SQS → consumer + → PG → REST API. +4. Позже: убрать dashboard из emqx.conf (v0.2.1), CPU-квоту ≥1000m для EMQX + в deck при создании (в нашем кластере можно kubectl patch). diff --git a/emqx/Dockerfile b/emqx/Dockerfile index 4fe76af..212d926 100644 --- a/emqx/Dockerfile +++ b/emqx/Dockerfile @@ -1,31 +1,14 @@ -# EMQX для IoT на платформе Nubes (контейнер «Простой HTTP»). +# EMQX для IoT на платформе Nubes. # Образ: naeel/iot-emqx (Docker Hub, публичный). # -# ⚠️ Сборка от чистого debian: платформа берёт порт приложения из EXPOSE образа, -# а в базовом emqx/emqx:5.5.1 зашито 7 EXPOSE-портов (1883/4370/5369/8083/8084/ -# 8883/18083), которые невозможно убрать из дочернего Dockerfile. Поэтому здесь -# ОДИН EXPOSE 8083 — иначе deck-UI требует несуществующее поле applicationUsePort. +# БАЗА — официальный emqx/emqx:5.5.1 (проверен на платформе: заводится, логи в +# stdout). Добавляем только наш emqx.conf (auth/ACL, listeners, логи). +# ⚠️ У образа 7 EXPOSE-портов (наследие базы) — deck-UI при СОЗДАНИИ требует +# один порт; в НАШЕМ кластере используется kubectl set image, вопрос одного +# EXPOSE для чужого кластера — отдельная задача (тикет Nubes). -FROM debian:bookworm-slim +FROM emqx/emqx:5.5.1 -RUN apt-get update \ - && apt-get install -y --no-install-recommends ca-certificates curl procps \ - && curl -fsSL -o /tmp/emqx.deb \ - https://github.com/emqx/emqx/releases/download/v5.5.1/emqx-5.5.1-debian12-amd64.deb \ - && (dpkg -i /tmp/emqx.deb || apt-get -f install -y) \ - && rm -f /tmp/emqx.deb \ - && apt-get purge -y curl \ - && apt-get autoremove -y \ - && rm -rf /var/lib/apt/lists/* - -COPY emqx.conf /etc/emqx/emqx.conf - -# data_dir из emqx.conf: /opt/emqx/data. Launcher работает от пользователя -# emqx (deb-пакет создаёт его) — каталог должен принадлежать emqx. -RUN mkdir -p /opt/emqx/data \ - && chown -R emqx:emqx /opt/emqx/data +COPY emqx.conf /opt/emqx/etc/emqx.conf EXPOSE 8083 - -ENTRYPOINT ["/usr/bin/emqx"] -CMD ["foreground"] diff --git a/emqx/Makefile b/emqx/Makefile index a6ba9b7..bac94f8 100644 --- a/emqx/Makefile +++ b/emqx/Makefile @@ -1,6 +1,6 @@ # EMQX-контейнер для IoT (образ naeel/iot-emqx). -VERSION ?= v0.1.4 +VERSION ?= v0.2.0 IMAGE ?= naeel/iot-emqx .PHONY: docker-build docker-push diff --git a/emqx/emqx.conf b/emqx/emqx.conf index a05e6c3..44d6950 100644 --- a/emqx/emqx.conf +++ b/emqx/emqx.conf @@ -16,7 +16,7 @@ authentication = [ backend = http enable = true method = post - url = "http://iot-service:9090/internal/mqtt/auth" + url = "http://containerk8s.f1ffb134-7d16-45bd-8bef-69f6ec8ab33c.svc.cluster.local:4100/internal/mqtt/auth" body { username = "${username}" password = "${password}" @@ -46,7 +46,7 @@ authorization { type = http enable = true method = post - url = "http://iot-service:9090/internal/mqtt/acl" + url = "http://containerk8s.f1ffb134-7d16-45bd-8bef-69f6ec8ab33c.svc.cluster.local:4100/internal/mqtt/acl" body { username = "${username}" clientid = "${clientid}" @@ -69,6 +69,18 @@ mqtt { retain_available = false } +## Логи: console (stdout) — видны через kubectl logs платформы. +## Файловый handler отключён (у USER emqx нет прав на /var/log/emqx при deb). +log { + console_handler { + enable = true + level = warning + } + file_handlers.default { + enable = false + } +} + ## Listeners: WebSocket — единственный порт контейнера платформы (8083). ## TCP 1883 остаётся для диагностики (не экспонируется платформой). listeners.tcp.default {