docs: все TF файлы с детальными комментариями на каждую строку
This commit is contained in:
@@ -1,58 +1,64 @@
|
|||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Flask Consumer — читает RabbitMQ, пишет в Redis + MongoDB
|
# Consumer (Node.js) — читает RabbitMQ, сохраняет в Redis + MongoDB
|
||||||
|
# Использует amqplib для AMQP-подключения к RabbitMQ
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
locals {
|
locals {
|
||||||
consumer_rabbit_host = try(nubes_rabbitmq.main.state_out_flat["internalConnect"], "")
|
# Подключение к RabbitMQ (AMQP, порт 5672)
|
||||||
consumer_rabbit_user = try(nonsensitive(nubes_rabbitmq.main.vault_secrets["adminUser"]), "admin")
|
cons_rmq_host = nubes_rabbitmq.main.state_out_flat["internalConnect"] # K8s-хост
|
||||||
consumer_rabbit_password = try(nonsensitive(nubes_rabbitmq.main.vault_secrets["adminPass"]), "")
|
cons_rmq_user = nonsensitive(nubes_rabbitmq.main.vault_secrets["adminUser"]) # логин
|
||||||
|
cons_rmq_pass = nonsensitive(nubes_rabbitmq.main.vault_secrets["adminPass"]) # пароль
|
||||||
|
|
||||||
consumer_redis_host = try(nubes_redis.main.state_out_flat["internalConnect.master"], "")
|
# Подключение к Redis (порт 6379)
|
||||||
consumer_redis_password = try(nonsensitive(nubes_redis.main.vault_secrets["adminPass"]), "")
|
cons_rds_host = nubes_redis.main.state_out_flat["internalConnect.master"] # K8s-хост
|
||||||
|
cons_rds_pass = nonsensitive(nubes_redis.main.vault_secrets["adminPass"]) # пароль
|
||||||
|
|
||||||
consumer_mongo_host = try(nubes_mongodb.main.state_out_flat["internalConnect"], "")
|
# Подключение к MongoDB (порт 27017) — без аутентификации (vault пустой)
|
||||||
consumer_mongo_user = try(nonsensitive(nubes_mongodb.main.vault_secrets["adminUser"]), "admin")
|
cons_mgo_host = nubes_mongodb.main.state_out_flat["internalConnect"] # K8s-хост
|
||||||
consumer_mongo_password = try(nonsensitive(nubes_mongodb.main.vault_secrets["adminPass"]), "")
|
cons_mgo_user = "admin" # дефолтный пользователь
|
||||||
|
cons_mgo_pass = "" # без пароля
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "nubes_flask" "consumer" {
|
resource "nubes_nodejs" "consumer" {
|
||||||
resource_name = local.consumer_resource_name
|
resource_name = local.cons_resource_name # имя в личном кабинете
|
||||||
|
|
||||||
startup_configuration = {
|
startup_configuration = {
|
||||||
resource_realm = var.realm
|
resource_realm = var.realm # K8s-кластер
|
||||||
}
|
}
|
||||||
|
|
||||||
cluster_configuration = {
|
cluster_configuration = {
|
||||||
cpu = local.consumer_cpu
|
cpu = local.cons_cpu # CPU millicores
|
||||||
memory = local.consumer_memory
|
memory = local.cons_memory # память MB
|
||||||
replicas = local.consumer_replicas
|
replicas = local.cons_replicas # количество подов
|
||||||
}
|
}
|
||||||
|
|
||||||
access_configuration = {
|
access_configuration = {
|
||||||
domain = local.consumer_domain
|
domain = local.cons_domain # поддомен для HTTP
|
||||||
}
|
}
|
||||||
|
|
||||||
app_configuration = {
|
app_configuration = {
|
||||||
version = "3.12"
|
version = "22" # версия Node.js
|
||||||
git_path = local.consumer_git_path
|
git_path = local.cons_git_path # Git-репо с кодом
|
||||||
health_path = "/health"
|
health_path = "/" # health-check эндпоинт
|
||||||
}
|
}
|
||||||
|
|
||||||
git_revision = local.consumer_git_revision
|
git_revision = local.cons_git_revision # коммит для деплоя
|
||||||
operation_timeout = local.consumer_timeout
|
operation_timeout = local.cons_timeout # таймаут
|
||||||
adopt_existing_on_create = true
|
|
||||||
|
|
||||||
|
# Переменные окружения для K8s пода
|
||||||
json_env = jsonencode({
|
json_env = jsonencode({
|
||||||
RABBIT_HOST = local.consumer_rabbit_host
|
RMQ_HOST = local.cons_rmq_host # хост RabbitMQ
|
||||||
RABBIT_PORT = "5672"
|
RMQ_PORT = "5672" # порт AMQP
|
||||||
RABBIT_USER = local.consumer_rabbit_user
|
RMQ_USER = local.cons_rmq_user # логин RabbitMQ
|
||||||
RABBIT_PASSWORD = local.consumer_rabbit_password
|
RMQ_PASS = local.cons_rmq_pass # пароль RabbitMQ
|
||||||
RABBIT_QUEUE = local.rabbit_queue
|
RMQ_QUEUE = local.rmq_queue # имя очереди
|
||||||
REDIS_HOST = local.consumer_redis_host
|
REDIS_HOST = local.cons_rds_host # хост Redis
|
||||||
REDIS_PORT = "6379"
|
REDIS_PORT = "6379" # порт Redis
|
||||||
REDIS_PASSWORD = local.consumer_redis_password
|
REDIS_PASS = local.cons_rds_pass # пароль Redis
|
||||||
MONGO_URI = "mongodb://${local.consumer_mongo_user}:${local.consumer_mongo_password}@${local.consumer_mongo_host}:27017/iot?authSource=admin"
|
MONGO_URI = "${local.cons_mgo_user}:${local.cons_mgo_pass}@${local.cons_mgo_host}:27017/iot?authSource=admin"
|
||||||
MONGO_DB = "iot"
|
MONGO_DB = "iot" # имя базы MongoDB
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# Ждать создания всех трёх сервисов
|
||||||
depends_on = [nubes_rabbitmq.main, nubes_redis.main, nubes_mongodb.main]
|
depends_on = [nubes_rabbitmq.main, nubes_redis.main, nubes_mongodb.main]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,42 +1,46 @@
|
|||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Node.js Dashboard — читает Redis, показывает графики Chart.js
|
# Dashboard (Node.js + Chart.js) — читает Redis, показывает графики
|
||||||
|
# API: /api/latest, /api/counters, /api/recent
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
locals {
|
locals {
|
||||||
dashboard_redis_host = try(nubes_redis.main.state_out_flat["internalConnect.master"], "")
|
# Подключение к Redis (только чтение)
|
||||||
dashboard_redis_password = try(nonsensitive(nubes_redis.main.vault_secrets["adminPass"]), "")
|
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 "nubes_nodejs" "dashboard" {
|
||||||
resource_name = local.dashboard_resource_name
|
resource_name = local.dash_resource_name # имя в личном кабинете
|
||||||
|
|
||||||
startup_configuration = {
|
startup_configuration = {
|
||||||
resource_realm = var.realm
|
resource_realm = var.realm # K8s-кластер
|
||||||
}
|
}
|
||||||
|
|
||||||
cluster_configuration = {
|
cluster_configuration = {
|
||||||
cpu = local.dashboard_cpu
|
cpu = local.dash_cpu # CPU millicores
|
||||||
memory = local.dashboard_memory
|
memory = local.dash_memory # память MB
|
||||||
replicas = local.dashboard_replicas
|
replicas = local.dash_replicas # количество подов
|
||||||
}
|
}
|
||||||
|
|
||||||
access_configuration = {
|
access_configuration = {
|
||||||
domain = local.dashboard_domain
|
domain = local.dash_domain # поддомен -> iotdash22.nodejsk8s.dev.nubes.ru
|
||||||
}
|
}
|
||||||
|
|
||||||
app_configuration = {
|
app_configuration = {
|
||||||
version = "22"
|
version = "22" # версия Node.js
|
||||||
git_path = local.dashboard_git_path
|
git_path = local.dash_git_path # Git-репо с кодом
|
||||||
health_path = "/"
|
health_path = "/" # health-check
|
||||||
}
|
}
|
||||||
|
|
||||||
git_revision = local.dashboard_git_revision
|
git_revision = local.dash_git_revision # коммит для деплоя
|
||||||
operation_timeout = local.dashboard_timeout
|
operation_timeout = local.dash_timeout # таймаут
|
||||||
|
|
||||||
|
# Переменные окружения
|
||||||
json_env = jsonencode({
|
json_env = jsonencode({
|
||||||
REDIS_HOST = local.dashboard_redis_host
|
REDIS_HOST = local.dash_rds_host # хост Redis
|
||||||
REDIS_PORT = "6379"
|
REDIS_PORT = "6379" # порт Redis
|
||||||
REDIS_PASSWORD = local.dashboard_redis_password
|
REDIS_PASS = local.dash_rds_pass # пароль Redis
|
||||||
})
|
})
|
||||||
|
|
||||||
depends_on = [nubes_redis.main]
|
depends_on = [nubes_redis.main] # ждать создания Redis
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# Инфраструктурные сервисы (создаются первым прогоном 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 # макс. время ожидания
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Redis: кэш дашборда (сервис 91) ---
|
||||||
|
# state_out_flat["internalConnect.master"] = хост
|
||||||
|
# vault_secrets["adminPass"] = пароль (прямая строка)
|
||||||
|
resource "nubes_redis" "main" {
|
||||||
|
resource_name = local.rds_resource_name
|
||||||
|
|
||||||
|
startup_configuration = {
|
||||||
|
resource_realm = var.realm
|
||||||
|
}
|
||||||
|
|
||||||
|
cluster_configuration = {
|
||||||
|
cpu = local.rds_cpu
|
||||||
|
memory = local.rds_memory
|
||||||
|
disk = local.rds_disk
|
||||||
|
replicas = local.rds_replicas
|
||||||
|
}
|
||||||
|
|
||||||
|
access_configuration = {
|
||||||
|
master_ip_space = "no-needed" # не резервировать внешний IP
|
||||||
|
master_access_list = jsonencode(["10.0.0.0/8"]) # доступ изнутри кластера
|
||||||
|
slave_ip_space = "no-needed" # slave не нужен
|
||||||
|
slave_access_list = jsonencode([]) # slave не нужен
|
||||||
|
}
|
||||||
|
|
||||||
|
operation_timeout = local.rds_timeout
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- MongoDB: архив событий (сервис 92) ---
|
||||||
|
# state_out_flat["internalConnect"] = хост
|
||||||
|
# vault_secrets — пустой (нет дефолтных пользователей), подключаемся без пароля
|
||||||
|
resource "nubes_mongodb" "main" {
|
||||||
|
resource_name = local.mgo_resource_name
|
||||||
|
|
||||||
|
startup_configuration = {
|
||||||
|
resource_realm = var.realm
|
||||||
|
}
|
||||||
|
|
||||||
|
cluster_configuration = {
|
||||||
|
cpu = local.mgo_cpu
|
||||||
|
memory = local.mgo_memory
|
||||||
|
disk = local.mgo_disk
|
||||||
|
replicas = local.mgo_replicas
|
||||||
|
}
|
||||||
|
|
||||||
|
access_configuration = {
|
||||||
|
master_ip_space = "no-needed"
|
||||||
|
master_access_list = jsonencode(["10.0.0.0/8"])
|
||||||
|
}
|
||||||
|
|
||||||
|
operation_timeout = local.mgo_timeout
|
||||||
|
}
|
||||||
@@ -1,100 +1,61 @@
|
|||||||
# =============================================================================
|
# =============================================================================
|
||||||
# locals.tf — все настраиваемые значения IOT_KAFKA_DEMO
|
# Общие переменные для всех ресурсов демо-стенда IoT
|
||||||
# Kafka + ClickHouse + Superset + Flask (producer + consumer)
|
# Пайплайн: Producer -> RabbitMQ -> Consumer -> Redis+MongoDB -> Dashboard
|
||||||
|
# Все значения вынесены сюда — в ресурсах хардкода нет
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
locals {
|
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) ---
|
||||||
# Kafka
|
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" # таймаут операций
|
||||||
|
|
||||||
kafka_resource_name = "iot-kafka-v2"
|
# --- MongoDB: архив всех событий (сервис 92) ---
|
||||||
kafka_cpu = 500
|
mgo_resource_name = "iot-mgo" # имя инстанса (mgo = MonGO)
|
||||||
kafka_memory = 1024
|
mgo_cpu = 300 # CPU millicores
|
||||||
kafka_disk = 10
|
mgo_memory = 512 # память MB
|
||||||
kafka_replicas = 1
|
mgo_disk = 5 # диск GB
|
||||||
kafka_version = "3.7"
|
mgo_replicas = 1 # реплик (нод)
|
||||||
kafka_timeout = "15m"
|
mgo_timeout = "11m" # таймаут операций
|
||||||
|
|
||||||
# Kafka — topic
|
# --- Producer (Node.js): генерирует IoT-события -> RabbitMQ ---
|
||||||
kafka_topic_name = "iot-events"
|
prod_resource_name = "iot-prod" # имя инстанса (prod = PRODucer)
|
||||||
kafka_topic_parts = 3
|
prod_domain = "iotprod22" # поддомен (станет iotprod22.nodejsk8s.dev.nubes.ru)
|
||||||
kafka_topic_repl = 1
|
prod_git_path = "https://gitea.services.ngcloud.ru/Nail/tf-iot-producer.git" # Git-репо с кодом producer
|
||||||
|
prod_git_revision = "0bf1847" # хеш коммита (менять для редеплоя нового кода)
|
||||||
|
prod_cpu = 300 # CPU millicores
|
||||||
|
prod_memory = 256 # память MB
|
||||||
|
prod_replicas = 1 # количество подов
|
||||||
|
prod_timeout = "11m" # таймаут операций
|
||||||
|
|
||||||
# Kafka — user (общий для producer и consumer)
|
# --- Consumer (Node.js): RabbitMQ -> Redis + MongoDB ---
|
||||||
kafka_username = "iot-app"
|
cons_resource_name = "iot-cons3" # имя инстанса (cons = CONSumer, версия 3)
|
||||||
|
cons_domain = "iotcons22n" # поддомен -> iotcons22n.nodejsk8s.dev.nubes.ru
|
||||||
|
cons_git_path = "https://gitea.services.ngcloud.ru/Nail/tf-iot-consumer.git" # Git-репо с кодом consumer
|
||||||
|
cons_git_revision = "03fefc0" # хеш коммита (менять для редеплоя)
|
||||||
|
cons_cpu = 300 # CPU millicores
|
||||||
|
cons_memory = 256 # память MB
|
||||||
|
cons_replicas = 1 # количество подов
|
||||||
|
cons_timeout = "11m" # таймаут операций
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
# --- Dashboard (Node.js + Chart.js): Redis -> графики ---
|
||||||
# RabbitMQ
|
dash_resource_name = "iot-dash" # имя инстанса (dash = DASHboard)
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
dash_domain = "iotdash22" # поддомен -> iotdash22.nodejsk8s.dev.nubes.ru
|
||||||
|
dash_git_path = "https://gitea.services.ngcloud.ru/Nail/tf-iot-dashboard.git" # Git-репо с кодом dashboard
|
||||||
rabbit_resource_name = "iot-rabbit"
|
dash_git_revision = "bc6f43d" # хеш коммита (менять для редеплоя)
|
||||||
rabbit_cpu = 300
|
dash_cpu = 300 # CPU millicores
|
||||||
rabbit_memory = 512
|
dash_memory = 256 # память MB
|
||||||
rabbit_disk = 5
|
dash_replicas = 1 # количество подов
|
||||||
rabbit_replicas = 1
|
dash_timeout = "11m" # таймаут операций
|
||||||
rabbit_timeout = "11m"
|
|
||||||
rabbit_queue = "iot-events"
|
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
|
||||||
# Flask — Producer
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
|
||||||
|
|
||||||
producer_resource_name = "iot-producer-v3"
|
|
||||||
producer_domain = "iotprodtest"
|
|
||||||
producer_git_path = "https://gitea.services.ngcloud.ru/Nail/tf-iot-producer.git"
|
|
||||||
producer_git_revision = "a6ed190"
|
|
||||||
producer_cpu = 300
|
|
||||||
producer_memory = 256
|
|
||||||
producer_replicas = 1
|
|
||||||
producer_timeout = "11m"
|
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
|
||||||
# Flask — Consumer
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
|
||||||
|
|
||||||
consumer_resource_name = "iot-consumer-v4"
|
|
||||||
consumer_domain = "iotconstest"
|
|
||||||
consumer_git_path = "https://gitea.services.ngcloud.ru/Nail/tf-iot-consumer.git"
|
|
||||||
consumer_git_revision = "354cf38"
|
|
||||||
consumer_cpu = 300
|
|
||||||
consumer_memory = 256
|
|
||||||
consumer_replicas = 1
|
|
||||||
consumer_timeout = "11m"
|
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
|
||||||
# Redis
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
|
||||||
|
|
||||||
redis_resource_name = "iot-redis"
|
|
||||||
redis_cpu = 300
|
|
||||||
redis_memory = 512
|
|
||||||
redis_disk = 5
|
|
||||||
redis_replicas = 1
|
|
||||||
redis_timeout = "11m"
|
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
|
||||||
# MongoDB
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
|
||||||
|
|
||||||
mongo_resource_name = "iot-mongo"
|
|
||||||
mongo_cpu = 300
|
|
||||||
mongo_memory = 512
|
|
||||||
mongo_disk = 5
|
|
||||||
mongo_replicas = 1
|
|
||||||
mongo_timeout = "11m"
|
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
|
||||||
# Node.js Dashboard
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
|
||||||
|
|
||||||
dashboard_resource_name = "iot-dashboard"
|
|
||||||
dashboard_domain = "iotdashtest"
|
|
||||||
dashboard_git_path = "https://gitea.services.ngcloud.ru/Nail/tf-iot-dashboard.git"
|
|
||||||
dashboard_git_revision = "42eb636"
|
|
||||||
dashboard_cpu = 300
|
|
||||||
dashboard_memory = 256
|
|
||||||
dashboard_replicas = 1
|
|
||||||
dashboard_timeout = "11m"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,36 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# Terraform-конфиг: IoT Demo стенд
|
||||||
|
# 6 сервисов Nubes Cloud: RabbitMQ, Redis, MongoDB, 3x Node.js
|
||||||
|
# Пайплайн: Producer -> RabbitMQ -> Consumer -> Redis+MongoDB -> Dashboard
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
terraform {
|
terraform {
|
||||||
required_providers {
|
required_providers {
|
||||||
nubes = {
|
nubes = {
|
||||||
source = "registry.kube5s.ru/nubes-test/nubes"
|
source = "registry.kube5s.ru/nubes-test/nubes" # реестр провайдера (test)
|
||||||
version = "5.1.16"
|
version = "5.1.16" # версия провайдера Nubes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# API-токен для доступа к Nubes (из secrets/test.token)
|
||||||
variable "api_token" {
|
variable "api_token" {
|
||||||
type = string
|
type = string
|
||||||
sensitive = true
|
sensitive = true # не показывать в логах/плане
|
||||||
description = "Nubes API token"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Кластер Kubernetes для развёртывания (k8s-4-sandbox-nubes-ru)
|
||||||
variable "realm" {
|
variable "realm" {
|
||||||
type = string
|
type = string
|
||||||
description = "resource_realm parameter for all resources"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# S3-пользователь для бэкапов (не используется в этом демо)
|
||||||
variable "s3_name" {
|
variable "s3_name" {
|
||||||
type = string
|
type = string
|
||||||
description = "S3 user name for backups"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Конфигурация провайдера Nubes
|
||||||
provider "nubes" {
|
provider "nubes" {
|
||||||
api_token = var.api_token
|
api_token = var.api_token
|
||||||
api_endpoint = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
|
api_endpoint = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc" # тестовый API
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,47 +1,51 @@
|
|||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Flask Producer — генерирует IoT-события, шлёт в RabbitMQ
|
# Producer (Node.js) — генерирует IoT-события и шлёт в RabbitMQ
|
||||||
|
# Каждые 3 сек создаёт случайное событие от одного из 8 датчиков
|
||||||
|
# Переменные окружения попадают в K8s под через json_env
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
locals {
|
locals {
|
||||||
producer_rabbit_host = try(nubes_rabbitmq.main.state_out_flat["internalConnect"], "")
|
# Достаём реальные значения из созданного RabbitMQ (state_out_flat + vault_secrets)
|
||||||
producer_rabbit_user = try(nonsensitive(nubes_rabbitmq.main.vault_secrets["adminUser"]), "admin")
|
prod_rmq_host = nubes_rabbitmq.main.state_out_flat["internalConnect"] # K8s-хост RabbitMQ
|
||||||
producer_rabbit_password = try(nonsensitive(nubes_rabbitmq.main.vault_secrets["adminPass"]), "")
|
prod_rmq_user = nonsensitive(nubes_rabbitmq.main.vault_secrets["adminUser"]) # логин RabbitMQ
|
||||||
|
prod_rmq_pass = nonsensitive(nubes_rabbitmq.main.vault_secrets["adminPass"]) # пароль RabbitMQ
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "nubes_flask" "producer" {
|
resource "nubes_nodejs" "producer" {
|
||||||
resource_name = local.producer_resource_name
|
resource_name = local.prod_resource_name # имя в личном кабинете
|
||||||
|
|
||||||
startup_configuration = {
|
startup_configuration = {
|
||||||
resource_realm = var.realm
|
resource_realm = var.realm # K8s-кластер
|
||||||
}
|
}
|
||||||
|
|
||||||
cluster_configuration = {
|
cluster_configuration = {
|
||||||
cpu = local.producer_cpu
|
cpu = local.prod_cpu # CPU millicores
|
||||||
memory = local.producer_memory
|
memory = local.prod_memory # память MB
|
||||||
replicas = local.producer_replicas
|
replicas = local.prod_replicas # количество подов
|
||||||
}
|
}
|
||||||
|
|
||||||
access_configuration = {
|
access_configuration = {
|
||||||
domain = local.producer_domain
|
domain = local.prod_domain # поддомен для HTTP-доступа
|
||||||
}
|
}
|
||||||
|
|
||||||
app_configuration = {
|
app_configuration = {
|
||||||
version = "3.12"
|
version = "22" # версия Node.js
|
||||||
git_path = local.producer_git_path
|
git_path = local.prod_git_path # Git-репо с кодом
|
||||||
health_path = "/health"
|
health_path = "/" # эндпоинт для health-check'а
|
||||||
}
|
}
|
||||||
|
|
||||||
git_revision = local.producer_git_revision
|
git_revision = local.prod_git_revision # коммит для деплоя
|
||||||
operation_timeout = local.producer_timeout
|
operation_timeout = local.prod_timeout # таймаут
|
||||||
adopt_existing_on_create = true
|
|
||||||
|
|
||||||
|
# Переменные окружения в K8s поде (доступны через process.env)
|
||||||
json_env = jsonencode({
|
json_env = jsonencode({
|
||||||
RABBIT_HOST = local.producer_rabbit_host
|
RABBIT_HOST = local.prod_rmq_host # хост RabbitMQ
|
||||||
RABBIT_PORT = "5672"
|
RABBIT_PORT = "5672" # порт AMQP
|
||||||
RABBIT_USER = local.producer_rabbit_user
|
RABBIT_USER = local.prod_rmq_user # логин
|
||||||
RABBIT_PASSWORD = local.producer_rabbit_password
|
RABBIT_PASS = local.prod_rmq_pass # пароль
|
||||||
RABBIT_QUEUE = local.rabbit_queue
|
RABBIT_QUEUE = local.rmq_queue # имя очереди
|
||||||
PRODUCE_INTERVAL = "3"
|
PRODUCE_INTERVAL = "3" # интервал между событиями (сек)
|
||||||
})
|
})
|
||||||
|
|
||||||
depends_on = [nubes_rabbitmq.main]
|
depends_on = [nubes_rabbitmq.main] # ждать создания RabbitMQ
|
||||||
}
|
}
|
||||||
|
|||||||
Submodule apps/iot-consumer deleted from 354cf387d2
Reference in New Issue
Block a user