fix(emqx): v0.2.0 от официальной базы + резолвимые auth-заглушки — EMQX работает (502 устранён); HISTORY: развязка задокументирована
This commit is contained in:
@@ -700,3 +700,44 @@ store сам создаст таблицу iot_devices.
|
|||||||
**Статус:** локально образ рабочий, на платформе boot висит. По договорённости
|
**Статус:** локально образ рабочий, на платформе boot висит. По договорённости
|
||||||
с пользователем — вопрос к Sonnet (диагностика + правильный способ запуска EMQX
|
с пользователем — вопрос к Sonnet (диагностика + правильный способ запуска EMQX
|
||||||
в контейнере: без su, логи в stdout, env-конфигурация).
|
в контейнере: без 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.<ns-iot>: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).
|
||||||
|
|||||||
+8
-25
@@ -1,31 +1,14 @@
|
|||||||
# EMQX для IoT на платформе Nubes (контейнер «Простой HTTP»).
|
# EMQX для IoT на платформе Nubes.
|
||||||
# Образ: naeel/iot-emqx (Docker Hub, публичный).
|
# Образ: naeel/iot-emqx (Docker Hub, публичный).
|
||||||
#
|
#
|
||||||
# ⚠️ Сборка от чистого debian: платформа берёт порт приложения из EXPOSE образа,
|
# БАЗА — официальный emqx/emqx:5.5.1 (проверен на платформе: заводится, логи в
|
||||||
# а в базовом emqx/emqx:5.5.1 зашито 7 EXPOSE-портов (1883/4370/5369/8083/8084/
|
# stdout). Добавляем только наш emqx.conf (auth/ACL, listeners, логи).
|
||||||
# 8883/18083), которые невозможно убрать из дочернего Dockerfile. Поэтому здесь
|
# ⚠️ У образа 7 EXPOSE-портов (наследие базы) — deck-UI при СОЗДАНИИ требует
|
||||||
# ОДИН EXPOSE 8083 — иначе deck-UI требует несуществующее поле applicationUsePort.
|
# один порт; в НАШЕМ кластере используется kubectl set image, вопрос одного
|
||||||
|
# EXPOSE для чужого кластера — отдельная задача (тикет Nubes).
|
||||||
|
|
||||||
FROM debian:bookworm-slim
|
FROM emqx/emqx:5.5.1
|
||||||
|
|
||||||
RUN apt-get update \
|
COPY emqx.conf /opt/emqx/etc/emqx.conf
|
||||||
&& 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
|
|
||||||
|
|
||||||
EXPOSE 8083
|
EXPOSE 8083
|
||||||
|
|
||||||
ENTRYPOINT ["/usr/bin/emqx"]
|
|
||||||
CMD ["foreground"]
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
# EMQX-контейнер для IoT (образ naeel/iot-emqx).
|
# EMQX-контейнер для IoT (образ naeel/iot-emqx).
|
||||||
|
|
||||||
VERSION ?= v0.1.4
|
VERSION ?= v0.2.0
|
||||||
IMAGE ?= naeel/iot-emqx
|
IMAGE ?= naeel/iot-emqx
|
||||||
|
|
||||||
.PHONY: docker-build docker-push
|
.PHONY: docker-build docker-push
|
||||||
|
|||||||
+14
-2
@@ -16,7 +16,7 @@ authentication = [
|
|||||||
backend = http
|
backend = http
|
||||||
enable = true
|
enable = true
|
||||||
method = post
|
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 {
|
body {
|
||||||
username = "${username}"
|
username = "${username}"
|
||||||
password = "${password}"
|
password = "${password}"
|
||||||
@@ -46,7 +46,7 @@ authorization {
|
|||||||
type = http
|
type = http
|
||||||
enable = true
|
enable = true
|
||||||
method = post
|
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 {
|
body {
|
||||||
username = "${username}"
|
username = "${username}"
|
||||||
clientid = "${clientid}"
|
clientid = "${clientid}"
|
||||||
@@ -69,6 +69,18 @@ mqtt {
|
|||||||
retain_available = false
|
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).
|
## Listeners: WebSocket — единственный порт контейнера платформы (8083).
|
||||||
## TCP 1883 остаётся для диагностики (не экспонируется платформой).
|
## TCP 1883 остаётся для диагностики (не экспонируется платформой).
|
||||||
listeners.tcp.default {
|
listeners.tcp.default {
|
||||||
|
|||||||
Reference in New Issue
Block a user