Files
IoT/doc/progress.md
T
Naeel f0cc6df9a6 fix: MQTTAuth device lookup by Spec.DeviceID + PG15+ GRANT (v0.2.5)
- MQTTAuth: replaced Get(Name=deviceID) with List+filter by Spec.DeviceID
  (K8s object name != deviceID — caused deny for all devices)
- EnsureTenantDB: added GRANT role TO CURRENT_USER before CREATE DATABASE OWNER
  (PG15+ requires SET ROLE privileges for target owner)
- Image: naeel/iot-operator:v0.2.5
- E2E test passed: device create → MQTT publish → SQS → Postgres → REST API
2026-04-12 19:00:56 +03:00

8.4 KiB
Raw Blame History

IoT Managed Service — Трекер прогресса

2026-04-12: Перенос из sless в отдельную репу

Выполнено

  • Создана репа https://gitea.services.ngcloud.ru/Nail/IoT
  • Go модуль: gitea.services.ngcloud.ru/Nail/IoT
  • Перенесены все IoT-компоненты из sless:
    • iot/api/v1alpha1/api/v1alpha1/ (CRD types: IoTDevice)
    • iot/controllers/controllers/ (IoTDevice reconciler)
    • iot/cmd/mqtt-bridge/cmd/mqtt-bridge/ (MQTT→Kafka)
    • iot/cmd/kafka-consumer/cmd/kafka-consumer/ (Kafka→Postgres)
    • internal/storage/iotpg/internal/storage/iotpg/ (per-tenant PG)
    • internal/api/handler/iot_*.gointernal/api/handler/ (REST handlers)
    • internal/api/ui/iot-*.htmlinternal/api/ui/ (embedded HTML)
    • internal/api/middleware/internal/api/middleware/ (auth, logging)
    • deployments/k8s/iot-*.yaml + kafka.yamldeployments/k8s/
    • config/crd/bases/config/crd/bases/
    • doc/iot/, examples/IOT/doc/, examples/
  • Созданы новые файлы:
    • cmd/iot-operator/main.go — точка входа (controller-manager + REST API)
    • internal/api/handler/handler.go — упрощённый Handler (без S3/PG от sless)
    • internal/api/router.go — только IoT маршруты
    • Dockerfile — multi-stage build, 3 бинарника, distroless
    • Makefile — build/docker/deploy команды
    • .gitignore
    • .github/copilot-instructions.md
  • Все import paths заменены: sless/iot/...Nail/IoT/...
  • Все 3 бинарника собираются без ошибок (go build ./...)
  • Запушено в Gitea

Следующие шаги

  • Docker build + push на Docker Hub (naeel/iot-operator)
  • Обновить k8s manifests для нового образа
  • Деплой в кластер
  • E2E тест: создание устройства → MQTT → Kafka → Postgres → API
  • Убрать IoT-код из sless (опционально, после подтверждения что всё работает)

2026-04-12: Замена Kafka → shared-SQS + деплой в новый кластер

Выполнено

  • Создана ветка feature/replace-kafka-with-sqs
  • Документировано решение: doc/decisions/2026-04-12-replace-kafka-with-sqs.md
  • mqtt-bridge (cmd/mqtt-bridge/main.go): Kafka Writer → AWS SDK SQS SendMessage
  • sqs-consumer (cmd/sqs-consumer/main.go): новый — заменяет kafka-consumer, SQS ReceiveMessage → Postgres
  • kafka-consumer (cmd/kafka-consumer/): удалён из кода
  • admin stats (internal/api/handler/iot_admin_stats_handler.go): Kafka lag → SQS GetQueueAttributes
  • handler.go: убрано поле KafkaBrokers
  • iot-operator/main.go: убрана передача KAFKA_BROKERS
  • go.mod: убран segmentio/kafka-go, добавлен aws-sdk-go-v2 (v1.41.5 + sqs v1.42.25)
  • Dockerfile: kafka-consumer → sqs-consumer
  • Makefile: build-consumer → sqs-consumer
  • .gitignore: исправлен баг (паттерны без / игнорировали cmd/ директории)
  • go build ./... проходит на ВМ
  • Коммит и пуш в ветку

