feat: EMQX-образ для платформы (naeel/iot-emqx) — конфиг вшит, auth/ACL URL через env
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
# EMQX для IoT на платформе Nubes (контейнер «Простой HTTP»).
|
||||
# Образ: naeel/iot-emqx (Docker Hub, публичный).
|
||||
# Единственный экспонируемый порт — 8083 (MQTT over WebSocket).
|
||||
# Auth/ACL URL монолита задаются env (см. HISTORY раздел 16).
|
||||
|
||||
FROM emqx/emqx:5.5.1
|
||||
|
||||
COPY emqx.conf /opt/emqx/etc/emqx.conf
|
||||
|
||||
# Заглушки auth/ACL URL — реальный адрес монолита задаётся env в deck-UI
|
||||
# или kubectl set env после создания обоих контейнеров.
|
||||
ENV EMQX_AUTHENTICATION__1__URL=http://iot-service:9090/internal/mqtt/auth \
|
||||
EMQX_AUTHORIZATION__SOURCES__1__URL=http://iot-service:9090/internal/mqtt/acl
|
||||
|
||||
EXPOSE 8083 18083
|
||||
@@ -0,0 +1,13 @@
|
||||
# EMQX-контейнер для IoT (образ naeel/iot-emqx).
|
||||
|
||||
VERSION ?= v0.1.0
|
||||
IMAGE ?= naeel/iot-emqx
|
||||
|
||||
.PHONY: docker-build docker-push
|
||||
|
||||
docker-build:
|
||||
docker build -t $(IMAGE):$(VERSION) -t $(IMAGE):latest .
|
||||
|
||||
docker-push:
|
||||
docker push $(IMAGE):$(VERSION)
|
||||
docker push $(IMAGE):latest
|
||||
@@ -0,0 +1,90 @@
|
||||
## EMQX 5.x — конфиг для контейнера IoT на платформе Nubes.
|
||||
## Вшит в образ naeel/iot-emqx. Auth/ACL URL переопределяются env-переменными
|
||||
## (EMQX_AUTHENTICATION__1__URL, EMQX_AUTHORIZATION__SOURCES__1__URL) в deck-UI
|
||||
## или kubectl set env — адрес монолита становится известен после его создания.
|
||||
|
||||
node {
|
||||
name = "emqx@127.0.0.1"
|
||||
cookie = "iot-emqx-cookie-mvp"
|
||||
data_dir = "/opt/emqx/data"
|
||||
}
|
||||
|
||||
## HTTP Auth — монолит проверяет устройства в PostgreSQL (iot_devices).
|
||||
authentication = [
|
||||
{
|
||||
mechanism = password_based
|
||||
backend = http
|
||||
enable = true
|
||||
method = post
|
||||
url = "http://iot-service:9090/internal/mqtt/auth"
|
||||
body {
|
||||
username = "${username}"
|
||||
password = "${password}"
|
||||
clientid = "${clientid}"
|
||||
}
|
||||
headers {
|
||||
"content-type" = "application/json"
|
||||
}
|
||||
connect_timeout = 5s
|
||||
request_timeout = 5s
|
||||
pool_size = 8
|
||||
}
|
||||
]
|
||||
|
||||
## ACL — монолит разрешает pub/sub по топикам устройств.
|
||||
## no_match = deny: недоступность backend = запрет.
|
||||
authorization {
|
||||
no_match = deny
|
||||
deny_action = disconnect
|
||||
cache {
|
||||
enable = true
|
||||
max_size = 32
|
||||
ttl = 1m
|
||||
}
|
||||
sources = [
|
||||
{
|
||||
type = http
|
||||
enable = true
|
||||
method = post
|
||||
url = "http://iot-service:9090/internal/mqtt/acl"
|
||||
body {
|
||||
username = "${username}"
|
||||
clientid = "${clientid}"
|
||||
action = "${action}"
|
||||
topic = "${topic}"
|
||||
}
|
||||
headers {
|
||||
"content-type" = "application/json"
|
||||
}
|
||||
connect_timeout = 5s
|
||||
request_timeout = 5s
|
||||
pool_size = 8
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
mqtt {
|
||||
max_packet_size = 1MB
|
||||
max_topic_levels = 10
|
||||
retain_available = false
|
||||
}
|
||||
|
||||
## Listeners: WebSocket — единственный порт контейнера платформы (8083).
|
||||
## TCP 1883 остаётся для диагностики (не экспонируется платформой).
|
||||
listeners.tcp.default {
|
||||
bind = "0.0.0.0:1883"
|
||||
max_connections = 1024
|
||||
}
|
||||
|
||||
listeners.ws.default {
|
||||
bind = "0.0.0.0:8083"
|
||||
mqtt_path = "/mqtt"
|
||||
max_connections = 512
|
||||
}
|
||||
|
||||
## Dashboard — для диагностики через port-forward (наружу не экспонируется).
|
||||
dashboard {
|
||||
listeners.http {
|
||||
bind = 18083
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user