IoT Demo: Terraform-конфиг для 6 сервисов Nubes Cloud
Producer -> RabbitMQ -> Consumer -> Redis+MongoDB -> Dashboard Подробная инструкция в README.md: - Что заменить в locals.tf (домены, git_path, ресурсы) - Как заполнить terraform.tfvars - Как форкнуть репо приложений
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
# 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 |
|
||||
Reference in New Issue
Block a user