⛔⛔⛔ ЛЕГАСИ (2026-08-16) — СТАРЫЙ IoT (k8s-деплой). НЕ ПРИНИМАТЬ ВО ВНИМАНИЕ. Актуальное: HISTORY/2026-08-16-session-log.md
IoT Managed Service — Архитектура
Общая схема
Компоненты
| Компонент |
Бинарник |
Порт |
Назначение |
| iot-operator |
cmd/iot-operator |
:9090 (API), :8081 (health) |
Controller-manager + REST API |
| mqtt-bridge |
cmd/mqtt-bridge |
— |
MQTT→Kafka bridge |
| kafka-consumer |
cmd/kafka-consumer |
— |
Kafka→Postgres pipeline |
CRD
- IoTDevice (
iot.kube5s.ru/v1alpha1)
- Создание: пользователь через API / Terraform
- Controller генерирует MQTT credentials → k8s Secret
- Secret удаляется каскадно через OwnerReference
Хранение
- IoT Postgres — отдельный от sless PG
- Management DB:
iot_platform (таблица tenant_credentials)
- Per-tenant DB:
tenant_{namespace} (таблица iot_telemetry)
Аутентификация
- REST API (/v1/): Bearer JWT (middleware.Auth)
- MQTT Auth (/internal/): вызывается EMQX, без JWT
- Admin (/iot-admin/stats): ADMIN_STATS_TOKEN
Docker образ
naeel/iot-operator (Docker Hub)
- Все 3 бинарника в одном образе
command: ["/iot-operator"] или ["/mqtt-bridge"] или ["/kafka-consumer"]
Актуальная архитектура (2026-04-12)
Kafka заменён на shared-SQS. Postgres заменён на managed. Новый кластер iot-naeel.
Текущая схема
Компоненты (актуальные)
| Компонент |
Бинарник |
Порт |
Назначение |
| iot-operator |
cmd/iot-operator |
:9090 (API), :8080 (metrics), :8081 (health) |
Controller-manager + REST API |
| mqtt-bridge |
cmd/mqtt-bridge |
— |
MQTT → shared-SQS bridge |
| sqs-consumer |
cmd/sqs-consumer |
— |
shared-SQS → Postgres pipeline |
Инфраструктура
| Сервис |
Тип |
Namespace |
Описание |
| EMQX 5.5.1 |
В кластере |
sless |
MQTT-брокер, HTTP auth/acl → iot-operator |
| shared-SQS |
В кластере |
shared-sqs |
AWS SQS-совместимая очередь, endpoint https://qu.kube5s.ru |
| PostgreSQL 17 |
Managed (оператор) |
dc5db45d-... |
per-tenant DB, тот же инстанс что и SQS billing |
| cert-manager |
В кластере |
cert-manager |
TLS сертификаты для iot.kube5s.ru |
| nginx-ingress |
В кластере |
ingress |
WSS/HTTPS проксирование |
Секреты в namespace sless
| Secret |
Ключи |
Источник |
| iot-sqs-credentials |
SQS_ENDPOINT, SQS_ACCESS_KEY, SQS_SECRET_KEY |
shared-SQS tenant iot-service |
| iot-postgres-secret |
POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB, IOT_PG_DSN |
Managed PG |
| iot-bridge-credentials |
MQTT_USERNAME, MQTT_PASSWORD |
Для mqtt-bridge → EMQX |
Docker образ (актуальный)
naeel/iot-operator:v0.2.0 (Docker Hub)
- Все 3 бинарника в одном образе
command: ["/iot-operator"] или ["/mqtt-bridge"] или ["/sqs-consumer"]
- Базовый:
gcr.io/distroless/static:nonroot
Кластер
- Имя:
iot-naeel
- API:
https://185.247.187.149:6443
- Ingress IP:
185.247.187.151
- DNS:
iot.kube5s.ru → 185.247.187.147
Актуальная архитектура (2026-04-12)
Kafka заменён на shared-SQS. Postgres заменён на managed. Новый кластер iot-naeel.
Текущая схема
Компоненты (актуальные)
| Компонент |
Бинарник |
Порт |
Назначение |
| iot-operator |
cmd/iot-operator |
:9090 (API), :8080 (metrics), :8081 (health) |
Controller-manager + REST API |
| mqtt-bridge |
cmd/mqtt-bridge |
— |
MQTT → shared-SQS bridge |
| sqs-consumer |
cmd/sqs-consumer |
— |
shared-SQS → Postgres pipeline |
Инфраструктура
| Сервис |
Тип |
Namespace |
Описание |
| EMQX 5.5.1 |
В кластере |
sless |
MQTT-брокер, HTTP auth/acl → iot-operator |
| shared-SQS |
В кластере |
shared-sqs |
AWS SQS-совместимая очередь, endpoint https://qu.kube5s.ru |
| PostgreSQL 17 |
Managed (оператор) |
dc5db45d-... |
per-tenant DB, тот же инстанс что и SQS billing |
| cert-manager |
В кластере |
cert-manager |
TLS сертификаты для iot.kube5s.ru |
| nginx-ingress |
В кластере |
ingress |
WSS/HTTPS проксирование |
Секреты в namespace sless
| Secret |
Ключи |
Источник |
| iot-sqs-credentials |
SQS_ENDPOINT, SQS_ACCESS_KEY, SQS_SECRET_KEY |
shared-SQS tenant iot-service |
| iot-postgres-secret |
POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB, IOT_PG_DSN |
Managed PG |
| iot-bridge-credentials |
MQTT_USERNAME, MQTT_PASSWORD |
Для mqtt-bridge → EMQX |
Docker образ (актуальный)
naeel/iot-operator:v0.2.0 (Docker Hub)
- Все 3 бинарника в одном образе
command: ["/iot-operator"] или ["/mqtt-bridge"] или ["/sqs-consumer"]
- Базовый:
gcr.io/distroless/static:nonroot
Кластер
- Имя:
iot-naeel
- API:
https://185.247.187.149:6443
- Ingress IP:
185.247.187.151
- DNS:
iot.kube5s.ru → 185.247.187.147