# IoT Demo — Nubes Cloud Разворачивание демо-стенда «Умный дом» из 6 сервисов Nubes Cloud через Terraform. ## Архитектура ``` Producer (Node.js) → RabbitMQ → Consumer (Node.js) → Redis + MongoDB → Dashboard (Node.js + Chart.js) ``` | Сервис | Тип Nubes | Роль | |---|---|---| | `iot-rmq` | RabbitMQ | Очередь сообщений | | `iot-rds` | Redis | Кэш дашборда | | `iot-mgo` | MongoDB | Постоянный архив | | `iot-prod` | Node.js (22) | Генератор IoT-событий | | `iot-cons` | Node.js (22) | Обработчик очереди | | `iot-dash` | Node.js (22) | Веб-дашборд | ## Быстрый старт ### 1. Подготовка ```bash # Склонируйте репозиторий git clone <этот-репо> / cd tf_examples/iot-rmq-demo # Скопируйте и заполните переменные cp terraform.tfvars.example terraform.tfvars ``` ### 2. Что обязательно ЗАМЕНИТЬ в `locals.tf` Файл `locals.tf` — центральное место всех настроек. Откройте и измените: | Параметр | Где | Что писать | Пример | |---|---|---|---| | `prod_git_path` | locals.tf | URL **вашего** форка producer в Gitea | `https://gitea.../МОЙ_ЛОГИН/tf-iot-producer.git` | | `cons_git_path` | locals.tf | URL **вашего** форка consumer | `https://gitea.../МОЙ_ЛОГИН/tf-iot-consumer.git` | | `dash_git_path` | locals.tf | URL **вашего** форка dashboard | `https://gitea.../МОЙ_ЛОГИН/tf-iot-dashboard.git` | | `prod_domain` | locals.tf | **Уникальный** поддомен для producer | `my-iot-prod` | | `cons_domain` | locals.tf | **Уникальный** поддомен для consumer | `my-iot-cons` | | `dash_domain` | locals.tf | **Уникальный** поддомен для dashboard | `my-iot-dash` | | `prod_resource_name` | locals.tf | Имя инстанса в кабинете Nubes | `my-iot-prod` | | `cons_resource_name` | locals.tf | Имя инстанса | `my-iot-cons` | | `dash_resource_name` | locals.tf | Имя инстанса | `my-iot-dash` | > **⚠️ ВАЖНО про домены:** домены (поддомены `.nodejsk8s.dev.nubes.ru`) должны быть **уникальными** в рамках кластера. Если домен уже занят — деплой упадёт с ошибкой. Придумайте свои: `myproject-prod`, `demo-iot-cons`, etc. ### 3. Что заполнить в `terraform.tfvars` ```hcl api_token = "xxx" # API-токен из ЛК Nubes realm = "k8s-4-sandbox-nubes-ru" # Ваш K8s-кластер api_endpoint = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc" # test или prod ``` ### 4. Форкнуть репозитории приложений Код приложений лежит в [`apps/`](../../apps/). Каждое приложение — отдельный Git-репо. **Порядок действий для каждого из трёх приложений (producer, consumer, dashboard):** ```bash cd apps/iot-producer # (или iot-consumer, iot-dashboard) # Создать репо в своём Gitea # https://gitea.services.ngcloud.ru → Новый репозиторий → tf-iot-producer git remote add my https://gitea.services.ngcloud.ru/МОЙ_ЛОГИН/tf-iot-producer.git git push my main # Скопировать хеш последнего коммита: git rev-parse HEAD ``` Полученный хеш вставить в `locals.tf` → `prod_git_revision` (и аналогично для consumer/dashboard). Или просто указать `"main"` — тогда Nubes будет деплоить последний коммит ветки. ### 5. Деплой ```bash terraform init terraform plan # проверить что всё ok terraform apply # развернуть (≈3–5 минут) ``` ### 6. Проверка ```bash # Producer — отправил ли события? curl https://.nodejsk8s.dev.nubes.ru # → {"events_sent": 150, "errors": 0} # Consumer — обработал ли? curl https://.nodejsk8s.dev.nubes.ru # → {"consumed": 150, "errors": 0} # Dashboard — открыть в браузере: # https://.nodejsk8s.dev.nubes.ru ``` ## Файлы | Файл | Назначение | |---|---| | `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 = true`** — при `destroy` инстансы не удаляются, а засыпают (suspend). - Все внутренние соединения — через K8s Service (`.svc.cluster.local`), трафик не выходит наружу. ## Репозитории приложений | Приложение | Репо (шаблон) | Описание | |---|---|---| | Producer | [`apps/iot-producer`](../../apps/iot-producer) | Node.js + amqplib | | Consumer | [`apps/iot-consumer`](../../apps/iot-consumer) | Node.js + amqplib + redis + mongodb | | Dashboard | [`apps/iot-dashboard`](../../apps/iot-dashboard) | Node.js + express + redis + Chart.js |