diff --git a/PROD_STAND/PG1/main.tf b/PROD_STAND/PG1/main.tf
index 3b553b7..e20f5ae 100644
--- a/PROD_STAND/PG1/main.tf
+++ b/PROD_STAND/PG1/main.tf
@@ -20,6 +20,7 @@ variable "api_token" {
provider "nubes" {
api_token = var.api_token
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ # ⛔ LEGACY: deck-api ЗАКРЫВАЕТСЯ. Gateway:
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
diff --git a/PROD_STAND/POSTGRES/main.tf b/PROD_STAND/POSTGRES/main.tf
index 54bb050..8994b89 100644
--- a/PROD_STAND/POSTGRES/main.tf
+++ b/PROD_STAND/POSTGRES/main.tf
@@ -15,6 +15,7 @@ variable "api_token" {
provider "nubes" {
api_token = var.api_token
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ # ⛔ LEGACY: deck-api ЗАКРЫВАЕТСЯ. Gateway:
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
diff --git a/PROD_STAND/RABBIT/main.tf b/PROD_STAND/RABBIT/main.tf
index dc450fc..4f95b83 100644
--- a/PROD_STAND/RABBIT/main.tf
+++ b/PROD_STAND/RABBIT/main.tf
@@ -11,7 +11,8 @@ terraform {
// Провайдер Nubes для создания ресурсов.
provider "nubes" {
api_token = var.api_token
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ # ⛔ LEGACY: deck-api ЗАКРЫВАЕТСЯ. Gateway:
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
// Токен доступа к Nubes API.
diff --git a/RABBIT/main.tf b/RABBIT/main.tf
deleted file mode 100644
index 4384dfc..0000000
--- a/RABBIT/main.tf
+++ /dev/null
@@ -1,30 +0,0 @@
-// 2026-03-19
-// main.tf — провайдер и переменные для managed RabbitMQ в облаке Nubes.
-// Тест-стенд: deck-api-test.ngcloud.ru
-terraform {
- required_providers {
- nubes = {
- source = "terra.k8c.ru/nubes/nubes"
- version = "5.0.19"
- }
- }
-}
-
-// Токен доступа к Nubes API.
-variable "api_token" {
- type = string
- sensitive = true
- description = "Nubes API token"
-}
-
-// Реалм, в котором создаётся RabbitMQ (например, k8s-5.ext.nubes.ru).
-variable "realm" {
- type = string
- sensitive = true
- description = "resource_realm для nubes_rabbitmq"
-}
-
-provider "nubes" {
- api_token = var.api_token
- api_endpoint = "https://deck-api-test.ngcloud.ru/api/v1/index.cfm"
-}
diff --git a/RABBIT/resources.tf b/RABBIT/resources.tf
deleted file mode 100644
index 160df98..0000000
--- a/RABBIT/resources.tf
+++ /dev/null
@@ -1,41 +0,0 @@
-// 2026-03-19
-// resources.tf — managed RabbitMQ в облаке Nubes для sless и других сервисов.
-
-resource "nubes_rabbitmq" "rmq" {
- // Общий брокер для sless event-triggers и других сервисов облака.
- resource_name = "sless-rabbit"
- resource_realm = var.realm
- resource_instances = 1
- resource_memory = 512
- resource_c_p_u = 500
- resource_disk = 5
- need_external_address_master = false
- need_external_address_slave = false
-}
-
-locals {
- // try() — обходим опечатку в API: поле называется как internalConnect, так и inernalConnect.
- rmq_host = try(nubes_rabbitmq.rmq.state_out_flat["internalConnect.master"], nubes_rabbitmq.rmq.state_out_flat["inernalConnect.master"])
- rmq_user = nubes_rabbitmq.rmq.vault_secrets["adminUser"]
- rmq_password = nubes_rabbitmq.rmq.vault_secrets["adminPass"]
-}
-
-output "rabbitmq_host" {
- value = local.rmq_host
-}
-
-output "rabbitmq_user" {
- value = local.rmq_user
- sensitive = true
-}
-
-output "rabbitmq_password" {
- value = local.rmq_password
- sensitive = true
-}
-
-output "rabbitmq_amqp_url" {
- // Готовый URL для передачи в оператор sless (env RABBITMQ_URL).
- value = "amqp://${local.rmq_user}:${local.rmq_password}@${local.rmq_host}:5672/"
- sensitive = true
-}
diff --git a/TOOLS/config/dev/profile.env b/TOOLS/config/dev/profile.env
index 5e8a6b9..c17731a 100644
--- a/TOOLS/config/dev/profile.env
+++ b/TOOLS/config/dev/profile.env
@@ -1,5 +1,5 @@
# Stand profile: DEV
-NUBES_API_ENDPOINT="https://deck-api-dev.ngcloud.ru/api/v1"
+NUBES_API_ENDPOINT="https://lk-api-gateway-dev.ngcloud.ru/api/v1/svc"
TOKEN_FILE="secrets/dev.token"
# Release versions
diff --git a/TOOLS/config/dev/services_list.txt b/TOOLS/config/dev/services_list.txt
index 12efb00..86cf36d 100644
--- a/TOOLS/config/dev/services_list.txt
+++ b/TOOLS/config/dev/services_list.txt
@@ -1,49 +1,52 @@
# service_id service_name # RU description
-# DEV stand — generated from dev API 2026-03-26
# do not delete lines; to exclude a service, comment it with #
-1 dummy # Болванка
-2 template # Темплейт k8s
-12 s3 # S3 Object Storage
-13 s3bucket # S3 бакет
-19 vcOrg # Организация в Cloud Director
-# 20 vcOrgSaas # DEPRECATED — Организация без Keycloak (isProductionReady=false)
-21 vc_vdc # Виртуальный датацентр (vDC)
-22 vc_nsxt # Сетевой шлюз периметра (Edge)
-# 23 vc_vm # DEPRECATED — VM в Cloud Director старый формат (isProductionReady=false)
-# 24 vcNat # DEPRECATED — Правила маршрутизации VM (isProductionReady=false)
-25 vcexternalip # Публичные IP адреса
-26 vapp # Виртуальный каталог ВМ (vApp)
-# 27 vc_vm_v2 # VM в Cloud Director v2 (isProductionReady=false)
-28 vc_vm_v3 # Виртуальная машина
-29 vcVdcGroup # Группа датацентров
-# 32 vmpostgre # vc_vm_postgresql_std (isProductionReady=false)
-50 nextcloud # Nextcloud
-81 superset # Apache Superset
-82 harbor # Container Registry
-88 k8sZitiController # k8sZitiController
-89 flask # Web-сервер с фреймворком Flask
-90 postgres # PostgreSQL
-91 redis # Redis
-92 mongodb # MongoDB
-93 rabbitmq # RabbitMQ
-94 lucee # Lucee
-95 nodejs # NodeJS
-96 pgadmin # pgAdmin
-97 nodered # NodeRed
-98 http # Простой HTTP контейнер
-99 gitea # Gitea
-# 100 openwhisk # Serverless Openwhisk (isProductionReady=false)
-109 zonesV2 # Управление днс-зонами и записями
-110 dnszone # DNS зона
-111 dnsrecord # DNS запись
-# 112 tenant # Тенант в Grafana (isProductionReady=false)
-# 113 vcComplex # Быстрый старт (isProductionReady=false)
-115 mariadb # Mariadb
-116 kafka # ApacheKafka
-119 Akhq # Akhq
-120 clickhouse # ClickHouse
-149 valoTenant # VALO Cloud
-150 k8sSthutrvalCluster # Kubernetes кластер Штурвал
-151 k8sOpenbao # Vault
-# 152 template # Темплейт k8s-2-clone (isProductionReady=false)
+175 k8sGo # Go
+163 llmAi # LLM
153 nifi # Nifi
+151 k8sOpenbao # Vault
+150 k8sSthutrvalCluster # Kubernetes кластер Штурвал
+149 valoTenant # VALO Cloud
+148 vcMgmtSthutrvalCluster # Менеджмент Kubernetes кластер Штурвал
+120 clickhouse # ClickHouse
+119 Akhq # Akhq
+116 kafka # ApacheKafka
+115 mariadb # Mariadb
+113 vcComplex # Быстрый старт
+112 tenant # Тенант в Grafana
+111 dnsrecord # DNS запись
+110 dnszone # DNS зона
+109 zonesV2 # Управление DNS
+100 openwhisk # Serverless Openwhisk (openwhisk_tenant)
+99 gitea # Gitea
+98 http # Простой HTTP контейнер
+97 nodered # NodeRed
+96 pgadmin # pgAdmin
+95 nodejs # NodeJS
+94 lucee # Lucee
+93 rabbitmq # RabbitMQ
+92 mongodb # MongoDB
+91 redis # Redis
+90 postgres # PostgreSQL
+89 flask # Web-сервер с фреймворком Flask
+88 k8sZitiController # k8sZitiController
+87 k8svalkey # Valkey
+86 k8sVelero # Velero
+82 harbor # Container Registry
+81 superset # Apache Superset
+50 nextcloud # Nextcloud
+32 vmpostgre # vc_vm_postgresql_std
+29 vcVdcGroup # Группа датацентров
+28 vc_vm_v3 # Виртуальная машина
+27 vc_vm_v2 # VM в Cloud Director (vc_vmV2)
+26 vapp # Виртуальный каталог ВМ (vApp)
+25 vcexternalip # Публичные IP адреса
+24 vcNat # DEPRECATED Правила маршрутизации для VM (vc_nat)
+23 vc_vm # VM в Cloud Director (старый формат) (vc_vm)
+22 vc_nsxt # Сетевой шлюз периметра (Edge)
+21 vc_vdc # Виртуальный датацентр (vDC)
+20 vcOrgSaas # Организация [DEPRECATED]
+19 vcOrg # Организация в Cloud Director
+13 s3bucket # S3 бакет
+12 s3 # S3 Object Storage
+2 template # Темплейт k8s
+1 dummy # Болванка
diff --git a/TOOLS/config/prod/profile.env b/TOOLS/config/prod/profile.env
index d285719..afb60f0 100644
--- a/TOOLS/config/prod/profile.env
+++ b/TOOLS/config/prod/profile.env
@@ -1,5 +1,5 @@
# Stand profile: PROD
-NUBES_API_ENDPOINT="https://deck-api.ngcloud.ru/api/v1"
+NUBES_API_ENDPOINT="https://lk-api-gateway.ngcloud.ru/api/v1/svc"
TOKEN_FILE="secrets/prod.token"
# Release versions
diff --git a/TOOLS/config/prod/services_list.txt b/TOOLS/config/prod/services_list.txt
index 5706525..db09dab 100644
--- a/TOOLS/config/prod/services_list.txt
+++ b/TOOLS/config/prod/services_list.txt
@@ -1,46 +1,49 @@
# service_id service_name # RU description
# do not delete lines; to exclude a service, comment it with #
-1 dummy # Болванка для тестов
-2 template # Болванка для тестирования
-12 s3 # Масштабируемое хранилище данных
-13 s3bucket # Бакет в сервисе S3
-19 vcOrg # Организация в Cloud Director
-20 vcOrgSaas # Без интеграции Keycloak
-21 vc_vdc # Выделение вычислительных ресурсов
-22 vc_nsxt # Обеспечение сетевой доступности в тенанте
-23 vc_vm # Виртуальная машина без каких-либо особенностей.
Данная услуга запускает vc_ip для выдачи белого адреса и подключения к ВМ
-# 24 DEPRECATED Правила маршрутизации для VM (vc_nat) # excluded from active generation
-25 vcexternalip # Резервирование IP адреса
-26 vapp # Группировка виртуальных машин
-27 vc_vm_v2 # Виртуальная машина с возможностью настройки Cloud Init
Можно развернуть в услуге несколько ВМ
В зависимости от настроек можно выдавать на ВМ vip + dns
-28 vc_vm_v3 # Создание виртуальной машины
-29 vcVdcGroup # Обеспечение сетевой доступности между датацентрами
-32 vmpostgre # Сервис настройки PostgreSQL для виртуальной машины.
Требует наличия ВМ
-50 nextcloud # Платформа совместной работы
-81 superset # Сервер отчетов
-82 harbor # Реестр для хранения образов контейнеров
-88 k8sZitiController # Контроллер управления Client to service & service to service Zero trust network
-89 flask # Flask
-90 postgres # Управляемая база данных PostgreSQL
-91 redis # Управляемая база данных Redis
-92 mongodb # Управляемая база данных MongoDB
-93 rabbitmq # Сервер очередей
-94 lucee # Cервер приложений
-95 nodejs # Cервер приложений
-96 pgadmin # Административный интерфейс для PostgreSQL
-97 nodered # Low-code платформа для IoT
+163 llmAi # LLM
+150 k8sSthutrvalCluster # Kubernetes кластер Штурвал
+149 valoTenant # VALO Cloud
+148 vcMgmtSthutrvalCluster # Менеджмент Kubernetes кластер Штурвал
+120 clickhouse # ClickHouse
+119 Akhq # Akhq
+117 nifi # Nifi
+116 kafka # ApacheKafka
+115 mariadb # Mariadb
+114 GiteaComplex # Комплексная услуга по созданию gitea
+113 vcComplex # Быстрый старт
+112 tenant # Тенант в Grafana
+111 dnsrecord # DNS запись
+110 dnszone # DNS зона
+109 zonesV2 # Управление DNS
+100 openwhisk # Serverless Openwhisk (openwhisk_tenant)
+99 gitea # Gitea
98 http # Простой HTTP контейнер
-99 gitea # Сервис контроля версий
-100 openwhisk # Добавление и удаления пользователя (учетной записи, тенанта) для работы с Openwhisk
-110 dnszone # Хостинг DNS зоны
-111 dnsrecord # DNS запись в созданной зоне
-112 tenant # Организация доступов к мониторингу
-113 vcComplex # Создание готовой иерархии ресурсов
-114 GiteaComplex # Комплексная услуга из ["gittea", "postgres"]
-115 mariadb # Управляемая база данных MySQL
-116 kafka # Сервис создания кластера Apache Kafka
-117 nifi # ETL-система
-119 Akhq # Web интерфейс Akhq для работы с Apache Kafka
-120 clickhouse # Управляемая база данных ClickHouse
-149 valoTenant # Корпоративная система обмена и синхронизации файлов
-150 k8sSthutrvalCluster # Платформа управления K8s
+97 nodered # NodeRed
+96 pgadmin # pgAdmin
+95 nodejs # NodeJS
+94 lucee # Lucee
+93 rabbitmq # RabbitMQ
+92 mongodb # MongoDB
+91 redis # Redis
+90 postgres # PostgreSQL
+89 flask # Web-сервер с фреймворком Flask
+88 k8sZitiController # k8sZitiController
+86 k8sVelero # Velero
+82 harbor # Container Registry
+81 superset # Apache Superset
+50 nextcloud # Nextcloud
+29 vcVdcGroup # Группа датацентров
+28 vc_vm_v3 # Виртуальная машина
+27 vc_vm_v2 # VM в Cloud Director (vc_vmV2)
+26 vapp # Виртуальный каталог ВМ (vApp)
+25 vcexternalip # Публичные IP адреса
+24 svc24 # DEPRECATED Правила маршрутизации для VM (vc_nat)
+23 vc_vm # VM в Cloud Director (старый формат) (vc_vm)
+22 vc_nsxt # Сетевой шлюз периметра (Edge)
+21 vc_vdc # Виртуальный датацентр (vDC)
+20 vcOrgSaas # Организация [DEPRECATED]
+19 vcOrg # Организация в Cloud Director
+13 s3bucket # S3 бакет
+12 s3 # S3 Object Storage
+2 template # Темплейт k8s
+1 dummy # Болванка
diff --git a/TOOLS/config/test/services_list.txt b/TOOLS/config/test/services_list.txt
index 5706525..ca988c5 100644
--- a/TOOLS/config/test/services_list.txt
+++ b/TOOLS/config/test/services_list.txt
@@ -1,46 +1,51 @@
# service_id service_name # RU description
# do not delete lines; to exclude a service, comment it with #
-1 dummy # Болванка для тестов
-2 template # Болванка для тестирования
-12 s3 # Масштабируемое хранилище данных
-13 s3bucket # Бакет в сервисе S3
-19 vcOrg # Организация в Cloud Director
-20 vcOrgSaas # Без интеграции Keycloak
-21 vc_vdc # Выделение вычислительных ресурсов
-22 vc_nsxt # Обеспечение сетевой доступности в тенанте
-23 vc_vm # Виртуальная машина без каких-либо особенностей.
Данная услуга запускает vc_ip для выдачи белого адреса и подключения к ВМ
-# 24 DEPRECATED Правила маршрутизации для VM (vc_nat) # excluded from active generation
-25 vcexternalip # Резервирование IP адреса
-26 vapp # Группировка виртуальных машин
-27 vc_vm_v2 # Виртуальная машина с возможностью настройки Cloud Init
Можно развернуть в услуге несколько ВМ
В зависимости от настроек можно выдавать на ВМ vip + dns
-28 vc_vm_v3 # Создание виртуальной машины
-29 vcVdcGroup # Обеспечение сетевой доступности между датацентрами
-32 vmpostgre # Сервис настройки PostgreSQL для виртуальной машины.
Требует наличия ВМ
-50 nextcloud # Платформа совместной работы
-81 superset # Сервер отчетов
-82 harbor # Реестр для хранения образов контейнеров
-88 k8sZitiController # Контроллер управления Client to service & service to service Zero trust network
-89 flask # Flask
-90 postgres # Управляемая база данных PostgreSQL
-91 redis # Управляемая база данных Redis
-92 mongodb # Управляемая база данных MongoDB
-93 rabbitmq # Сервер очередей
-94 lucee # Cервер приложений
-95 nodejs # Cервер приложений
-96 pgadmin # Административный интерфейс для PostgreSQL
-97 nodered # Low-code платформа для IoT
+163 llmAi # LLM
+151 k8sOpenbao # Vault
+150 k8sSthutrvalCluster # Kubernetes кластер Штурвал
+149 valoTenant # VALO Cloud
+148 vcMgmtSthutrvalCluster # Менеджмент Kubernetes кластер Штурвал
+120 clickhouse # ClickHouse
+119 Akhq # Akhq
+117 nifi # Nifi
+116 kafka # ApacheKafka
+115 mariadb # Mariadb
+114 GiteaComplex # Комплексная услуга по созданию gitea
+113 vcComplex # Быстрый старт
+112 tenant # Тенант в Grafana
+111 dnsrecord # DNS запись
+110 dnszone # DNS зона
+109 zonesV2 # Управление DNS
+100 openwhisk # Serverless Openwhisk (openwhisk_tenant)
+99 gitea # Gitea
98 http # Простой HTTP контейнер
-99 gitea # Сервис контроля версий
-100 openwhisk # Добавление и удаления пользователя (учетной записи, тенанта) для работы с Openwhisk
-110 dnszone # Хостинг DNS зоны
-111 dnsrecord # DNS запись в созданной зоне
-112 tenant # Организация доступов к мониторингу
-113 vcComplex # Создание готовой иерархии ресурсов
-114 GiteaComplex # Комплексная услуга из ["gittea", "postgres"]
-115 mariadb # Управляемая база данных MySQL
-116 kafka # Сервис создания кластера Apache Kafka
-117 nifi # ETL-система
-119 Akhq # Web интерфейс Akhq для работы с Apache Kafka
-120 clickhouse # Управляемая база данных ClickHouse
-149 valoTenant # Корпоративная система обмена и синхронизации файлов
-150 k8sSthutrvalCluster # Платформа управления K8s
+97 nodered # NodeRed
+96 pgadmin # pgAdmin
+95 nodejs # NodeJS
+94 lucee # Lucee
+93 rabbitmq # RabbitMQ
+92 mongodb # MongoDB
+91 redis # Redis
+90 postgres # PostgreSQL
+89 flask # Web-сервер с фреймворком Flask
+88 k8sZitiController # k8sZitiController
+86 k8sVelero # Velero
+82 harbor # Container Registry
+81 superset # Apache Superset
+50 nextcloud # Nextcloud
+32 vmpostgre # vc_vm_postgresql_std
+29 vcVdcGroup # Группа датацентров
+28 vc_vm_v3 # Виртуальная машина
+27 vc_vm_v2 # VM в Cloud Director (vc_vmV2)
+26 vapp # Виртуальный каталог ВМ (vApp)
+25 vcexternalip # Публичные IP адреса
+24 svc24 # DEPRECATED Правила маршрутизации для VM (vc_nat)
+23 vc_vm # VM в Cloud Director (старый формат) (vc_vm)
+22 vc_nsxt # Сетевой шлюз периметра (Edge)
+21 vc_vdc # Виртуальный датацентр (vDC)
+20 vcOrgSaas # Организация [DEPRECATED]
+19 vcOrg # Организация в Cloud Director
+13 s3bucket # S3 бакет
+12 s3 # S3 Object Storage
+2 template # Темплейт k8s
+1 dummy # Болванка
diff --git a/TOOLS/docs-generator/main.go b/TOOLS/docs-generator/main.go
index 72f8e6d..a73dde3 100644
--- a/TOOLS/docs-generator/main.go
+++ b/TOOLS/docs-generator/main.go
@@ -24,7 +24,9 @@ func main() {
servicesListFlag := flag.String("services", "", "Path to TOOLS/config/{stand}/services_list.txt")
excludeFlag := flag.String("exclude", "", "Comma-separated resource names to skip")
versionFlag := flag.String("version", "", "Provider version for example block")
- apiEndpointFlag := flag.String("api-endpoint", "https://deck-api.ngcloud.ru/api/v1/index.cfm", "API endpoint for example block")
+ // ⛔ LEGACY DEFAULT (index.cfm) — переопределяется через NUBES_API_ENDPOINT в profile.env.
+ // Никогда не использовать deck-api.ngcloud.ru напрямую.
+ apiEndpointFlag := flag.String("api-endpoint", "https://lk-api-gateway.ngcloud.ru/api/v1/svc", "API endpoint for example block")
opsFlag := flag.Bool("ops", false, "Generate per-service operations docs (resources_ops_yaml → docs/.../operations)")
flag.Parse()
diff --git a/TOOLS/lib/types.go b/TOOLS/lib/types.go
index cc38ac7..b71d128 100644
--- a/TOOLS/lib/types.go
+++ b/TOOLS/lib/types.go
@@ -74,4 +74,7 @@ type ParamSpec struct {
// === Генератор-специфичные поля (не сериализуются в YAML) ===
IsModifiable *bool `yaml:"is_modifiable,omitempty"`
IsSensitive bool `yaml:"is_sensitive,omitempty"`
+ // SubParams — подполя для map-fixed/array-map-fixed параметров.
+ // Заполняется из dataDescriptor при генерации YAML.
+ SubParams []ParamSpec `yaml:"sub_params,omitempty"`
}
diff --git a/TOOLS/scripts/01_generate_yamls.sh b/TOOLS/scripts/01_generate_yamls.sh
index 5aa8bb6..d9c216b 100755
--- a/TOOLS/scripts/01_generate_yamls.sh
+++ b/TOOLS/scripts/01_generate_yamls.sh
@@ -105,7 +105,8 @@ if [[ ! -f "$SERVICES_FILE" ]]; then
exit 2
fi
-API_ENDPOINT="${NUBES_API_ENDPOINT:-https://deck-api.ngcloud.ru/api/v1/index.cfm}"
+# ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Default = Gateway. Override via NUBES_API_ENDPOINT.
+API_ENDPOINT="${NUBES_API_ENDPOINT:-https://lk-api-gateway.ngcloud.ru/api/v1/svc}"
# Auto-detect API style: if endpoint contains "index.cfm" → legacy proxy (?endpoint=),
# otherwise → new REST gateway (direct paths). No forced /index.cfm normalization.
diff --git a/TOOLS/scripts/02_generate_resources_and_docs_v2.sh b/TOOLS/scripts/02_generate_resources_and_docs_v2.sh
index 006776b..5becd55 100755
--- a/TOOLS/scripts/02_generate_resources_and_docs_v2.sh
+++ b/TOOLS/scripts/02_generate_resources_and_docs_v2.sh
@@ -92,7 +92,8 @@ mkdir -p "$DOCS_DIR"
# Determine API endpoint for doc examples.
# Use NUBES_API_ENDPOINT from profile.env, fall back to production default.
-DOCS_API_ENDPOINT="${NUBES_API_ENDPOINT:-https://deck-api.ngcloud.ru/api/v1/index.cfm}"
+# ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Default = Gateway. Override via NUBES_API_ENDPOINT.
+DOCS_API_ENDPOINT="${NUBES_API_ENDPOINT:-https://lk-api-gateway.ngcloud.ru/api/v1/svc}"
# If endpoint looks like new REST gateway (no index.cfm), keep as-is.
# If it's old-style without index.cfm, append it for backward compat in docs.
if [[ "$DOCS_API_ENDPOINT" != *"/index.cfm"* ]] && [[ "$DOCS_API_ENDPOINT" != *"/svc"* ]]; then
diff --git a/TOOLS/scripts/04_build_and_publish_docs.sh b/TOOLS/scripts/04_build_and_publish_docs.sh
index 4d053c8..8d7d00d 100755
--- a/TOOLS/scripts/04_build_and_publish_docs.sh
+++ b/TOOLS/scripts/04_build_and_publish_docs.sh
@@ -9,8 +9,9 @@ PROFILE_DIR="${PROFILE_DIR:-}"
normalize_api_endpoint() {
local endpoint="$1"
endpoint="${endpoint%/}"
+ # ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ.
if [[ -z "$endpoint" ]]; then
- echo "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ echo "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
return
fi
# Keep as-is: both legacy proxy (index.cfm) and new REST gateway are valid.
@@ -84,7 +85,8 @@ if [[ -n "$PROFILE_DIR" ]]; then
fi
fi
-DOCS_API_ENDPOINT="${NUBES_API_ENDPOINT:-https://deck-api.ngcloud.ru/api/v1/index.cfm}"
+# ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Default = Gateway.
+DOCS_API_ENDPOINT="${NUBES_API_ENDPOINT:-https://lk-api-gateway.ngcloud.ru/api/v1/svc}"
DOCS_API_ENDPOINT="$(normalize_api_endpoint "$DOCS_API_ENDPOINT")"
if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then
diff --git a/TOOLS/yaml-generator/internal/client/client.go b/TOOLS/yaml-generator/internal/client/client.go
index 9e7af6d..2f68319 100644
--- a/TOOLS/yaml-generator/internal/client/client.go
+++ b/TOOLS/yaml-generator/internal/client/client.go
@@ -51,9 +51,12 @@ func (c *Client) GetService(serviceID int) (types.ServiceInfo, error) {
return res.Service, nil
}
-// GetServiceOperation получает детали операции (параметры + MAN).
+// GetServiceOperation получает детали операции (параметры + dataDescriptor + valueList).
+// Использует /instanceOperations/default/{id} — метод Виталия (15.07.2026).
+// Этот эндпоинт возвращает dataDescriptor (подполя map-fixed) и valueList,
+// в отличие от /serviceOperation/{id} который даёт только плоский список.
func (c *Client) GetServiceOperation(svcOperationID int) (types.ServiceOperationInfo, error) {
- endpoint := fmt.Sprintf("/serviceOperation/%d", svcOperationID)
+ endpoint := fmt.Sprintf("/instanceOperations/default/%d", svcOperationID)
var res types.ServiceOperationResponse
if err := c.callAPI(endpoint, &res); err != nil {
return types.ServiceOperationInfo{}, err
@@ -84,7 +87,9 @@ func (c *Client) callAPI(endpoint string, out interface{}) error {
if c.token != "" {
req.Header.Set("Authorization", "Bearer "+c.token)
}
- req.Header.Set("User-Agent", "Mozilla/5.0 (compatible; Terraform-Provider-Nubes/Generator)")
+ // DDoS-Guard требует браузерный User-Agent ВСЕГДА (и старый, и новый API).
+ req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36")
+ req.Header.Set("Referer", c.refererFromEndpoint())
resp, err := c.httpClient.Do(req)
if err != nil {
lastErr = err
@@ -123,6 +128,26 @@ func (c *Client) isProxyAPI() bool {
return strings.Contains(c.endpoint, "index.cfm")
}
+// refererFromEndpoint извлекает Referer из URL API (DDoS-Guard).
+// lk-api-gateway-test.ngcloud.ru → https://deck-test.ngcloud.ru/
+// lk-api-gateway.ngcloud.ru → https://deck.ngcloud.ru/
+func (c *Client) refererFromEndpoint() string {
+ ep := c.endpoint
+ if strings.HasPrefix(ep, "https://") {
+ ep = ep[8:]
+ } else if strings.HasPrefix(ep, "http://") {
+ ep = ep[7:]
+ }
+ host := ep
+ if idx := strings.Index(host, "/"); idx >= 0 {
+ host = host[:idx]
+ }
+ // lk-api-gateway-stand → deck-stand, lk-api-gateway → deck
+ refererHost := strings.Replace(host, "lk-api-gateway-", "deck-", 1)
+ refererHost = strings.Replace(refererHost, "lk-api-gateway.", "deck.", 1)
+ return "https://" + refererHost + "/"
+}
+
// CollectOperations собирает и классифицирует все операции сервиса.
func (c *Client) CollectOperations(ops []types.OperationInfo) ([]types.OperationSpec, bool, bool, bool, error) {
result := make([]types.OperationSpec, 0, len(ops))
@@ -140,7 +165,7 @@ func (c *Client) CollectOperations(ops []types.OperationInfo) ([]types.Operation
}
params := make([]types.ParamSpec, 0, len(opInfo.CfsParams))
for _, p := range opInfo.CfsParams {
- params = append(params, types.ParamSpec{
+ param := types.ParamSpec{
ID: p.ID,
Code: p.Code,
DataType: strings.TrimSpace(p.DataType),
@@ -161,7 +186,32 @@ func (c *Client) CollectOperations(ops []types.OperationInfo) ([]types.Operation
DependsOn: p.DependsOnCfsParams,
IsModifiable: p.IsModifiable,
IsSensitive: p.IsSensitive,
- })
+ }
+
+ // Разворачиваем dataDescriptor в SubParams (подполя map-fixed/array-map-fixed).
+ if len(p.DataDescriptor) > 0 {
+ subParams := make([]types.ParamSpec, 0, len(p.DataDescriptor))
+ for code, sub := range p.DataDescriptor {
+ subParams = append(subParams, types.ParamSpec{
+ ID: sub.SubParamID,
+ Code: code,
+ DataType: strings.TrimSpace(sub.DataType),
+ Required: sub.IsRequired,
+ Default: normalizeDefault(sub.DefaultValue),
+ // valueList в dataDescriptor — может быть строкой (comma-sep) или массивом
+ ValueList: normalizeSubValueList(sub.ValueList),
+ Descr: strings.TrimSpace(sub.Descr),
+ Man: strings.TrimSpace(sub.Man),
+ Regex: strings.TrimSpace(sub.Regex),
+ // isModifiableDefinition → IsModifiable
+ IsModifiable: boolPtr(sub.IsModifiableDefinition),
+ IsSensitive: sub.IsSensitive,
+ })
+ }
+ param.SubParams = subParams
+ }
+
+ params = append(params, param)
}
sort.Slice(params, func(i, j int) bool { return params[i].ID < params[j].ID })
@@ -232,3 +282,48 @@ func normalizeDefault(value interface{}) interface{} {
return value
}
}
+
+// normalizeSubValueList — приводит valueList из dataDescriptor к []string.
+// API может вернуть строку (comma-separated), массив, или null.
+func normalizeSubValueList(v interface{}) []string {
+ if v == nil {
+ return nil
+ }
+ switch t := v.(type) {
+ case string:
+ return splitCommaList(t)
+ case []interface{}:
+ out := make([]string, 0, len(t))
+ for _, item := range t {
+ out = append(out, fmt.Sprintf("%v", item))
+ }
+ return out
+ default:
+ return nil
+ }
+}
+
+// splitCommaList — разбивает comma-separated строку из dataDescriptor в []string.
+func splitCommaList(s string) []string {
+ s = strings.TrimSpace(s)
+ if s == "" {
+ return nil
+ }
+ parts := strings.Split(s, ",")
+ out := make([]string, 0, len(parts))
+ for _, p := range parts {
+ p = strings.TrimSpace(p)
+ if p != "" {
+ out = append(out, p)
+ }
+ }
+ if len(out) == 0 {
+ return nil
+ }
+ return out
+}
+
+// boolPtr — возвращает указатель на bool.
+func boolPtr(b bool) *bool {
+ return &b
+}
diff --git a/TOOLS/yaml-generator/internal/config/config.go b/TOOLS/yaml-generator/internal/config/config.go
index a519737..64bca67 100644
--- a/TOOLS/yaml-generator/internal/config/config.go
+++ b/TOOLS/yaml-generator/internal/config/config.go
@@ -30,7 +30,7 @@ type ServiceRef struct {
// Load читает конфигурацию из переменных окружения и файлов.
func Load() (Config, error) {
- apiEndpoint := getenvDefault("NUBES_API_ENDPOINT", "https://deck-api.ngcloud.ru/api/v1/index.cfm")
+ apiEndpoint := getenvDefault("NUBES_API_ENDPOINT", "https://lk-api-gateway.ngcloud.ru/api/v1/svc")
apiEndpoint = normalize.APIEndpoint(apiEndpoint)
apiToken, err := loadToken()
if err != nil {
diff --git a/TOOLS/yaml-generator/internal/types/types.go b/TOOLS/yaml-generator/internal/types/types.go
index 9b6a0d0..6ca216b 100644
--- a/TOOLS/yaml-generator/internal/types/types.go
+++ b/TOOLS/yaml-generator/internal/types/types.go
@@ -63,6 +63,33 @@ type CfsParam struct {
DependsOnCfsParams interface{} `json:"dependsOnCfsParams"`
IsModifiable *bool `json:"isModifiable"`
IsSensitive bool `json:"isSensitive"`
+ // DataDescriptor — подполя для map-fixed/array-map-fixed параметров.
+ // Ключ — код подполя (например "cpu"), значение — метаданные подполя.
+ // Доступно только через /instanceOperations/default/{id}.
+ DataDescriptor map[string]CfsSubParam `json:"dataDescriptor"`
+}
+
+// CfsSubParam — подполе map-fixed параметра из dataDescriptor.
+type CfsSubParam struct {
+ SubParamID int `json:"svcOperationCfsSubparamId"`
+ Code string `json:"svcOperationCfsSubparam"`
+ DataType string `json:"dataType"`
+ ValueList interface{} `json:"valueList"` // string (comma-sep) or array
+ IsRequired bool `json:"isRequired"`
+ IsModifiableDefinition bool `json:"isModifiableDefinition"`
+ IsSensitive bool `json:"isSensitive"`
+ IsHidden bool `json:"isHidden"`
+ DefaultValue interface{} `json:"defaultValue"`
+ Descr string `json:"descr"`
+ Man string `json:"man"`
+ Label string `json:"label"`
+ Regex string `json:"regex"`
+ Expression string `json:"expression"`
+ MaxLength interface{} `json:"maxlength"`
+ MinLength interface{} `json:"minlength"`
+ RefSvcID interface{} `json:"refSvcId"`
+ UniqueScope string `json:"uniqueScope"`
+ DependsOnCfsParams interface{} `json:"dependsOnCfsParams"`
}
// ─── YAML-типы (алиасы к lib — общий контракт) ─────────────────────────────
diff --git a/apis.txt b/apis.txt
new file mode 100644
index 0000000..1e5db09
--- /dev/null
+++ b/apis.txt
@@ -0,0 +1,14 @@
+# ⛔⛔⛔ LEGACY — СТАРЫЕ API ЗАКРЫВАЮТСЯ ⛔⛔⛔
+# НИКОГДА не использовать для генерации! Только для справки.
+# Актуальные API:
+# https://lk-api-gateway.ngcloud.ru/api/v1/svc (prod)
+# https://lk-api-gateway-dev.ngcloud.ru/api/v1/svc (dev)
+# https://lk-api-gateway-test.ngcloud.ru/api/v1/svc (test)
+#
+# === НИЖЕ — ЛЕГАСИ, НЕ ИСПОЛЬЗОВАТЬ ===
+
+https://deck-api.ngcloud.ru/api/v1
+
+https://deck-api-dev.ngcloud.ru/api/v1
+
+https://deck-api-test.ngcloud.ru/api/v1
\ No newline at end of file
diff --git a/docs/00_overview/for_nomo_chat.md b/docs/00_overview/for_nomo_chat.md
index 748fd51..f0b92ac 100644
--- a/docs/00_overview/for_nomo_chat.md
+++ b/docs/00_overview/for_nomo_chat.md
@@ -1,3 +1,5 @@
+
+
# Сводка по разработке Terraform-провайдера Nubes
Дата: 2026-01-22
@@ -111,7 +113,8 @@ curl -s -X POST "https://keycloak.nubes.ru/realms/cloud/protocol/openid-connect/
```
- Проверка API:
```bash
-curl -H "Authorization: Bearer $TOKEN" https://deck-api.ngcloud.ru/api/v1/index.cfm/instances
+# ⛔ LEGACY: в примере ниже deck-api заменён на Gateway.
+curl -H "Authorization: Bearer $TOKEN" https://lk-api-gateway.ngcloud.ru/api/v1/svc/instances
```
---
diff --git a/docs/20_discovery/development-journey.md b/docs/20_discovery/development-journey.md
index cec2f6c..428d475 100644
--- a/docs/20_discovery/development-journey.md
+++ b/docs/20_discovery/development-journey.md
@@ -1,5 +1,8 @@
# Terraform Provider для Nubes Cloud - История разработки
+
+
+
**Дата**: 21 января 2026
**Проект**: terraform-provider-mycloud
**Цель**: Создание Terraform Provider для управления ресурсами в облачной платформе Nubes
diff --git a/docs/20_discovery/postgres-service.md b/docs/20_discovery/postgres-service.md
index 3859865..ae36772 100644
--- a/docs/20_discovery/postgres-service.md
+++ b/docs/20_discovery/postgres-service.md
@@ -1,3 +1,4 @@
+
# PostgreSQL Service Analysis & Implementation Plan
**Date:** 2026-01-27
diff --git a/docs/20_discovery/resource_realms_available.md b/docs/20_discovery/resource_realms_available.md
index 26f7056..144bb8f 100644
--- a/docs/20_discovery/resource_realms_available.md
+++ b/docs/20_discovery/resource_realms_available.md
@@ -1,3 +1,4 @@
+
# Resource Realm: универсальное определение через API
## Зачем это нужно
diff --git a/docs/20_discovery/vm_service.md b/docs/20_discovery/vm_service.md
index f4afd48..cc40432 100644
--- a/docs/20_discovery/vm_service.md
+++ b/docs/20_discovery/vm_service.md
@@ -1,3 +1,4 @@
+
# VM Service Discovery & Implementation Details
## Обзор
diff --git a/docs/30_registry/guides/getting-started.md b/docs/30_registry/guides/getting-started.md
index 56ee017..aedee15 100644
--- a/docs/30_registry/guides/getting-started.md
+++ b/docs/30_registry/guides/getting-started.md
@@ -31,7 +31,8 @@ terraform {
}
provider "nubes" {
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ # ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Использовать lk-api-gateway.
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
api_token = var.api_token
}
diff --git a/docs/30_registry/guides/s3-bucket-notifications.md b/docs/30_registry/guides/s3-bucket-notifications.md
index d125dd6..c488a3d 100644
--- a/docs/30_registry/guides/s3-bucket-notifications.md
+++ b/docs/30_registry/guides/s3-bucket-notifications.md
@@ -1,3 +1,4 @@
+
# S3 Bucket Notifications: изменения в бакете и вызов функции
## Короткий ответ
diff --git a/docs/30_registry/resources/akhq_example.md b/docs/30_registry/resources/akhq_example.md
index 0988321..7521bd2 100644
--- a/docs/30_registry/resources/akhq_example.md
+++ b/docs/30_registry/resources/akhq_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_akhq" "baza" {
resource_realm = "TODO" # Выбрать платформу из списка
diff --git a/docs/30_registry/resources/dnsrecord_example.md b/docs/30_registry/resources/dnsrecord_example.md
index f928e49..df3fb46 100644
--- a/docs/30_registry/resources/dnsrecord_example.md
+++ b/docs/30_registry/resources/dnsrecord_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_dnsrecord" "baza" {
zone_uid = "TODO" # UUID экземпляра услуги DNS-зоны
diff --git a/docs/30_registry/resources/dnszone_example.md b/docs/30_registry/resources/dnszone_example.md
index 2c3221b..5054488 100644
--- a/docs/30_registry/resources/dnszone_example.md
+++ b/docs/30_registry/resources/dnszone_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_dnszone" "baza" {
zone_email = "TODO" # Контактный e-mail
diff --git a/docs/30_registry/resources/dummy_example.md b/docs/30_registry/resources/dummy_example.md
index a16ce94..9699faa 100644
--- a/docs/30_registry/resources/dummy_example.md
+++ b/docs/30_registry/resources/dummy_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_dummy" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/flask_example.md b/docs/30_registry/resources/flask_example.md
index ccb025d..11f4475 100644
--- a/docs/30_registry/resources/flask_example.md
+++ b/docs/30_registry/resources/flask_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_flask" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/gitea_complex_example.md b/docs/30_registry/resources/gitea_complex_example.md
index e181536..997d4aa 100644
--- a/docs/30_registry/resources/gitea_complex_example.md
+++ b/docs/30_registry/resources/gitea_complex_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_gitea_complex" "baza" {
}
diff --git a/docs/30_registry/resources/gitea_example.md b/docs/30_registry/resources/gitea_example.md
index a2e2329..f49c193 100644
--- a/docs/30_registry/resources/gitea_example.md
+++ b/docs/30_registry/resources/gitea_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_gitea" "baza" {
psql_uid = "TODO" # UUID Услуги k8sPgsql. Пользователя techGitea, базу данных gitea создаёт автоматически
diff --git a/docs/30_registry/resources/harbor_example.md b/docs/30_registry/resources/harbor_example.md
index de86fb9..80cc74c 100644
--- a/docs/30_registry/resources/harbor_example.md
+++ b/docs/30_registry/resources/harbor_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_harbor" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/http_example.md b/docs/30_registry/resources/http_example.md
index 414a7a3..30faee4 100644
--- a/docs/30_registry/resources/http_example.md
+++ b/docs/30_registry/resources/http_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_http" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/k8s_sthutrval_cluster_example.md b/docs/30_registry/resources/k8s_sthutrval_cluster_example.md
index 52cfd66..ae04139 100644
--- a/docs/30_registry/resources/k8s_sthutrval_cluster_example.md
+++ b/docs/30_registry/resources/k8s_sthutrval_cluster_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_k8s_sthutrval_cluster" "baza" {
nsxt_uid = "TODO" # InstanceUid nsxt. Nsxt должен быть создан
diff --git a/docs/30_registry/resources/k8s_ziti_controller_example.md b/docs/30_registry/resources/k8s_ziti_controller_example.md
index 3579762..a55d0ed 100644
--- a/docs/30_registry/resources/k8s_ziti_controller_example.md
+++ b/docs/30_registry/resources/k8s_ziti_controller_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_k8s_ziti_controller" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/kafka_example.md b/docs/30_registry/resources/kafka_example.md
index eb7f444..69688ff 100644
--- a/docs/30_registry/resources/kafka_example.md
+++ b/docs/30_registry/resources/kafka_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_kafka" "baza" {
resource_instances = 1 # Пример: `2`
diff --git a/docs/30_registry/resources/lucee_example.md b/docs/30_registry/resources/lucee_example.md
index 4041d3f..fcd5b5f 100644
--- a/docs/30_registry/resources/lucee_example.md
+++ b/docs/30_registry/resources/lucee_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_lucee" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/mariadb_example.md b/docs/30_registry/resources/mariadb_example.md
index 38ffbe5..8c1437c 100644
--- a/docs/30_registry/resources/mariadb_example.md
+++ b/docs/30_registry/resources/mariadb_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_mariadb" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/mongodb_example.md b/docs/30_registry/resources/mongodb_example.md
index 67d5518..b6d6ee7 100644
--- a/docs/30_registry/resources/mongodb_example.md
+++ b/docs/30_registry/resources/mongodb_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_mongodb" "baza" {
resource_instances = 1 # Пример: `2`
diff --git a/docs/30_registry/resources/nextcloud_example.md b/docs/30_registry/resources/nextcloud_example.md
index 9259d81..0b43662 100644
--- a/docs/30_registry/resources/nextcloud_example.md
+++ b/docs/30_registry/resources/nextcloud_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_nextcloud" "baza" {
psql_uid = "TODO"
diff --git a/docs/30_registry/resources/nifi_example.md b/docs/30_registry/resources/nifi_example.md
index c31a4c9..d54ed2f 100644
--- a/docs/30_registry/resources/nifi_example.md
+++ b/docs/30_registry/resources/nifi_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_nifi" "baza" {
kafka_uid = "TODO" # Выбрать кластер из списка
diff --git a/docs/30_registry/resources/nodejs_example.md b/docs/30_registry/resources/nodejs_example.md
index 22ea954..a4e9a69 100644
--- a/docs/30_registry/resources/nodejs_example.md
+++ b/docs/30_registry/resources/nodejs_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_nodejs" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/nodered_example.md b/docs/30_registry/resources/nodered_example.md
index 3d7d8b8..d5bd3a2 100644
--- a/docs/30_registry/resources/nodered_example.md
+++ b/docs/30_registry/resources/nodered_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_nodered" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/openwhisk_example.md b/docs/30_registry/resources/openwhisk_example.md
index 5d1e325..8bf3eb3 100644
--- a/docs/30_registry/resources/openwhisk_example.md
+++ b/docs/30_registry/resources/openwhisk_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_openwhisk" "baza" {
username = "TODO" # Имя пользователя Openwhisk
diff --git a/docs/30_registry/resources/pgadmin_example.md b/docs/30_registry/resources/pgadmin_example.md
index a91401e..22baaa4 100644
--- a/docs/30_registry/resources/pgadmin_example.md
+++ b/docs/30_registry/resources/pgadmin_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_pgadmin" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/rabbitmq_example.md b/docs/30_registry/resources/rabbitmq_example.md
index ef8c251..d3cbece 100644
--- a/docs/30_registry/resources/rabbitmq_example.md
+++ b/docs/30_registry/resources/rabbitmq_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_rabbitmq" "baza" {
resource_realm = "TODO" # Выбрать платформу из списка
diff --git a/docs/30_registry/resources/redis_example.md b/docs/30_registry/resources/redis_example.md
index 1275e0e..b678dc7 100644
--- a/docs/30_registry/resources/redis_example.md
+++ b/docs/30_registry/resources/redis_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_redis" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/s3_example.md b/docs/30_registry/resources/s3_example.md
index 06a93c8..34dd5d3 100644
--- a/docs/30_registry/resources/s3_example.md
+++ b/docs/30_registry/resources/s3_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_s3" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/s3bucket_example.md b/docs/30_registry/resources/s3bucket_example.md
index 9b63f21..5bc8258 100644
--- a/docs/30_registry/resources/s3bucket_example.md
+++ b/docs/30_registry/resources/s3bucket_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_s3bucket" "baza" {
s3_user_uid = "235e0546-..." # UID Корневой услуги S3. На основе него будет создан бакет.
diff --git a/docs/30_registry/resources/superset_example.md b/docs/30_registry/resources/superset_example.md
index 07dd290..7a7eafc 100644
--- a/docs/30_registry/resources/superset_example.md
+++ b/docs/30_registry/resources/superset_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_superset" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/template_example.md b/docs/30_registry/resources/template_example.md
index 94e180c..79a47eb 100644
--- a/docs/30_registry/resources/template_example.md
+++ b/docs/30_registry/resources/template_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_template" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/tenant_example.md b/docs/30_registry/resources/tenant_example.md
index e92c451..be36e86 100644
--- a/docs/30_registry/resources/tenant_example.md
+++ b/docs/30_registry/resources/tenant_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_tenant" "baza" {
grafana_org_name = "TODO" # WZ-Код клиента
diff --git a/docs/30_registry/resources/valo_tenant_example.md b/docs/30_registry/resources/valo_tenant_example.md
index e034d81..2ddb9a7 100644
--- a/docs/30_registry/resources/valo_tenant_example.md
+++ b/docs/30_registry/resources/valo_tenant_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_valo_tenant" "baza" {
resource_realm = "TODO"
diff --git a/docs/30_registry/resources/vapp_example.md b/docs/30_registry/resources/vapp_example.md
index 724d9ed..bb266ed 100644
--- a/docs/30_registry/resources/vapp_example.md
+++ b/docs/30_registry/resources/vapp_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vapp" "baza" {
nsxt_uid = "TODO" # UUID Услуги `Сетевой шлюз периметра (Edge)`
diff --git a/docs/30_registry/resources/vc_complex_example.md b/docs/30_registry/resources/vc_complex_example.md
index 2f070f9..05f8e92 100644
--- a/docs/30_registry/resources/vc_complex_example.md
+++ b/docs/30_registry/resources/vc_complex_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vc_complex" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/vc_nsxt_example.md b/docs/30_registry/resources/vc_nsxt_example.md
index 8823b16..8778e08 100644
--- a/docs/30_registry/resources/vc_nsxt_example.md
+++ b/docs/30_registry/resources/vc_nsxt_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vc_nsxt" "baza" {
diff --git a/docs/30_registry/resources/vc_org_example.md b/docs/30_registry/resources/vc_org_example.md
index 9d55ae6..14605c5 100644
--- a/docs/30_registry/resources/vc_org_example.md
+++ b/docs/30_registry/resources/vc_org_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vc_org" "baza" {
resource_realm = "TODO" # Облако в котором будет развёрнут тенант
diff --git a/docs/30_registry/resources/vc_org_saas_example.md b/docs/30_registry/resources/vc_org_saas_example.md
index e2f6f34..8184286 100644
--- a/docs/30_registry/resources/vc_org_saas_example.md
+++ b/docs/30_registry/resources/vc_org_saas_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vc_org_saas" "baza" {
resource_realm = "TODO" # Платформа для развертывания
diff --git a/docs/30_registry/resources/vc_vdc_example.md b/docs/30_registry/resources/vc_vdc_example.md
index 9337f61..96e7852 100644
--- a/docs/30_registry/resources/vc_vdc_example.md
+++ b/docs/30_registry/resources/vc_vdc_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vc_vdc" "baza" {
organization_uid = "TODO" # Для создания VDC предварительно необходимо создать организацию через услугу `Организация в Cloud Director`
diff --git a/docs/30_registry/resources/vc_vdc_group_example.md b/docs/30_registry/resources/vc_vdc_group_example.md
index 2b33c40..ee8efe3 100644
--- a/docs/30_registry/resources/vc_vdc_group_example.md
+++ b/docs/30_registry/resources/vc_vdc_group_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vc_vdc_group" "baza" {
vdc_uid = "TODO"
diff --git a/docs/30_registry/resources/vc_vm_example.md b/docs/30_registry/resources/vc_vm_example.md
index 7e3c84e..0843937 100644
--- a/docs/30_registry/resources/vc_vm_example.md
+++ b/docs/30_registry/resources/vc_vm_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vc_vm" "baza" {
vapp_uid = "TODO" # InstanceUid vApp. vApp должен быть создан
diff --git a/docs/30_registry/resources/vc_vm_v2_example.md b/docs/30_registry/resources/vc_vm_v2_example.md
index dd8c4c0..ca921a9 100644
--- a/docs/30_registry/resources/vc_vm_v2_example.md
+++ b/docs/30_registry/resources/vc_vm_v2_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vc_vm_v2" "baza" {
diff --git a/docs/30_registry/resources/vc_vm_v3_example.md b/docs/30_registry/resources/vc_vm_v3_example.md
index dcde862..88c5579 100644
--- a/docs/30_registry/resources/vc_vm_v3_example.md
+++ b/docs/30_registry/resources/vc_vm_v3_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vc_vm_v3" "baza" {
vapp_uid = "TODO"
diff --git a/docs/30_registry/resources/vcexternalip_example.md b/docs/30_registry/resources/vcexternalip_example.md
index b8211e4..fae5ddb 100644
--- a/docs/30_registry/resources/vcexternalip_example.md
+++ b/docs/30_registry/resources/vcexternalip_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vcexternalip" "baza" {
service_uid = "TODO"
diff --git a/docs/30_registry/resources/vmpostgre_example.md b/docs/30_registry/resources/vmpostgre_example.md
index 934636b..154b121 100644
--- a/docs/30_registry/resources/vmpostgre_example.md
+++ b/docs/30_registry/resources/vmpostgre_example.md
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" {
api_token = "token_***"
- api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ api_endpoint = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
}
resource "nubes_vmpostgre" "baza" {
vdc_uid = "TODO" # InstanceUid vdc. Vdc должен быть создан
diff --git a/docs/40_analysis/postgres_backend_bugs_2026-02-28.md b/docs/40_analysis/postgres_backend_bugs_2026-02-28.md
index 219736f..fd8b674 100644
--- a/docs/40_analysis/postgres_backend_bugs_2026-02-28.md
+++ b/docs/40_analysis/postgres_backend_bugs_2026-02-28.md
@@ -1,3 +1,4 @@
+
# PostgreSQL backend bugs (2026-02-28)
## Scope
diff --git a/docs/70_api/api-discovery-algorithms.md b/docs/70_api/api-discovery-algorithms.md
index 5c17aa8..df405ba 100644
--- a/docs/70_api/api-discovery-algorithms.md
+++ b/docs/70_api/api-discovery-algorithms.md
@@ -33,30 +33,84 @@
---
-## 3. Обнаружение схемы параметров для сервиса (Parameter Scheme Discovery)
+## 3. Обнаружение схемы параметров для сервиса (метод Виталия)
-Поскольку прямого эндпоинта со списком всех определений параметров нет, используется паттерн "Черновик операции".
+> **Это канонический метод получения ВСЕХ параметров, включая подполя map-fixed.**
+> Источник: Виталий Зайцев (DevOps Nubes), 15.07.2026.
-### Шаг А: Создание черновика
-1. **Запрос:** `POST /v1/index.cfm/instanceOperations`
-2. **Тело:**
- ```json
- {
- "operation": "create",
- "serviceId": ,
- "instanceUid": null
- }
- ```
-3. **Результат:** Заголовок `Location` или тело ответа содержат `instanceOperationUid` (UUID).
+### Три шага — полный список параметров без создания инстанса:
-### Шаг Б: Получение метаданных параметров
-1. **Запрос:** `GET /v1/index.cfm/instanceOperations/{instanceOperationUid}?fields=cfsParams`
-2. **Анализ `cfsParams`:**
- - `svcOperationCfsParamId`: Числовой ID параметра (например, `8`). **Критично для работы провайдера.**
- - `label`: Имя поля в UI (например, "UUID VDC").
- - `dataType`: Тип (`string`, `boolean`, `list`, `uuid`).
- - `isRequired`: Обязательность.
- - `descr`: Подсказка по заполнению.
+**Шаг 1: найти svcId по имени сервиса**
+```bash
+curl -s -H "Authorization: Bearer $TOKEN" $URL/services | jq '.results[] | select(.svc == "ApacheKafka") | .svcId'
+# → 116
+```
+
+**Шаг 2: найти svcOperationId нужной операции**
+```bash
+curl -s -H "Authorization: Bearer $TOKEN" $URL/services/116 | jq '.svc.operations[] | select(.operation == "create") | .svcOperationId'
+# → 148
+```
+
+**Шаг 3: получить параметры с подполями и допустимыми значениями**
+```bash
+curl -s -H "Authorization: Bearer $TOKEN" $URL/instanceOperations/default/148 | jq '.svcOperation.cfsParams[]'
+```
+
+### Почему `/instanceOperations/default/{id}` а не `/serviceOperation/{id}`:
+
+| Данные | `/serviceOperation/{id}` | `/instanceOperations/default/{id}` |
+|--------|--------------------------|-------------------------------------|
+| ID, code, тип, isRequired | ✅ | ✅ |
+| `valueList` (допустимые значения) | ❌ | ✅ `['false','true']`, `['HOT','COLD']` |
+| `dataDescriptor` (подполя map-fixed) | ❌ | ✅ cpu, memory, replicas, disk... |
+| `isModifiable` | ❌ | ✅ на уровне подполей |
+| `regex`, `maxLength`, `minValue`... | ❌ | ✅ |
+| `isSensitive` | ❌ | ✅ |
+
+### Структура dataDescriptor (подполя map-fixed):
+
+```json
+{
+ "svcOperationCfsParamId": 788,
+ "svcOperationCfsParam": "clusterConfiguration",
+ "dataType": "map-fixed",
+ "dataDescriptor": {
+ "cpu": {
+ "svcOperationCfsSubparamId": 109,
+ "dataType": "integer > 0",
+ "isRequired": true,
+ "valueList": ""
+ },
+ "replicas": {
+ "svcOperationCfsSubparamId": 135,
+ "dataType": "integer > 0",
+ "isRequired": true,
+ "valueList": "1,3,5,7"
+ }
+ }
+}
+```
+
+### Формат valueList:
+
+- Для **верхнеуровневых** параметров: JSON-массив `["false", "true"]`
+- Для **подполей** dataDescriptor: comma-separated строка `"1,3,5,7"`
+- Для `boolean`: всегда `"false,true"` или `["false","true"]`
+
+### URL для разных стендов:
+
+| Стенд | Базовый URL |
+|-------|-------------|
+| test (новый Gateway) | `https://lk-api-gateway-test.ngcloud.ru/api/v1/svc` |
+| test (старый proxy) | `https://deck-api-test.ngcloud.ru/api/v1/index.cfm?endpoint=` |
+| dev | `https://deck-api-dev.ngcloud.ru/api/v1/index.cfm?endpoint=` |
+| prod | `https://deck-api.ngcloud.ru/api/v1/index.cfm?endpoint=` |
+
+### Старый метод (через черновик) — НЕ ИСПОЛЬЗОВАТЬ:
+
+Ранее использовался паттерн "Черновик операции" (POST /instanceOperations → GET с ?fields=cfsParams).
+Он НЕ даёт dataDescriptor и valueList. Вместо него использовать `/instanceOperations/default/{id}`.
---
diff --git a/docs/70_api/api_analysis/DOC_AI_AGENT_EN.md b/docs/70_api/api_analysis/DOC_AI_AGENT_EN.md
index 089d128..e6ccc94 100644
--- a/docs/70_api/api_analysis/DOC_AI_AGENT_EN.md
+++ b/docs/70_api/api_analysis/DOC_AI_AGENT_EN.md
@@ -1,7 +1,7 @@
# Taffy API Technical Manual for AI Agents
## 1. Authentication & Security
-**Base URL**: `https://deck-api.ngcloud.ru/api/v1/index.cfm`
+**Base URL**: `https://lk-api-gateway.ngcloud.ru/api/v1/svc`
All requests MUST include these headers (as indicated by CORS `access-control-allow-headers`):
- `Authorization`: `Bearer `
diff --git a/docs/ARCHITECTURE_NEW.md b/docs/ARCHITECTURE_NEW.md
index ac0f73c..73f6ae6 100644
--- a/docs/ARCHITECTURE_NEW.md
+++ b/docs/ARCHITECTURE_NEW.md
@@ -1,3 +1,4 @@
+
# Universal Rebuild — Архитектура и рабочая цепочка (актуально)
Документ для нового чата: описывает, как устроено «универсальное ядро», как формируются YAML‑спеки сервисов и как генерируются Go‑ресурсы. Учитывает ошибки/уроки из текущего чата.
diff --git a/docs/CHAT_RESUME_NEW.md b/docs/CHAT_RESUME_NEW.md
index 873aaad..fe9c808 100644
--- a/docs/CHAT_RESUME_NEW.md
+++ b/docs/CHAT_RESUME_NEW.md
@@ -1,3 +1,4 @@
+
# Резюме для нового чата (подробно)
## Контекст
diff --git a/docs/CODEBASE_ANALYSIS_AND_ROADMAP.md b/docs/CODEBASE_ANALYSIS_AND_ROADMAP.md
index 3139ee4..1c558ca 100644
--- a/docs/CODEBASE_ANALYSIS_AND_ROADMAP.md
+++ b/docs/CODEBASE_ANALYSIS_AND_ROADMAP.md
@@ -1,3 +1,4 @@
+
# Полный анализ кодовой базы и план развития
**Дата:** 2026-03-13
diff --git a/docs/INSTANCE_STATES.md b/docs/INSTANCE_STATES.md
index d0f01bd..935fe8c 100644
--- a/docs/INSTANCE_STATES.md
+++ b/docs/INSTANCE_STATES.md
@@ -1,3 +1,4 @@
+
# Матрица состояний ресурсов в облаке ngcloud
## Основные параметры состояния
diff --git a/docs/README.md b/docs/README.md
index 540f049..2e8a03e 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -8,6 +8,34 @@
- Чеклист разработки/клона: [docs/00_overview/dev-clone-checklist.md](00_overview/dev-clone-checklist.md)
- НЛИ/чат-материалы: [docs/00_overview/for_nomo_chat.md](00_overview/for_nomo_chat.md)
+## ⛔ API: как работать с токеном (читать перед любым curl!)
+
+**Токены НЕ ПРОТУХАЮТ до декабря 2026.** Они в `secrets/{dev,test,prod}.token`.
+Проверить дату: `python3 -c "import json,base64; t=open('secrets/test.token').read().split('.'); d=json.loads(base64.urlsafe_b64decode(t[1]+'==')); from datetime import datetime,timezone; print(datetime.fromtimestamp(d['exp'],tz=timezone.utc))"`
+
+**Старый API (index.cfm) — DDoS-Guard требует 3 заголовка, иначе 403:**
+```bash
+curl -s --max-time 10 \
+ -H "Authorization: Bearer $(cat secrets/test.token)" \
+ -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" \
+ -H "Referer: https://deck-test.ngcloud.ru/" \
+ "https://deck-api-test.ngcloud.ru/api/v1/index.cfm?endpoint=/services/90"
+```
+**Referer должен совпадать со стендом!** Без Referer — 403. Без User-Agent — 403.
+
+**Новый Gateway (lk-api-gateway) — только Authorization:**
+```bash
+curl -s --max-time 10 \
+ -H "Authorization: Bearer $(cat secrets/test.token)" \
+ "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc/services/90"
+```
+
+| Стенд | Старый API | Новый Gateway | Referer |
+|-------|-----------|---------------|---------|
+| test | `deck-api-test.ngcloud.ru/api/v1/index.cfm` | `lk-api-gateway-test.ngcloud.ru/api/v1/svc` | `https://deck-test.ngcloud.ru/` |
+| dev | `deck-api-dev.ngcloud.ru/api/v1/index.cfm` | `lk-api-gateway-dev.ngcloud.ru/api/v1/svc` | `https://deck-dev.ngcloud.ru/` |
+| prod | `deck-api.ngcloud.ru/api/v1/index.cfm` | `lk-api-gateway.ngcloud.ru/api/v1/svc` | `https://deck.ngcloud.ru/` |
+
## API и схемы
- Алгоритмы API-дискавери: [docs/70_api/api-discovery-algorithms.md](70_api/api-discovery-algorithms.md)
- Полный API-дамп: [docs/70_api/api_analysis/API_DOCUMENTATION_SUMMARY.md](70_api/api_analysis/API_DOCUMENTATION_SUMMARY.md)
diff --git a/docs/STATE_TRANSITIONS.md b/docs/STATE_TRANSITIONS.md
index 1d951e2..90494c9 100644
--- a/docs/STATE_TRANSITIONS.md
+++ b/docs/STATE_TRANSITIONS.md
@@ -1,3 +1,4 @@
+
# Instance State Transitions - Матрица состояний инстансов ngcloud
Полное руководство по определению состояния инстансов через API ngcloud на основе комбинаций флагов и истории операций.
diff --git a/docs/help/ai_glossary.md b/docs/help/ai_glossary.md
index 1af87a8..3ac1915 100644
--- a/docs/help/ai_glossary.md
+++ b/docs/help/ai_glossary.md
@@ -1,3 +1,4 @@
+
# AI-Agent Glossary (Search-Oriented Index)
Purpose: compact, English, link-rich glossary to help AI agents find facts fast in this repo.
diff --git a/docs/help/architecture-and-methods.md b/docs/help/architecture-and-methods.md
index 23e16f7..8b7256e 100644
--- a/docs/help/architecture-and-methods.md
+++ b/docs/help/architecture-and-methods.md
@@ -1,3 +1,4 @@
+
# Архитектура и методы (CRUD)
## 1. Актуальная архитектура (универсальный rebuild)
diff --git a/docs/help/super_glossary.md b/docs/help/super_glossary.md
index da15442..1842c16 100644
--- a/docs/help/super_glossary.md
+++ b/docs/help/super_glossary.md
@@ -1,3 +1,4 @@
+
# СУПЕРглоссарий (словарь с ссылками)
Каждый термин содержит ссылки на места употребления в документации.
diff --git a/docs/howitwasdone.md b/docs/howitwasdone.md
index f5a69f5..44359f9 100644
--- a/docs/howitwasdone.md
+++ b/docs/howitwasdone.md
@@ -1,3 +1,5 @@
+
+
# How It Was Done — Developer Guide (закрытая страница)
**Filename & Versioning:** howitwasdone.md / 2026‑02‑04 / Draft v1
@@ -76,6 +78,25 @@
## 2. База знаний ошибок
### A. Аутентификация и токены
+
+**Токены лежат в `secrets/{dev,test,prod}.token`. Срок действия — до декабря 2026.**
+Проверить дату JWT:
+```bash
+python3 -c "import json,base64; t=open('secrets/test.token').read().split('.'); d=json.loads(base64.urlsafe_b64decode(t[1]+'==')); from datetime import datetime,timezone; print(datetime.fromtimestamp(d['exp'],tz=timezone.utc))"
+```
+
+**Симптом:** 403 Forbidden (НЕ 401!)
+**Причина (старый API index.cfm):** DDoS-Guard блокирует — нет Referer или нет User-Agent.
+**Решение для curl (старый API):**
+```bash
+curl -s --max-time 10 \
+ -H "Authorization: Bearer $TOKEN" \
+ -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" \
+ -H "Referer: https://deck-test.ngcloud.ru/" \
+ "https://deck-api-test.ngcloud.ru/api/v1/index.cfm?endpoint=/services/90"
+```
+Referer должен совпадать со стендом (test/dev/prod). Новый Gateway (lk-api-gateway) требует только Authorization.
+
**Симптом:** 401 Unauthorized / Authorization header expected
**Причина:** токен истёк или не передан в окружение
**Решение:** обновить access_token и сохранить в файле HH‑MM‑SS.token; убедиться, что Terraform читает токен
diff --git a/docs/ops/API_TOKENS.md b/docs/ops/API_TOKENS.md
index bf4ae6f..c2dc9fd 100644
--- a/docs/ops/API_TOKENS.md
+++ b/docs/ops/API_TOKENS.md
@@ -1,3 +1,4 @@
+
# API Token Saga — 30.06.2026
**Дата:** 30 июня 2026
diff --git a/docs/ops/STANDS.md b/docs/ops/STANDS.md
index 5d8e97e..21ff428 100644
--- a/docs/ops/STANDS.md
+++ b/docs/ops/STANDS.md
@@ -1,3 +1,4 @@
+
# ⛔⛔⛔ ПРАВИЛА РАЗДЕЛЕНИЯ СТЕНДОВ ⛔⛔⛔
> **НАРУШЕНИЕ = УВОЛЬНЕНИЕ. Без шуток.**
diff --git a/docs/ops/TESTING.md b/docs/ops/TESTING.md
index a9b86ef..db03c28 100644
--- a/docs/ops/TESTING.md
+++ b/docs/ops/TESTING.md
@@ -1,3 +1,4 @@
+
# Testing Safety Rules
## ⛔ ЗАПРЕЩЕНО — прогонять тесты в PROD
diff --git a/docs/ops/TROUBLESHOOTING.md b/docs/ops/TROUBLESHOOTING.md
index 8e86d2c..a0df9f3 100644
--- a/docs/ops/TROUBLESHOOTING.md
+++ b/docs/ops/TROUBLESHOOTING.md
@@ -1,3 +1,4 @@
+
# Troubleshooting
## API Nubes — ошибки доступа (403, 401, IAM error)
diff --git a/docs/ops/VALIDATION_LIST_PARAMS_PLAN.md b/docs/ops/VALIDATION_LIST_PARAMS_PLAN.md
index b9f3a68..e440522 100644
--- a/docs/ops/VALIDATION_LIST_PARAMS_PLAN.md
+++ b/docs/ops/VALIDATION_LIST_PARAMS_PLAN.md
@@ -1,3 +1,4 @@
+
# План: валидация параметров с выбором из списка
Дата составления: 2026-03-25
diff --git a/provider/internal/provider/provider.go b/provider/internal/provider/provider.go
index e708611..7f136e6 100644
--- a/provider/internal/provider/provider.go
+++ b/provider/internal/provider/provider.go
@@ -98,9 +98,9 @@ func (p *NubesProvider) Configure(ctx context.Context, req provider.ConfigureReq
return
}
- // TODO(api-gateway): default is legacy proxy (index.cfm?endpoint=).
- // core.UniversalClient still uses ?endpoint= pattern — needs migration to REST paths.
- apiEndpoint := "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ // ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Использовать ТОЛЬКО lk-api-gateway.
+ // По умолчанию — Gateway. Переопределяется через NUBES_API_ENDPOINT.
+ apiEndpoint := "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
apiToken := ""
if !config.ApiEndpoint.IsNull() {
diff --git a/scripts/check_cloud_instances.py b/scripts/check_cloud_instances.py
index c6ef0d1..867ab37 100644
--- a/scripts/check_cloud_instances.py
+++ b/scripts/check_cloud_instances.py
@@ -50,7 +50,8 @@ class InstanceInfo:
class CloudInstanceChecker:
"""Проверяет статус инстансов в облаке"""
- BASE_URL = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
+ # ⛔ LEGACY: deck-api ЗАКРЫВАЕТСЯ. Использовать lk-api-gateway.
+ BASE_URL = "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
def __init__(self, token: str):
"""