Producer -> RabbitMQ -> Consumer -> Redis+MongoDB -> Dashboard Подробная инструкция в README.md: - Что заменить в locals.tf (домены, git_path, ресурсы) - Как заполнить terraform.tfvars - Как форкнуть репо приложений
128 lines
5.8 KiB
Markdown
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 |
|