# IoT Managed Service — Трекер прогресса ## 2026-04-12: Перенос из sless в отдельную репу ### Выполнено - [x] Создана репа https://gitea.services.ngcloud.ru/Nail/IoT - [x] Go модуль: `gitea.services.ngcloud.ru/Nail/IoT` - [x] Перенесены все 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/` - [x] Созданы новые файлы: - `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` - [x] Все import paths заменены: `sless/iot/...` → `Nail/IoT/...` - [x] Все 3 бинарника собираются без ошибок (go build ./...) - [x] Запушено в Gitea ### Следующие шаги - [ ] Docker build + push на Docker Hub (`naeel/iot-operator`) - [ ] Обновить k8s manifests для нового образа - [ ] Деплой в кластер - [ ] E2E тест: создание устройства → MQTT → Kafka → Postgres → API - [ ] Убрать IoT-код из sless (опционально, после подтверждения что всё работает) --- ## 2026-04-12: Замена Kafka → shared-SQS + деплой в новый кластер ### Выполнено - [x] Создана ветка `feature/replace-kafka-with-sqs` - [x] Документировано решение: `doc/decisions/2026-04-12-replace-kafka-with-sqs.md` - [x] **mqtt-bridge** (`cmd/mqtt-bridge/main.go`): Kafka Writer → AWS SDK SQS SendMessage - [x] **sqs-consumer** (`cmd/sqs-consumer/main.go`): новый — заменяет kafka-consumer, SQS ReceiveMessage → Postgres - [x] **kafka-consumer** (`cmd/kafka-consumer/`): удалён из кода - [x] **admin stats** (`internal/api/handler/iot_admin_stats_handler.go`): Kafka lag → SQS GetQueueAttributes - [x] **handler.go**: убрано поле KafkaBrokers - [x] **iot-operator/main.go**: убрана передача KAFKA_BROKERS - [x] go.mod: убран `segmentio/kafka-go`, добавлен `aws-sdk-go-v2` (v1.41.5 + sqs v1.42.25) - [x] Dockerfile: kafka-consumer → sqs-consumer - [x] Makefile: build-consumer → sqs-consumer - [x] .gitignore: исправлен баг (паттерны без `/` игнорировали `cmd/` директории) - [x] `go build ./...` проходит на ВМ - [x] Коммит и пуш в ветку ### Деплой в кластер iot-naeel (новый кластер) - [x] shared-SQS: создан tenant `iot-service` (t-96afe7e9f781f6ca), очередь `iot-telemetry` - [x] Namespace `sless` создан - [x] Secret `iot-sqs-credentials` создан - [x] Secret `iot-bridge-credentials` создан - [x] Postgres: переключён на managed PG17 (тот же что SQS billing) - [x] Secret `iot-postgres-secret` создан (DSN → managed PG) - [x] Docker: собран и запушен `naeel/iot-operator:v0.2.0` в Docker Hub - [x] Deployment YAML: обновлены image на Docker Hub, убраны imagePullSecrets - [x] EMQX: задеплоен (emqx.yaml + emqx-ws-ingress.yaml, адаптирован из sless) - [x] iot-operator: задеплоен (новый iot-operator.yaml с RBAC) - [x] CRD `iotdevices.iot.kube5s.ru` установлен - [x] iot-mqtt-bridge: задеплоен, Running - [x] iot-sqs-consumer: задеплоен, Running — подключился к PG и SQS - [x] cert-manager: выпускает TLS для iot.kube5s.ru - [x] Коммит и пуш ### Что работает - Все 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 (опционально)