Этап 2+4: internal/api/handler/iot_device_handler.go
- MQTTAuth: POST /internal/mqtt/auth (без JWT, для EMQX)
- CreateIoTDevice, ListIoTDevices, GetIoTDevice (c password), DeleteIoTDevice, UpdateIoTDevice
- crypto/subtle.ConstantTimeCompare против timing attacks
Этап 4: internal/api/router.go
- /v1/namespaces/{ns}/iot/devices CRUD
- /internal/mqtt/auth (без JWT middleware)
Этап 3: deployments/k8s/emqx.yaml
- EMQX 5.5.1, emqx.conf (HOCON) с HTTP auth backend
- Сервис exposure: 1883 (MQTT), 8083 (WS), 18083 (Dashboard)
Этап 3: iot/cmd/mqtt-bridge/main.go
- paho.mqtt.golang: подписка на +/telemetry/+
- amqp091-go: publish в iot.{namespace}.telemetry
- deployments/k8s/iot-mqtt-bridge.yaml
Этап 7: examples/IOT/ — E2E demo (main.tf, handler.py, README.md)
go.mod: добавлен github.com/eclipse/paho.mqtt.golang v1.5.1
go build ./... — ошибок нет
70 lines
2.4 KiB
YAML
70 lines
2.4 KiB
YAML
# Создано: 2026-04-04
|
|
# Deployment iot-mqtt-bridge — MQTT→RabbitMQ мост для IoT.
|
|
#
|
|
# Получает MQTT сообщения от EMQX (подписка на "+/telemetry/+")
|
|
# и публикует в RabbitMQ queue "iot.{namespace}.telemetry".
|
|
#
|
|
# Credentials для MQTT подключения берутся из Secret iot-bridge-credentials.
|
|
# Этот Secret нужно создать вручную ДО деплоя:
|
|
#
|
|
# # 1. Создать IoTDevice для bridge через API:
|
|
# curl -X POST .../v1/namespaces/sless-bridge/iot/devices \
|
|
# -d '{"name":"bridge","device_id":"bridge","enabled":true}'
|
|
#
|
|
# # 2. Получить credentials:
|
|
# MQTT_USERNAME=$(kubectl get secret iot-bridge -n sless-bridge -o jsonpath='{.data.mqtt-username}' | base64 -d)
|
|
# MQTT_PASSWORD=$(kubectl get secret iot-bridge -n sless-bridge -o jsonpath='{.data.mqtt-password}' | base64 -d)
|
|
#
|
|
# # 3. Создать Secret для bridge Deployment (один раз):
|
|
# kubectl create secret generic iot-bridge-credentials -n sless \
|
|
# --from-literal=MQTT_USERNAME="$MQTT_USERNAME" \
|
|
# --from-literal=MQTT_PASSWORD="$MQTT_PASSWORD"
|
|
#
|
|
# Применение: kubectl apply -f deployments/k8s/iot-mqtt-bridge.yaml
|
|
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: iot-mqtt-bridge
|
|
namespace: sless
|
|
labels:
|
|
app: iot-mqtt-bridge
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: iot-mqtt-bridge
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: iot-mqtt-bridge
|
|
spec:
|
|
containers:
|
|
- name: mqtt-bridge
|
|
image: pearlharbor.registryk8s.services.ngcloud.ru/naeel/sless-operator:latest
|
|
# TODO: отдельный образ iot-mqtt-bridge После сборки через Makefile
|
|
imagePullPolicy: Always
|
|
command: ["/iot-mqtt-bridge"]
|
|
env:
|
|
- name: MQTT_BROKER_URL
|
|
value: "tcp://emqx.sless.svc:1883"
|
|
- name: RABBITMQ_URL
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: sless-operator-secret
|
|
key: RABBITMQ_URL
|
|
optional: true
|
|
envFrom:
|
|
- secretRef:
|
|
name: iot-bridge-credentials
|
|
resources:
|
|
requests:
|
|
memory: "32Mi"
|
|
cpu: "25m"
|
|
limits:
|
|
memory: "64Mi"
|
|
cpu: "100m"
|
|
imagePullSecrets:
|
|
- name: sless-registry-auth
|