- 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
8.4 KiB
8.4 KiB
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_*.go→internal/api/handler/(REST handlers)internal/api/ui/iot-*.html→internal/api/ui/(embedded HTML)internal/api/middleware/→internal/api/middleware/(auth, logging)deployments/k8s/iot-*.yaml+kafka.yaml→deployments/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 бинарника, distrolessMakefile— 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 тест
Найдены и исправлены баги:
- MQTTAuth: Get по Name=deviceID — заменено на List + фильтр по Spec.DeviceID
- 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