Files
tf_examples/iot-rmq-demo

IoT Demo — Nubes Cloud

Демо-стенд «Умный дом»: 6 сервисов Nubes Cloud, развёртывание через Terraform.

Пайплайн данных

Эмуляция IoT-датчиков «Умного дома»: температура, влажность, энергопотребление.

Архитектура IoT Demo

# Сервис Тип Nubes Что делает
1 Producer Node.js (22) Генерирует случайные события от 8 датчиков (3 типа: температура °C, влажность %, энергопотребление kW). Раз в 3 секунды отправляет JSON-событие в очередь RabbitMQ iot-events.
2 RabbitMQ RabbitMQ Очередь сообщений AMQP. Держит события, пока Consumer не заберёт. durable: true — сообщения переживают рестарт брокера.
3 Consumer Node.js (22) Читает очередь RabbitMQ. Каждое событие пишет параллельно в Redis (оперативный кэш: последние значения + счётчики + лента) и MongoDB (постоянный архив с TTL 7 дней).
4 Redis Redis Кэш для Dashboard: iot:latest (hash — актуальные значения датчиков), iot:counters (hash — счётчики по типам), iot:recent (zset — лента 1000 событий).
5 MongoDB MongoDB Архив всех событий в коллекции iot_events. TTL-индекс на 7 дней — автоочистка.
6 Dashboard Node.js (22) Веб-интерфейс. Читает только Redis, отдаёт JSON-API и HTML с графиками Chart.js (bar chart значений, doughnut счётчиков, таблица событий). Автообновление каждые 3 сек.

Все соединения между сервисами — внутренние, через K8s Service (.svc.cluster.local). Наружу торчат только HTTP-эндпоинты Node.js-приложений.

Быстрый старт

1. Скопировать и заполнить terraform.tfvars

cp terraform.tfvars.example terraform.tfvars
api_token    = "xxx"                                     # API-токен из ЛК Nubes
realm        = "k8s-4-sandbox-nubes-ru"                  # Ваш K8s-кластер
api_endpoint = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"

2. Заменить обязательные параметры в locals.tf

Параметр Что писать
prod_git_path URL вашего форка producer в Gitea
cons_git_path URL вашего форка consumer в Gitea
dash_git_path URL вашего форка dashboard в Gitea
prod_domain Уникальный поддомен для producer
cons_domain Уникальный поддомен для consumer
dash_domain Уникальный поддомен для dashboard
prod_resource_name Имя инстанса producer в кабинете Nubes
cons_resource_name Имя инстанса consumer
dash_resource_name Имя инстанса dashboard

⚠️ Домены (поддомены .nodejsk8s.dev.nubes.ru) должны быть уникальны в рамках кластера. Занятый домен — ошибка при деплое.

3. Деплой

terraform init
terraform apply

4. Проверка

curl https://<prod_domain>.nodejsk8s.dev.nubes.ru  # → {"events_sent": N, "errors": 0}
curl https://<cons_domain>.nodejsk8s.dev.nubes.ru   # → {"consumed": N, "errors": 0}
# Dashboard: открыть https://<dash_domain>.nodejsk8s.dev.nubes.ru в браузере

Репозитории приложений

Код каждого приложения — отдельный репо. Склонируйте/форкните к себе в Gitea.

Приложение Репо Стек
Producer Nail/tf-iot-producer Node.js + amqplib
Consumer Nail/tf-iot-consumer Node.js + amqplib + redis + mongodb
Dashboard Nail/tf-iot-dashboard Node.js + express + redis + Chart.js

Файлы

Файл Назначение
main.tf Провайдер, переменные
locals.tf Все настройки — менять здесь
infra.tf RabbitMQ + Redis + MongoDB
producer.tf Node.js producer
consumer.tf Node.js consumer
dashboard.tf Node.js dashboard
terraform.tfvars.example Шаблон секретов

Примечания

  • MongoDB без пароля — для демо. В проде настроить аутентификацию.
  • adopt_existing_on_create = true — повторный apply подхватывает существующие инстансы.
  • suspend_on_destroy = truedestroy не удаляет, а засыпает (suspend).
  • Все внутренние соединения — K8s Service (.svc.cluster.local).