Skip to content

RabbitMQ + Lucee UI + NodeJS воркер

Пример resources.tf для связки: UI Lucee отправляет CRUD‑запросы в RabbitMQ, а применение изменений в Postgres выполняет отдельный воркер на NodeJS.

Предварительные требования:

Значения-заглушки нужно заменить

k8s-4-sandbox-nubes-ru и https://<ваш-репозиторий>/<приложение>.git — демонстрационные. Подставьте свою ресурсную платформу и свои репозитории.

resources.tf
# RabbitMQ кластер для демо.
resource "nubes_rabbitmq" "rb1" {
  resource_name = "rabbit_0"

  startup_configuration = {
    resource_realm = "k8s-4-sandbox-nubes-ru"
  }
  cluster_configuration = {
    cpu      = 500
    memory   = 512
    disk     = 5
    replicas = 1
  }
  access_configuration = {
    master_ip_space    = "no-needed"
    master_access_list = jsonencode([])
  }
  mq_configuration = {
    max_message_size = 4
  }
}

# Lucee UI, который пишет в Rabbit и читает из Postgres.
resource "nubes_lucee" "rabbit_ui" {
  resource_name = "rb-lucee-ui"

  startup_configuration = {
    resource_realm = "k8s-4-sandbox-nubes-ru"
  }
  cluster_configuration = {
    cpu      = 300
    memory   = 512
    replicas = 1
  }
  access_configuration = {
    domain = "rb-ui"
  }
  app_configuration = {
    version  = "5.4"
    git_path = "https://<ваш-репозиторий>/<приложение>.git"
  }

  # Переменные окружения для datasource, Rabbit и UI.
  json_env = jsonencode({
    testds_bundleName       = "org.postgresql.jdbc"
    testds_bundleVersion    = "42.6.0"
    testds_class            = "org.postgresql.Driver"
    testds_connectionLimit  = "5"
    testds_connectionString = "jdbc:postgresql://${var.PGHOST}:5432/postgres"
    testds_liveTimeout      = "15"
    testds_username         = var.PGUSER
    testds_password         = var.PGPASSWORD
    testds_validate         = "false"
    PG_TABLE                = "rabbit_messages"
    UI_LOG_TABLE            = "rabbit_ui_log"
    RABBIT_HOST             = nubes_rabbitmq.rb1.state_out.internalConnect
    RABBIT_PORT             = "5672"
    RABBIT_USER             = nubes_rabbitmq.rb1.vault_secrets["adminUser"]
    RABBIT_PASSWORD         = nubes_rabbitmq.rb1.vault_secrets["adminPass"]
    RABBIT_VHOST            = "/"
    RABBIT_QUEUES           = "crud_queue"
    RABBIT_DURABLE          = "true"
    RABBIT_ADMIN_URL         = "https://${jsondecode(nubes_rabbitmq.rb1.state_out.externalConnect).admin}/#/"
    NODEWORKER_URL           = "https://${nubes_nodejs.rabbit_nodeworker.state_out.connectionUrl}/"
  })

  depends_on = [nubes_rabbitmq.rb1]
}

# NodeJS воркер, который переносит CRUD из очереди в Postgres.
resource "nubes_nodejs" "rabbit_nodeworker" {
  resource_name = "nodeworker"

  startup_configuration = {
    resource_realm = "k8s-4-sandbox-nubes-ru"
  }
  cluster_configuration = {
    cpu      = 100
    memory   = 256
    replicas = 1
  }
  access_configuration = {
    domain = "nodeworker"
  }
  app_configuration = {
    version     = "23"
    git_path    = "https://<ваш-репозиторий>/<приложение>.git"
    health_path = "/healthz"
  }

  # Параметры подключения к Rabbit и Postgres.
  json_env = jsonencode({
    RABBIT_HOST      = nubes_rabbitmq.rb1.state_out.internalConnect
    RABBIT_PORT      = "5672"
    RABBIT_USER      = nubes_rabbitmq.rb1.vault_secrets["adminUser"]
    RABBIT_PASSWORD  = nubes_rabbitmq.rb1.vault_secrets["adminPass"]
    RABBIT_VHOST     = "/"
    RABBIT_QUEUES    = "crud_queue"
    RABBIT_DURABLE   = "true"
    RABBIT_PREFETCH  = "1"
    REQUEUE_ON_ERROR = "true"
    PGHOST           = var.PGHOST
    PGPORT           = "5432"
    PGUSER           = var.PGUSER
    PGPASSWORD       = var.PGPASSWORD
    PGDATABASE       = "postgres"
    PGSSLMODE        = "require"
    PG_TABLE         = "rabbit_messages"
  })

  depends_on = [nubes_rabbitmq.rb1]
}

# Ручной запуск операций из Terraform.
#
# 1) redeploy: у ресурсов с операцией `redeploy` есть поле `git_revision`.
#    Отдельного ресурса `nubes_nodejs_redeploy` больше нет — меняйте значение
#    поля в самом `nubes_nodejs`, чтобы запустить пересборку из git:
#
#   resource "nubes_nodejs" "rabbit_nodeworker" {
#     # ... остальные параметры ...
#     git_revision = "manual-001"  # ← смена значения = redeploy
#   }
#
# 2) reconcile и любые другие операции — ресурсом `nubes_service_operation`
#    (доступен во всех опубликованных версиях). Меняйте `run_id`, чтобы
#    запустить операцию повторно:
#
#   resource "nubes_service_operation" "pg_reconcile" {
#     instance_uid = nubes_postgres.db2.id
#     operation    = "reconcile"
#     run_id       = "manual-001"  # ← смена значения = повторный запуск
#   }
#
#    Операция выполняется, только если она есть в `availableOperations`
#    инстанса; иначе — ошибка «операция … недоступна для экземпляра …».
variables.tf
// Postgres уже запущен, значения берутся из UI Личного кабинета.
variable "PGUSER" {
  type    = string
  default = "postgres"
}

variable "PGPASSWORD" {
  type    = string
  default = "" # пароль укажите вручную, в примере не публикуем
}

variable "PGHOST" {
  type    = string
  default = "postgresqlk8s-master.<id>.svc.k8s-3.ext.nubes.ru" # оставьте префикс и суффикс, меняется только <id>
}
secrets.auto.tfvars
# Инструкция по получению токена: раздел "Получение API токена"
api_token = "eyJhbGciOiJ..."