feat: перенос IoT managed service из sless в отдельную репу
Компоненты: - iot-operator: controller-manager (IoTDevice CRD) + REST API (порт 9090) - mqtt-bridge: MQTT (EMQX) → Kafka bridge - kafka-consumer: Kafka → Postgres pipeline Модуль: gitea.services.ngcloud.ru/Nail/IoT Все 3 бинарника собираются, import paths адаптированы.
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
# IoT MVP — E2E Demo
|
||||
|
||||
## Что делает этот пример
|
||||
|
||||
Показывает полную цепочку:
|
||||
|
||||
```
|
||||
IoT Device (mosquitto_pub)
|
||||
→ MQTT PUBLISH → EMQX (HTTP auth → sless-operator)
|
||||
→ [iot-mqtt-bridge подписан на "+/telemetry/+"]
|
||||
→ RabbitMQ queue "iot.{namespace}.telemetry"
|
||||
→ event-dispatcher
|
||||
→ POST → serverless function (handler.py)
|
||||
```
|
||||
|
||||
## Предусловия
|
||||
|
||||
1. EMQX запущен: `kubectl apply -f deployments/k8s/emqx.yaml`
|
||||
2. iot-mqtt-bridge запущен: `kubectl apply -f deployments/k8s/iot-mqtt-bridge.yaml`
|
||||
3. event-dispatcher запущен (уже должен работать)
|
||||
|
||||
## Запуск
|
||||
|
||||
```bash
|
||||
# Установить переменные
|
||||
export API_TOKEN="your-jwt-token"
|
||||
export NAMESPACE="sless-abc123def456" # твой namespace
|
||||
|
||||
# Инициализировать
|
||||
terraform init
|
||||
terraform apply \
|
||||
-var="namespace=${NAMESPACE}" \
|
||||
-var="api_token=${API_TOKEN}"
|
||||
|
||||
# Получить credentials
|
||||
MQTT_USER=$(terraform output -raw mqtt_username)
|
||||
MQTT_PASS=$(terraform output -raw mqtt_password)
|
||||
MQTT_TOPIC=$(terraform output -raw mqtt_topic)
|
||||
|
||||
echo "MQTT user: ${MQTT_USER}"
|
||||
echo "MQTT topic: ${MQTT_TOPIC}"
|
||||
```
|
||||
|
||||
## Отправить тестовое сообщение
|
||||
|
||||
```bash
|
||||
# Через mosquitto_pub (из пода внутри кластера)
|
||||
kubectl run mqtt-test --rm -i --image=eclipse-mosquitto --restart=Never -- \
|
||||
mosquitto_pub \
|
||||
-h emqx.sless.svc \
|
||||
-p 1883 \
|
||||
-u "${MQTT_USER}" \
|
||||
-P "${MQTT_PASS}" \
|
||||
-t "${MQTT_TOPIC}" \
|
||||
-m '{"temperature": 22.5, "humidity": 65, "unit": "celsius"}'
|
||||
```
|
||||
|
||||
## Проверить что функция вызвалась
|
||||
|
||||
```bash
|
||||
# Логи event-dispatcher
|
||||
kubectl logs -n sless deployment/event-dispatcher -f
|
||||
|
||||
# Логи функции (через invocations API)
|
||||
curl -H "Authorization: Bearer ${API_TOKEN}" \
|
||||
https://sless.kube5s.ru/v1/namespaces/${NAMESPACE}/functions/iot-telemetry-handler/invocations
|
||||
```
|
||||
|
||||
## Структура файлов
|
||||
|
||||
```
|
||||
examples/IOT/
|
||||
main.tf # Terraform: function + trigger + iot_device
|
||||
handler.py # Python обработчик телеметрии
|
||||
README.md # Этот файл
|
||||
```
|
||||
|
||||
## Известные ограничения MVP
|
||||
|
||||
- `sless_iot_device` Terraform ресурс требует реализации в terraform-provider-sless (Этап 6)
|
||||
- EMQX TLS отключён — включить для prod (настроить cert-manager secret)
|
||||
- iot-mqtt-bridge credentials создаются вручную (автоматизировать в будущем)
|
||||
- Нет обратного канала: Cloud → Device команды (Device Shadow — вне MVP)
|
||||
Reference in New Issue
Block a user