Деплой в кластер iot-naeel (новый кластер)

  • shared-SQS: создан tenant iot-service (t-96afe7e9f781f6ca), очередь iot-telemetry
  • Namespace sless создан
  • Secret iot-sqs-credentials создан
  • Secret iot-bridge-credentials создан
  • Postgres: переключён на managed PG17 (тот же что SQS billing)
  • Secret iot-postgres-secret создан (DSN → managed PG)
  • Docker: собран и запушен naeel/iot-operator:v0.2.0 в Docker Hub
  • Deployment YAML: обновлены image на Docker Hub, убраны imagePullSecrets
  • EMQX: задеплоен (emqx.yaml + emqx-ws-ingress.yaml, адаптирован из sless)
  • iot-operator: задеплоен (новый iot-operator.yaml с RBAC)
  • CRD iotdevices.iot.kube5s.ru установлен
  • iot-mqtt-bridge: задеплоен, Running
  • iot-sqs-consumer: задеплоен, Running — подключился к PG и SQS
  • cert-manager: выпускает TLS для iot.kube5s.ru
  • Коммит и пуш

Что работает

  • Все 4 пода Running 1/1
  • iot-operator: controller стартовал, MQTT auth/acl обрабатывает запросы от EMQX
  • sqs-consumer: подключился к Postgres и SQS, polling loop запущен
  • mqtt-bridge: подключён к EMQX и SQS, SQS queue resolved
  • EMQX: MQTT :1883, WS :8083, dashboard :18083

Следующие шаги

  • E2E тест: создание устройства → MQTT → SQS → Postgres → API
  • Нагрузочный тест
  • Мерж ветки в master
  • Убрать IoT-код из sless (опционально)

2026-04-12: Документация v0.2.3

Выполнено

  • Аудит документации из репозитория sless (thinking 04-04/05/06/09, decisions, progress, api, examples)
  • Аудит документации в IoT репозитории (deployment.md, overview.md, endpoints.md, mvp-plan.md)
  • Анализ расхождений — определены устаревшие секции (Kafka, RabbitMQ)
  • Решение: старые документы НЕ удалять, новые создавать отдельно
  • Создан doc/deployment-v0.2.3.md (295 строк) — актуальная инструкция деплоя
  • Создан doc/architecture/current-v0.2.3.md (256 строк) — полная архитектура v0.2.3
  • Создан doc/api/endpoints-v0.2.3.md (~300 строк) — полная документация REST API
  • Создан doc/run-and-test.md (~180 строк) — руководство по запуску и E2E тесту
  • Обновлён doc/progress.md
  • Дописан doc/thinking/2026-04-12.md — лог мышления сессии

Баг-фиксы v0.2.1—v0.2.3

  • v0.2.1: mqtt-bridge — bridge auth fix (BridgeUsername/BridgePassword проверяется ДО парсинга username)
  • v0.2.3: финальный образ со всеми фиксами

Документация (сессия 2, вечер)

Проведён полный аудит IoT-документации из sless репы. Прочитано:

  • sless/doc/thinking/2026-04-04.md (681 строк) — архитектура, первый деплой
  • sless/doc/thinking/2026-04-05.md (178 строк) — телеметрия, MQTTX, UX
  • sless/doc/thinking/2026-04-06.md (613 строк) — Kafka pipeline, 8 тестов
  • sless/doc/thinking/2026-04-09.md (349 строк) — shared-sqs, TenantStore
  • sless/doc/iot/deployment.md — инженерный документ деплоя (RabbitMQ)
  • sless/doc/progress.md — IoT-записи
  • sless/examples/IOT/ — E2E demo

Созданы НОВЫЕ актуальные файлы (старые НЕ тронуты — база знаний):

  • doc/deployment-v0.2.3.md — полная процедура деплоя (SQS, managed PG, bridge auth)
  • doc/architecture/current-v0.2.3.md — актуальная архитектура (без Kafka/RabbitMQ)
  • doc/api/endpoints-v0.2.3.md — все API эндпоинты с примерами запросов/ответов
  • doc/run-and-test.md — как запустить и протестировать E2E

2026-04-12 — v0.2.5: баг-фиксы и E2E тест

Найдены и исправлены баги:

  1. MQTTAuth: Get по Name=deviceID — заменено на List + фильтр по Spec.DeviceID
  2. PG15+ GRANT: добавлен GRANT role TO CURRENT_USER перед CREATE DATABASE ... OWNER

E2E тест пройден:

  • Устройство создано через REST API (201)
  • MQTT CONNECT + PUBLISH через EMQX — OK
  • mqtt-bridge → SQS forwarding — OK
  • sqs-consumer → Postgres (tenant DB created + telemetry saved) — OK
  • REST API GET /telemetry — 2 записи с payload

Docker Hub: naeel/iot-operator:v0.2.5