Files
tf_examples/iot-rmq-demo/README.md
T
naeel 5511546534 IoT Demo: Terraform-конфиг для 6 сервисов Nubes Cloud
Producer -> RabbitMQ -> Consumer -> Redis+MongoDB -> Dashboard

Подробная инструкция в README.md:
- Что заменить в locals.tf (домены, git_path, ресурсы)
- Как заполнить terraform.tfvars
- Как форкнуть репо приложений
2026-07-22 10:19:24 +04:00

128 lines
5.8 KiB
Markdown

# 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://<prod_domain>.nodejsk8s.dev.nubes.ru
# → {"events_sent": 150, "errors": 0}
# Consumer — обработал ли?
curl https://<cons_domain>.nodejsk8s.dev.nubes.ru
# → {"consumed": 150, "errors": 0}
# Dashboard — открыть в браузере:
# https://<dash_domain>.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 |