RabbitMQ + Lucee UI + NodeJS воркер¶
Пример resources.tf для связки: UI Lucee отправляет CRUD‑запросы в RabbitMQ,
а применение изменений в Postgres выполняет отдельный воркер на NodeJS.
Предварительные требования:
- запущенный PostgreSQL (см. PostgreSQL: кластер + пользователь + база + S3-бэкап);
- известны
PGHOST,PGUSER,PGPASSWORD(ЛК → PostgreSQL → параметры подключения); - токен — в
secrets.auto.tfvars, не вterraform.tfvars.
Значения-заглушки нужно заменить
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>
}