93 lines
3.9 KiB
Markdown
93 lines
3.9 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. Скопировать и заполнить `terraform.tfvars`
|
|
|
|
```bash
|
|
cp terraform.tfvars.example 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"
|
|
```
|
|
|
|
### 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. Деплой
|
|
|
|
```bash
|
|
terraform init
|
|
terraform apply
|
|
```
|
|
|
|
### 4. Проверка
|
|
|
|
```bash
|
|
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`](https://gitea.services.ngcloud.ru/Nail/tf-iot-producer) | Node.js + amqplib |
|
|
| Consumer | [`Nail/tf-iot-consumer`](https://gitea.services.ngcloud.ru/Nail/tf-iot-consumer) | Node.js + amqplib + redis + mongodb |
|
|
| Dashboard | [`Nail/tf-iot-dashboard`](https://gitea.services.ngcloud.ru/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 = true`** — `destroy` не удаляет, а засыпает (suspend).
|
|
- Все внутренние соединения — K8s Service (`.svc.cluster.local`).
|