diff --git a/AGENTS.md b/AGENTS.md index a3fb8f1..685ae2f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -77,8 +77,6 @@ Terraform. Репозиторий — **эталонные примеры**, н | **`fullpipe_chain/`** | vDC → Edge → внешние IP → SNAT → vApp → ВМ → Штурвал (полная цепочка) | **рекомендовано использовать** — повторяет рабочую конфигурацию стенда | `/nubes-dev/curated/pipeline/vdc_edge_ip_snat/` | | **`Maria_CRUD/`** | MariaDB + три приложения (Lucee/Flask/Node.js) + HTTP-проверка | проверен на TEST-стенде | `/nubes-test/curated/mariadb/three_apps/` | | `CRUD/` | PostgreSQL + три приложения (Lucee/Flask/Node.js) | черновик (устаревшая схема, старый пин провайдера) — **с оговорками** | `/nubes-test/curated/crud/three_apps/` | -| `SHTURVAL_MGMT/` | management-кластер Kubernetes через сервис «Штурвал» (148) | черновик | — | -| `iot-rmq-demo/` | «Умный дом»: RabbitMQ + Redis + MongoDB + 3 Node.js-приложения | черновик | — | | `modify_resources/` | внешние IP на организации + SNAT на шлюзе (для уже существующих услуг) | черновик | — | **Что рекомендовать пользователю:** `fullpipe_chain` (полный цикл) или `Maria_CRUD` @@ -230,24 +228,7 @@ provider "nubes" { задаются в `locals.tf` (должны быть уникальны). Папка — черновик (старая плоская схема, старый пин провайдера): использовать осторожно, при вопросах сверяться с `Maria_CRUD`. -### 6.4. `SHTURVAL_MGMT` — management-кластер Kubernetes - -Создаёт `nubes_vc_mgmt_sthutrval_cluster` (сервис **148**) — management-кластер «Штурвал». -`terraform.tfvars`: `api_token`, `realm` (для dev-стенда `sandbox.nubes.ru`), `sizing_policy` -(`TKG 4CPU 8RAM` / `8CPU 16RAM` / `16CPU 32RAM`). Настройки кластера — в `locals.tf` -(`cp_count`, `app_version`, `worker_config`, IP-списки доступа). - -### 6.5. `iot-rmq-demo` — «Умный дом» (6 сервисов) - -Пайплайн: **Producer** (Node.js) → **RabbitMQ** (`iot-events`, durable) → **Consumer** (Node.js) -→ параллельно **Redis** (кэш: читает Dashboard) и **MongoDB** (архив с TTL 7 дней) → -**Dashboard** (графики Chart.js). Все связи внутренние (K8s Service), наружу — только HTTP. - -`terraform.tfvars`: `api_token`, `realm`, `api_endpoint` (закомментирован). В `locals.tf` -меняются: git-пути приложений, **уникальные** домены и имена инстансов. -Примечание: MongoDB без пароля (демо); `suspend_on_destroy = true` — `destroy` усыпляет. - -### 6.6. `modify_resources` — IP и SNAT на существующих услугах +### 6.4. `modify_resources` — IP и SNAT на существующих услугах Два ресурса для **уже созданных** в ЛК услуг: `nubes_vc_org_ip_allocation` (внешние IP на организации) и `nubes_vc_nsxt_snat` (SNAT на шлюзе). diff --git a/README.md b/README.md index 361624d..5c760b2 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,6 @@ terraform apply # подтвердить: yes |---|---|---| | `Maria_CRUD` | пример MariaDB + Lucee + Flask + Node.js + HTTP-проверка; пин провайдера `nubes-test` 3.1.0; проверен на TEST-стенде | | | `CRUD` | пример описан в документации, но сама папка — черновик: старая плоская схема, пин провайдера 5.1.16 (легаси-нумерация) | | -| `modify_resources`, `SHTURVAL_MGMT`, `iot-rmq-demo` | черновики от прошлых работ, не поддерживаются | — (примеры модификаторов IP/SNAT — в `fullpipe_chain`) | +| `modify_resources` | черновик от прошлых работ, не поддерживается | — (примеры модификаторов IP/SNAT — в `fullpipe_chain`) | Берите `fullpipe_chain` либо `Maria_CRUD`. diff --git a/SHTURVAL_MGMT/README.md b/SHTURVAL_MGMT/README.md deleted file mode 100644 index 04ad995..0000000 --- a/SHTURVAL_MGMT/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Штурвал — Management Kubernetes кластер - -Разворачивает management-кластер Kubernetes через сервис Nubes «Штурвал» (сервис 148). - -## Что нужно заполнить - -### `terraform.tfvars` — 3 значения - -Скопировать `terraform.tfvars.example` → `terraform.tfvars`, заполнить: - -| Параметр | Где брать | Пример | -|---|---|---| -| `api_token` | ЛК → Профиль → Токены → «Технический» | `eyJ...` | -| `realm` | Оставить `sandbox.nubes.ru` (dev-стенд) | `sandbox.nubes.ru` | -| `sizing_policy` | Зависит от доступных квот. Уточнить у администратора платформы | `TKG 4CPU 8RAM` | - -### `locals.tf` — настройки кластера (опционально) - -| Параметр | Что значит | -|---|---| -| `shturval_cluster_name` | Имя кластера | -| `shturval_app_version` | Версия Штурвала: `2.13.1`, `2.12.1` или `2.11.0` | -| `shturval_cp_sizing_policy` | Размер control plane: `TKG 4CPU 8RAM`, `TKG 8CPU 16RAM`, `TKG 16CPU 32RAM` | -| `shturval_cp_count` | Количество control plane нод: `1`, `3` или `5` | -| `shturval_worker_config` | Группы воркеров — JSON с `groupName`, `sizingPolicy`, `sizingDisk`, `count` | -| `shturval_api_access_ip_list` | IP-список для доступа к API. `[]` = без ограничений | -| `shturval_ingress_access_ip_list` | IP-список для доступа к Ingress. `[]` = без ограничений | - -## Состав - -| Файл | Что | -|---|---| -| `main.tf` | Провайдер + переменные | -| `locals.tf` | Все настройки кластера | -| `shturval_mgmt.tf` | Ресурс `nubes_vc_mgmt_sthutrval_cluster` | - -## Запуск - -```bash -terraform init # один раз — скачает провайдер -terraform plan # покажет что будет создано, без реальных изменений -terraform apply # создать кластер (подтвердить: yes) -``` - -После `apply` кластер появится в ЛК → Штурвал. - diff --git a/SHTURVAL_MGMT/locals.tf b/SHTURVAL_MGMT/locals.tf deleted file mode 100644 index 95cb8a1..0000000 --- a/SHTURVAL_MGMT/locals.tf +++ /dev/null @@ -1,39 +0,0 @@ -# ============================================================================= -# locals.tf — настраиваемые значения для Менеджмент Kubernetes кластер Штурвал -# Сервис 148 — vc_mgmt_sthutrval_cluster -# ============================================================================= - -locals { - # ─── Имя ресурса ───────────────────────────────────────────────────────── - shturval_mgmt_name = "shturval-mgmt-dev" - - # ─── Startup Configuration ─────────────────────────────────────────────── - # resource_realm — только sandbox.nubes.ru для dev - shturval_realm = "sandbox.nubes.ru" - shturval_cluster_name = "shturval-mgmt-dev-00" - - # ─── Cluster Configuration ─────────────────────────────────────────────── - shturval_app_version = "2.13.1" # 2.13.1 | 2.12.1 | 2.11.0 - - # ─── Control Plane Configuration ───────────────────────────────────────── - shturval_cp_sizing_policy = "TKG 4CPU 8RAM" # TKG 4CPU 8RAM | TKG 8CPU 16RAM | TKG 16CPU 32RAM - shturval_cp_sizing_disk = 50 # ГБ - shturval_cp_count = 1 # 1 | 3 | 5 - - # ─── Worker Configuration ──────────────────────────────────────────────── - # JSON-строка, массив групп воркеров. Все поля имеют defaults. - shturval_worker_config = jsonencode([ - { - groupName = "workers-shturval-mgmt" - sizingPolicy = "TKG 4CPU 8RAM" - sizingDisk = 50 - count = 2 - } - ]) - - # ─── Access Configuration ──────────────────────────────────────────────── - shturval_api_need_external = true - shturval_api_access_ip_list = "[]" # пусто = доступ всем - shturval_ingress_need_external = true - shturval_ingress_access_ip_list = "[]" # пусто = доступ всем -} diff --git a/SHTURVAL_MGMT/main.tf b/SHTURVAL_MGMT/main.tf deleted file mode 100644 index a84cc80..0000000 --- a/SHTURVAL_MGMT/main.tf +++ /dev/null @@ -1,29 +0,0 @@ -terraform { - required_providers { - nubes = { - source = "tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes" - version = "3.1.13" - } - } -} - -variable "api_token" { - type = string - sensitive = true - description = "Nubes API token" -} - -variable "realm" { - type = string - description = "resource_realm for Штурвал (sandbox.nubes.ru)" -} - -variable "sizing_policy" { - type = string - description = "Control plane sizing policy (зависит от ресурсной платформы)" -} - -provider "nubes" { - api_token = var.api_token - api_endpoint = "https://lk-api-gateway-dev.ngcloud.ru/api/v1/svc" -} diff --git a/SHTURVAL_MGMT/shturval_mgmt.tf b/SHTURVAL_MGMT/shturval_mgmt.tf deleted file mode 100644 index 90dbba1..0000000 --- a/SHTURVAL_MGMT/shturval_mgmt.tf +++ /dev/null @@ -1,32 +0,0 @@ -# ============================================================================= -# Менеджмент Kubernetes кластер Штурвал (сервис 148) -# Ресурс: nubes_vc_mgmt_sthutrval_cluster -# ============================================================================= - -resource "nubes_vc_mgmt_sthutrval_cluster" "shturval_mgmt" { - resource_name = local.shturval_mgmt_name - - startup_configuration = { - resource_realm = local.shturval_realm - cluster_name = local.shturval_cluster_name - } - - cluster_configuration = { - app_version = local.shturval_app_version - } - - control_plane_configuration = { - sizing_policy = var.sizing_policy # ⚠️ обязательный, передаётся через tfvars - sizing_disk = local.shturval_cp_sizing_disk - count = local.shturval_cp_count - } - - worker_configuration = local.shturval_worker_config - - access_configuration = { - need_external_address_a_p_i = local.shturval_api_need_external - access_ip_list_a_p_i = local.shturval_api_access_ip_list - need_external_address_ingress = local.shturval_ingress_need_external - access_ip_list_ingress = local.shturval_ingress_access_ip_list - } -} diff --git a/SHTURVAL_MGMT/terraform.tfvars.example b/SHTURVAL_MGMT/terraform.tfvars.example deleted file mode 100644 index b3014d1..0000000 --- a/SHTURVAL_MGMT/terraform.tfvars.example +++ /dev/null @@ -1,8 +0,0 @@ -# ============================================================================= -# terraform.tfvars.example — пример переменных для Штурвал Management (148) -# Скопировать в terraform.tfvars и заполнить реальными значениями -# ============================================================================= - -api_token = "" -realm = "sandbox.nubes.ru" -sizing_policy = "TKG 4CPU 8RAM" # TKG 4CPU 8RAM (мин) | TKG 8CPU 16RAM | TKG 16CPU 32RAM diff --git a/iot-rmq-demo/README.md b/iot-rmq-demo/README.md deleted file mode 100644 index efda1a1..0000000 --- a/iot-rmq-demo/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# IoT Demo — Nubes Cloud - -Демо-стенд «Умный дом»: 6 сервисов Nubes Cloud, развёртывание через Terraform. - -## Пайплайн данных - -Эмуляция IoT-датчиков «Умного дома»: температура, влажность, энергопотребление. - -Архитектура IoT Demo - -| # | Сервис | Тип Nubes | Что делает | -|---|---|---|---| -| 1 | **Producer** | Node.js (22) | Генерирует случайные события от 8 датчиков (3 типа: температура °C, влажность %, энергопотребление kW). Раз в 3 секунды отправляет JSON-событие в очередь RabbitMQ `iot-events`. | -| 2 | **RabbitMQ** | RabbitMQ | Очередь сообщений AMQP. Держит события, пока Consumer не заберёт. `durable: true` — сообщения переживают рестарт брокера. | -| 3 | **Consumer** | Node.js (22) | Читает очередь RabbitMQ. Каждое событие пишет параллельно в Redis (оперативный кэш: последние значения + счётчики + лента) и MongoDB (постоянный архив с TTL 7 дней). | -| 4 | **Redis** | Redis | Кэш для Dashboard: `iot:latest` (hash — актуальные значения датчиков), `iot:counters` (hash — счётчики по типам), `iot:recent` (zset — лента 1000 событий). | -| 5 | **MongoDB** | MongoDB | Архив всех событий в коллекции `iot_events`. TTL-индекс на 7 дней — автоочистка. | -| 6 | **Dashboard** | Node.js (22) | Веб-интерфейс. Читает только Redis, отдаёт JSON-API и HTML с графиками Chart.js (bar chart значений, doughnut счётчиков, таблица событий). Автообновление каждые 3 сек. | - -Все соединения между сервисами — внутренние, через K8s Service (`.svc.cluster.local`). Наружу торчат только HTTP-эндпоинты Node.js-приложений. - -## Быстрый старт - -### 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://.nodejsk8s.dev.nubes.ru # → {"events_sent": N, "errors": 0} -curl https://.nodejsk8s.dev.nubes.ru # → {"consumed": N, "errors": 0} -# Dashboard: открыть https://.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`). diff --git a/iot-rmq-demo/consumer.tf b/iot-rmq-demo/consumer.tf deleted file mode 100644 index 63c3250..0000000 --- a/iot-rmq-demo/consumer.tf +++ /dev/null @@ -1,65 +0,0 @@ -# ============================================================================= -# Consumer (Node.js) — читает RabbitMQ, сохраняет в Redis + MongoDB -# Использует amqplib для AMQP-подключения к RabbitMQ -# ============================================================================= - -locals { - # Подключение к RabbitMQ (AMQP, порт 5672) - cons_rmq_host = nubes_rabbitmq.main.state_out_flat["internalConnect"] # K8s-хост - cons_rmq_user = nonsensitive(nubes_rabbitmq.main.vault_secrets["adminUser"]) # логин - cons_rmq_pass = nonsensitive(nubes_rabbitmq.main.vault_secrets["adminPass"]) # пароль - - # Подключение к Redis (порт 6379) - cons_rds_host = nubes_redis.main.state_out_flat["internalConnect.master"] # K8s-хост - cons_rds_pass = nonsensitive(nubes_redis.main.vault_secrets["adminPass"]) # пароль - - # Подключение к MongoDB (порт 27017) — без аутентификации (vault пустой) - cons_mgo_host = nubes_mongodb.main.state_out_flat["internalConnect"] # K8s-хост - cons_mgo_user = "admin" # дефолтный пользователь - cons_mgo_pass = "" # без пароля -} - -resource "nubes_nodejs" "consumer" { - resource_name = local.cons_resource_name # имя в личном кабинете - - startup_configuration = { - resource_realm = var.realm # K8s-кластер - } - - cluster_configuration = { - cpu = local.cons_cpu # CPU millicores - memory = local.cons_memory # память MB - replicas = local.cons_replicas # количество подов - } - - access_configuration = { - domain = local.cons_domain # поддомен для HTTP - } - - app_configuration = { - version = "22" # версия Node.js - git_path = local.cons_git_path # Git-репо с кодом - health_path = "/" # health-check эндпоинт - } - - git_revision = local.cons_git_revision # коммит для деплоя - operation_timeout = local.cons_timeout # таймаут - adopt_existing_on_create = true # подхватить suspended инстанс при повторном apply - - # Переменные окружения для K8s пода - json_env = jsonencode({ - RMQ_HOST = local.cons_rmq_host # хост RabbitMQ - RMQ_PORT = "5672" # порт AMQP - RMQ_USER = local.cons_rmq_user # логин RabbitMQ - RMQ_PASS = local.cons_rmq_pass # пароль RabbitMQ - RMQ_QUEUE = local.rmq_queue # имя очереди - REDIS_HOST = local.cons_rds_host # хост Redis - REDIS_PORT = "6379" # порт Redis - REDIS_PASS = local.cons_rds_pass # пароль Redis - MONGO_URI = "mongodb://${local.cons_mgo_user}:${local.cons_mgo_pass}@${local.cons_mgo_host}:27017/iot?authSource=admin" - MONGO_DB = "iot" # имя базы MongoDB - }) - - # Ждать создания всех трёх сервисов - depends_on = [nubes_rabbitmq.main, nubes_redis.main, nubes_mongodb.main] -} diff --git a/iot-rmq-demo/dashboard.tf b/iot-rmq-demo/dashboard.tf deleted file mode 100644 index c5457ce..0000000 --- a/iot-rmq-demo/dashboard.tf +++ /dev/null @@ -1,47 +0,0 @@ -# ============================================================================= -# Dashboard (Node.js + Chart.js) — читает Redis, показывает графики -# API: /api/latest, /api/counters, /api/recent -# ============================================================================= - -locals { - # Подключение к Redis (только чтение) - dash_rds_host = nubes_redis.main.state_out_flat["internalConnect.master"] # K8s-хост Redis - dash_rds_pass = nonsensitive(nubes_redis.main.vault_secrets["adminPass"]) # пароль Redis -} - -resource "nubes_nodejs" "dashboard" { - resource_name = local.dash_resource_name # имя в личном кабинете - - startup_configuration = { - resource_realm = var.realm # K8s-кластер - } - - cluster_configuration = { - cpu = local.dash_cpu # CPU millicores - memory = local.dash_memory # память MB - replicas = local.dash_replicas # количество подов - } - - access_configuration = { - domain = local.dash_domain # поддомен -> iotdash22.nodejsk8s.dev.nubes.ru - } - - app_configuration = { - version = "22" # версия Node.js - git_path = local.dash_git_path # Git-репо с кодом - health_path = "/" # health-check - } - - git_revision = local.dash_git_revision # коммит для деплоя - operation_timeout = local.dash_timeout # таймаут - adopt_existing_on_create = true # подхватить suspended инстанс при повторном apply - - # Переменные окружения - json_env = jsonencode({ - REDIS_HOST = local.dash_rds_host # хост Redis - REDIS_PORT = "6379" # порт Redis - REDIS_PASS = local.dash_rds_pass # пароль Redis - }) - - depends_on = [nubes_redis.main] # ждать создания Redis -} diff --git a/iot-rmq-demo/demo.jpg b/iot-rmq-demo/demo.jpg deleted file mode 100755 index 8178bde..0000000 Binary files a/iot-rmq-demo/demo.jpg and /dev/null differ diff --git a/iot-rmq-demo/infra.tf b/iot-rmq-demo/infra.tf deleted file mode 100644 index 8966b62..0000000 --- a/iot-rmq-demo/infra.tf +++ /dev/null @@ -1,84 +0,0 @@ -# ============================================================================= -# Инфраструктурные сервисы (создаются первым прогоном apply) -# RabbitMQ (очередь) + Redis (кэш) + MongoDB (архив) -# ============================================================================= - -# --- RabbitMQ: очередь сообщений (сервис 93) --- -# state_out_flat["internalConnect"] = K8s-хост (service.cluster.local) -# vault_secrets["adminUser"] / ["adminPass"] = логин/пароль (прямые строки, не JSON) -resource "nubes_rabbitmq" "main" { - resource_name = local.rmq_resource_name # имя в личном кабинете - - startup_configuration = { # на каком K8s-кластере развернуть - resource_realm = var.realm - } - - cluster_configuration = { # ресурсы пода - cpu = local.rmq_cpu # CPU millicores - memory = local.rmq_memory # память MB - disk = local.rmq_disk # диск GB - replicas = local.rmq_replicas # количество нод - } - - access_configuration = { # сетевой доступ - master_ip_space = "no-needed" # не резервировать внешний IP - master_access_list = jsonencode(["10.0.0.0/8"]) # внутренняя сеть K8s - } - - operation_timeout = local.rmq_timeout # макс. время ожидания - adopt_existing_on_create = true # подхватить suspended инстанс при повторном apply -} - -# --- Redis: кэш дашборда (сервис 91) --- -# state_out_flat["internalConnect.master"] = хост -# vault_secrets["adminPass"] = пароль (прямая строка, не JSON) -resource "nubes_redis" "main" { - resource_name = local.rds_resource_name # имя в личном кабинете (rds = ReDiS) - - startup_configuration = { # на каком K8s-кластере - resource_realm = var.realm - } - - cluster_configuration = { # ресурсы пода - cpu = local.rds_cpu # CPU millicores - memory = local.rds_memory # память MB - disk = local.rds_disk # диск GB - replicas = local.rds_replicas # количество нод - } - - access_configuration = { # сетевой доступ - master_ip_space = "no-needed" # не резервировать внешний IP - master_access_list = jsonencode(["10.0.0.0/8"]) # разрешить всю внутреннюю сеть K8s - slave_ip_space = "no-needed" # slave-нода не нужна - slave_access_list = jsonencode([]) # slave-нода не нужна - } - - operation_timeout = local.rds_timeout # макс. время ожидания операций - adopt_existing_on_create = true # подхватить suspended инстанс при повторном apply -} - -# --- MongoDB: архив событий (сервис 92) --- -# state_out_flat["internalConnect"] = хост -# vault_secrets — пустой (нет дефолтных пользователей), подключаемся без пароля -resource "nubes_mongodb" "main" { - resource_name = local.mgo_resource_name # имя в личном кабинете (mgo = MonGO) - - startup_configuration = { # на каком K8s-кластере - resource_realm = var.realm - } - - cluster_configuration = { # ресурсы пода - cpu = local.mgo_cpu # CPU millicores - memory = local.mgo_memory # память MB - disk = local.mgo_disk # диск GB - replicas = local.mgo_replicas # количество нод - } - - access_configuration = { # сетевой доступ - master_ip_space = "no-needed" # не резервировать внешний IP - master_access_list = jsonencode(["10.0.0.0/8"]) # разрешить всю внутреннюю сеть K8s - } - - operation_timeout = local.mgo_timeout # макс. время ожидания - adopt_existing_on_create = true # подхватить suspended инстанс при повторном apply -} diff --git a/iot-rmq-demo/locals.tf b/iot-rmq-demo/locals.tf deleted file mode 100644 index 186f786..0000000 --- a/iot-rmq-demo/locals.tf +++ /dev/null @@ -1,61 +0,0 @@ -# ============================================================================= -# Общие переменные для всех ресурсов демо-стенда IoT -# Пайплайн: Producer -> RabbitMQ -> Consumer -> Redis+MongoDB -> Dashboard -# Все значения вынесены сюда — в ресурсах хардкода нет -# ============================================================================= -locals { - # --- RabbitMQ: очередь сообщений (сервис 93) --- - rmq_resource_name = "iot-rmq" # имя инстанса в личном кабинете Nubes - rmq_cpu = 300 # CPU в millicores (1000 = 1 ядро) - rmq_memory = 512 # память в MB - rmq_disk = 5 # диск в GB - rmq_replicas = 1 # количество реплик (нод) - rmq_timeout = "11m" # таймаут ожидания операций create/modify - rmq_queue = "iot-events" # имя очереди: producer кладёт, consumer забирает - - # --- Redis: кэш дашборда (сервис 91) --- - rds_resource_name = "iot-rds" # имя инстанса (rds = ReDiS) - rds_cpu = 300 # CPU millicores - rds_memory = 512 # память MB - rds_disk = 5 # диск GB - rds_replicas = 1 # реплик (нод) - rds_timeout = "11m" # таймаут операций - - # --- MongoDB: архив всех событий (сервис 92) --- - mgo_resource_name = "iot-mgo" # имя инстанса (mgo = MonGO) - mgo_cpu = 300 # CPU millicores - mgo_memory = 512 # память MB - mgo_disk = 5 # диск GB - mgo_replicas = 1 # реплик (нод) - mgo_timeout = "11m" # таймаут операций - - # --- Producer (Node.js): генерирует IoT-события -> RabbitMQ --- - prod_resource_name = "iot-prod" # имя инстанса в личном кабинете - prod_domain = "iot-prod" # поддомен (станет .nodejsk8s.dev.nubes.ru) - prod_git_path = "https://gitea.services.ngcloud.ru/ВАШ_ЛОГИН/tf-iot-producer.git" # ⚠️ замените на свой форк - prod_git_revision = "main" # ветка или хеш коммита для деплоя - prod_cpu = 300 # CPU millicores - prod_memory = 256 # память MB - prod_replicas = 1 # количество подов - prod_timeout = "11m" # таймаут операций - - # --- Consumer (Node.js): RabbitMQ -> Redis + MongoDB --- - cons_resource_name = "iot-cons" # имя инстанса в личном кабинете - cons_domain = "iot-cons" # поддомен (станет .nodejsk8s.dev.nubes.ru) - cons_git_path = "https://gitea.services.ngcloud.ru/ВАШ_ЛОГИН/tf-iot-consumer.git" # ⚠️ замените на свой форк - cons_git_revision = "main" # ветка или хеш коммита для деплоя - cons_cpu = 300 # CPU millicores - cons_memory = 256 # память MB - cons_replicas = 1 # количество подов - cons_timeout = "11m" # таймаут операций - - # --- Dashboard (Node.js + Chart.js): Redis -> графики --- - dash_resource_name = "iot-dash" # имя инстанса в личном кабинете - dash_domain = "iot-dash" # поддомен (станет .nodejsk8s.dev.nubes.ru) - dash_git_path = "https://gitea.services.ngcloud.ru/ВАШ_ЛОГИН/tf-iot-dashboard.git" # ⚠️ замените на свой форк - dash_git_revision = "main" # ветка или хеш коммита для деплоя - dash_cpu = 300 # CPU millicores - dash_memory = 256 # память MB - dash_replicas = 1 # количество подов - dash_timeout = "11m" # таймаут операций -} diff --git a/iot-rmq-demo/main.tf b/iot-rmq-demo/main.tf deleted file mode 100644 index 7f11efa..0000000 --- a/iot-rmq-demo/main.tf +++ /dev/null @@ -1,52 +0,0 @@ -# ============================================================================= -# Terraform-конфиг: IoT Demo на Nubes Cloud -# ============================================================================= -# 6 сервисов: RabbitMQ, Redis, MongoDB, 3× Node.js -# Пайплайн: Producer → RabbitMQ → Consumer → Redis + MongoDB → Dashboard -# -# Требования: -# - Nubes Cloud CLI (провайдер tf-registry.containerk8s.services.ngcloud.ru) -# - API-токен из личного кабинета -# - Заполненный terraform.tfvars (см. terraform.tfvars.example) -# -# Быстрый старт: -# 1. Скопировать terraform.tfvars.example → terraform.tfvars -# 2. Заполнить api_token, realm, api_endpoint -# 3. Форкнуть репозитории приложений в свой Gitea (см. README.md) -# 4. Обновить git_path и git_revision в locals.tf -# 5. terraform init && terraform apply -# ============================================================================= - -terraform { - required_providers { - nubes = { - source = "tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes" # реестр провайдера Nubes - version = "5.1.16" # версия провайдера - } - } -} - -# API-токен для доступа к Nubes Cloud (из личного кабинета) -variable "api_token" { - type = string - sensitive = true # не показывать в логах/плане -} - -# K8s-кластер (realm) для развёртывания (например: k8s-4-sandbox-nubes-ru) -variable "realm" { - type = string -} - -# API-эндпоинт Nubes Cloud: -# Тестовый: https://lk-api-gateway-test.ngcloud.ru/api/v1/svc -# Боевой: https://lk-api-gateway.ngcloud.ru/api/v1/svc -variable "api_endpoint" { - type = string - default = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc" -} - -# Конфигурация провайдера Nubes -provider "nubes" { - api_token = var.api_token - api_endpoint = var.api_endpoint -} diff --git a/iot-rmq-demo/producer.tf b/iot-rmq-demo/producer.tf deleted file mode 100644 index 97ec455..0000000 --- a/iot-rmq-demo/producer.tf +++ /dev/null @@ -1,52 +0,0 @@ -# ============================================================================= -# Producer (Node.js) — генерирует IoT-события и шлёт в RabbitMQ -# Каждые 3 сек создаёт случайное событие от одного из 8 датчиков -# Переменные окружения попадают в K8s под через json_env -# ============================================================================= - -locals { - # Достаём реальные значения из созданного RabbitMQ (state_out_flat + vault_secrets) - prod_rmq_host = nubes_rabbitmq.main.state_out_flat["internalConnect"] # K8s-хост RabbitMQ - prod_rmq_user = nonsensitive(nubes_rabbitmq.main.vault_secrets["adminUser"]) # логин RabbitMQ - prod_rmq_pass = nonsensitive(nubes_rabbitmq.main.vault_secrets["adminPass"]) # пароль RabbitMQ -} - -resource "nubes_nodejs" "producer" { - resource_name = local.prod_resource_name # имя в личном кабинете - - startup_configuration = { - resource_realm = var.realm # K8s-кластер - } - - cluster_configuration = { - cpu = local.prod_cpu # CPU millicores - memory = local.prod_memory # память MB - replicas = local.prod_replicas # количество подов - } - - access_configuration = { - domain = local.prod_domain # поддомен для HTTP-доступа - } - - app_configuration = { - version = "22" # версия Node.js - git_path = local.prod_git_path # Git-репо с кодом - health_path = "/" # эндпоинт для health-check'а - } - - git_revision = local.prod_git_revision # коммит для деплоя - operation_timeout = local.prod_timeout # таймаут - adopt_existing_on_create = true # подхватить suspended инстанс при повторном apply - - # Переменные окружения в K8s поде (доступны через process.env) - json_env = jsonencode({ - RABBIT_HOST = local.prod_rmq_host # хост RabbitMQ - RABBIT_PORT = "5672" # порт AMQP - RABBIT_USER = local.prod_rmq_user # логин - RABBIT_PASS = local.prod_rmq_pass # пароль - RABBIT_QUEUE = local.rmq_queue # имя очереди - PRODUCE_INTERVAL = "3" # интервал между событиями (сек) - }) - - depends_on = [nubes_rabbitmq.main] # ждать создания RabbitMQ -} diff --git a/iot-rmq-demo/terraform.tfvars.example b/iot-rmq-demo/terraform.tfvars.example deleted file mode 100644 index e14e993..0000000 --- a/iot-rmq-demo/terraform.tfvars.example +++ /dev/null @@ -1,18 +0,0 @@ -# ============================================================================= -# terraform.tfvars — переменные для IoT Demo -# Скопируйте этот файл: cp terraform.tfvars.example terraform.tfvars -# и заполните значения ниже. -# ============================================================================= - -# API-токен из личного кабинета Nubes Cloud -# (Настройки → API-ключи → Создать) -api_token = "" - -# K8s-кластер для развёртывания -# (например: k8s-4-sandbox-nubes-ru — тестовый кластер) -realm = "ВАШ_REALM" - -# API-эндпоинт (раскомментируйте нужный): -# Тест: https://lk-api-gateway-test.ngcloud.ru/api/v1/svc -# Прод: https://lk-api-gateway.ngcloud.ru/api/v1/svc -# api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"