// Изменён: 2026-04-08 // elasticmq_config.go — генератор HOCON конфигурации для ElasticMQ. // Каждый тенант получает уникальный конфиг: свой context-path, accountId, persistence. // Конфиг монтируется в pod как ConfigMap → /opt/elasticmq.conf (путь из ENTRYPOINT JVM-образа). package elasticmq import "fmt" // GenerateConfig генерирует HOCON конфигурацию для ElasticMQ инстанса тенанта. // tenantID — ID тенанта (используется в context-path и accountId). // externalHost — публичный хост (SQS_EXTERNAL_HOST env var, например sqs.kube5s.ru). // persistence — если true, сообщения сохраняются в H2 на PVC /data. // autoCreateQueues — если true, очередь создаётся автоматически при первом обращении. func GenerateConfig(tenantID, externalHost string, persistence bool, autoCreateQueues bool) string { persistenceBlock := "" if persistence { // H2 база данных хранит очереди и сообщения между рестартами pod. // Файл /data/elasticmq.db — на PVC тенанта. persistenceBlock = ` messages-storage { enabled = true uri = "jdbc:h2:/data/elasticmq" }` } else { persistenceBlock = ` messages-storage { enabled = false }` } autoCreateBlock := "" if autoCreateQueues { // При первом обращении к несуществующей очереди — создать её автоматически. // Полезно для dev/mvp: не нужен явный CreateQueue перед SendMessage. autoCreateBlock = ` auto-create-queues { enabled = true }` } return fmt.Sprintf(`include classpath("application.conf") # Внешний адрес ноды — как будут формироваться queue URL в ответах SQS API. # context-path должен совпадать с путём в Ingress: /sqs/%s node-address { protocol = https host = %s port = 443 context-path = "/sqs/%s" } rest-sqs { enabled = true bind-port = 9324 bind-hostname = "0.0.0.0" # strict — соответствие AWS SQS валидации параметров sqs-limits = strict } %s%s # accountId = tenantID — используется в ARN очередей aws { region = ru-msk-1 accountId = "%s" } `, tenantID, externalHost, tenantID, persistenceBlock, autoCreateBlock, tenantID) }