svc-api: переход на Gateway (lk-api-gateway), User-Agent+Referer для DDoS-Guard, метод Виталия /instanceOperations/default/{id} с dataDescriptor, LEGACY-пометки везде

This commit is contained in:
“Naeel”
2026-07-16 13:48:34 +04:00
parent b9130fdd79
commit f5547c0465
87 changed files with 505 additions and 288 deletions
+2 -1
View File
@@ -20,6 +20,7 @@ variable "api_token" {
provider "nubes" { provider "nubes" {
api_token = var.api_token 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"
} }
+2 -1
View File
@@ -15,6 +15,7 @@ variable "api_token" {
provider "nubes" { provider "nubes" {
api_token = var.api_token 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"
} }
+2 -1
View File
@@ -11,7 +11,8 @@ terraform {
// Провайдер Nubes для создания ресурсов. // Провайдер Nubes для создания ресурсов.
provider "nubes" { provider "nubes" {
api_token = var.api_token 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. // Токен доступа к Nubes API.
-30
View File
@@ -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"
}
-41
View File
@@ -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
}
+1 -1
View File
@@ -1,5 +1,5 @@
# Stand profile: DEV # 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" TOKEN_FILE="secrets/dev.token"
# Release versions # Release versions
+49 -46
View File
@@ -1,49 +1,52 @@
# service_id service_name # RU description # 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 # # do not delete lines; to exclude a service, comment it with #
1 dummy # Болванка 175 k8sGo # Go
2 template # Темплейт k8s 163 llmAi # LLM
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)
153 nifi # Nifi 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 # Болванка
+1 -1
View File
@@ -1,5 +1,5 @@
# Stand profile: PROD # 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" TOKEN_FILE="secrets/prod.token"
# Release versions # Release versions
+46 -43
View File
@@ -1,46 +1,49 @@
# service_id service_name # RU description # service_id service_name # RU description
# do not delete lines; to exclude a service, comment it with # # do not delete lines; to exclude a service, comment it with #
1 dummy # Болванка для тестов 163 llmAi # LLM
2 template # Болванка для тестирования 150 k8sSthutrvalCluster # Kubernetes кластер Штурвал
12 s3 # Масштабируемое хранилище данных 149 valoTenant # VALO Cloud
13 s3bucket # Бакет в сервисе S3 148 vcMgmtSthutrvalCluster # Менеджмент Kubernetes кластер Штурвал
19 vcOrg # Организация в Cloud Director 120 clickhouse # ClickHouse
20 vcOrgSaas # Без интеграции Keycloak 119 Akhq # Akhq
21 vc_vdc # Выделение вычислительных ресурсов 117 nifi # Nifi
22 vc_nsxt # Обеспечение сетевой доступности в тенанте 116 kafka # ApacheKafka
23 vc_vm # Виртуальная машина без каких-либо особенностей. <br/>Данная услуга запускает vc_ip для выдачи белого адреса и подключения к ВМ 115 mariadb # Mariadb
# 24 DEPRECATED Правила маршрутизации для VM (vc_nat) # excluded from active generation 114 GiteaComplex # Комплексная услуга по созданию gitea
25 vcexternalip # Резервирование IP адреса 113 vcComplex # Быстрый старт
26 vapp # Группировка виртуальных машин 112 tenant # Тенант в Grafana
27 vc_vm_v2 # Виртуальная машина с возможностью настройки Cloud Init<br/>Можно развернуть в услуге несколько ВМ<br/>В зависимости от настроек можно выдавать на ВМ vip + dns 111 dnsrecord # DNS запись
28 vc_vm_v3 # Создание виртуальной машины 110 dnszone # DNS зона
29 vcVdcGroup # Обеспечение сетевой доступности между датацентрами 109 zonesV2 # Управление DNS
32 vmpostgre # Сервис настройки PostgreSQL для виртуальной машины.<br/>Требует наличия ВМ 100 openwhisk # Serverless Openwhisk (openwhisk_tenant)
50 nextcloud # Платформа совместной работы 99 gitea # Gitea
81 superset # Сервер отчетов
82 harbor # Реестр для хранения образов контейнеров
88 k8sZitiController # Контроллер управления Client to service & service to service Zero trust network<br/>
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
98 http # Простой HTTP контейнер 98 http # Простой HTTP контейнер
99 gitea # Сервис контроля версий 97 nodered # NodeRed
100 openwhisk # Добавление и удаления пользователя (учетной записи, тенанта) для работы с Openwhisk 96 pgadmin # pgAdmin
110 dnszone # Хостинг DNS зоны 95 nodejs # NodeJS
111 dnsrecord # DNS запись в созданной зоне 94 lucee # Lucee
112 tenant # Организация доступов к мониторингу 93 rabbitmq # RabbitMQ
113 vcComplex # Создание готовой иерархии ресурсов 92 mongodb # MongoDB
114 GiteaComplex # Комплексная услуга из [&quot;gittea&quot;, &quot;postgres&quot;] 91 redis # Redis
115 mariadb # Управляемая база данных MySQL 90 postgres # PostgreSQL
116 kafka # Сервис создания кластера Apache Kafka 89 flask # Web-сервер с фреймворком Flask
117 nifi # ETL-система 88 k8sZitiController # k8sZitiController
119 Akhq # Web интерфейс Akhq для работы с Apache Kafka 86 k8sVelero # Velero
120 clickhouse # Управляемая база данных ClickHouse 82 harbor # Container Registry
149 valoTenant # Корпоративная система обмена и синхронизации файлов 81 superset # Apache Superset
150 k8sSthutrvalCluster # Платформа управления K8s<br/> 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 # Болванка
+48 -43
View File
@@ -1,46 +1,51 @@
# service_id service_name # RU description # service_id service_name # RU description
# do not delete lines; to exclude a service, comment it with # # do not delete lines; to exclude a service, comment it with #
1 dummy # Болванка для тестов 163 llmAi # LLM
2 template # Болванка для тестирования 151 k8sOpenbao # Vault
12 s3 # Масштабируемое хранилище данных 150 k8sSthutrvalCluster # Kubernetes кластер Штурвал
13 s3bucket # Бакет в сервисе S3 149 valoTenant # VALO Cloud
19 vcOrg # Организация в Cloud Director 148 vcMgmtSthutrvalCluster # Менеджмент Kubernetes кластер Штурвал
20 vcOrgSaas # Без интеграции Keycloak 120 clickhouse # ClickHouse
21 vc_vdc # Выделение вычислительных ресурсов 119 Akhq # Akhq
22 vc_nsxt # Обеспечение сетевой доступности в тенанте 117 nifi # Nifi
23 vc_vm # Виртуальная машина без каких-либо особенностей. <br/>Данная услуга запускает vc_ip для выдачи белого адреса и подключения к ВМ 116 kafka # ApacheKafka
# 24 DEPRECATED Правила маршрутизации для VM (vc_nat) # excluded from active generation 115 mariadb # Mariadb
25 vcexternalip # Резервирование IP адреса 114 GiteaComplex # Комплексная услуга по созданию gitea
26 vapp # Группировка виртуальных машин 113 vcComplex # Быстрый старт
27 vc_vm_v2 # Виртуальная машина с возможностью настройки Cloud Init<br/>Можно развернуть в услуге несколько ВМ<br/>В зависимости от настроек можно выдавать на ВМ vip + dns 112 tenant # Тенант в Grafana
28 vc_vm_v3 # Создание виртуальной машины 111 dnsrecord # DNS запись
29 vcVdcGroup # Обеспечение сетевой доступности между датацентрами 110 dnszone # DNS зона
32 vmpostgre # Сервис настройки PostgreSQL для виртуальной машины.<br/>Требует наличия ВМ 109 zonesV2 # Управление DNS
50 nextcloud # Платформа совместной работы 100 openwhisk # Serverless Openwhisk (openwhisk_tenant)
81 superset # Сервер отчетов 99 gitea # Gitea
82 harbor # Реестр для хранения образов контейнеров
88 k8sZitiController # Контроллер управления Client to service & service to service Zero trust network<br/>
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
98 http # Простой HTTP контейнер 98 http # Простой HTTP контейнер
99 gitea # Сервис контроля версий 97 nodered # NodeRed
100 openwhisk # Добавление и удаления пользователя (учетной записи, тенанта) для работы с Openwhisk 96 pgadmin # pgAdmin
110 dnszone # Хостинг DNS зоны 95 nodejs # NodeJS
111 dnsrecord # DNS запись в созданной зоне 94 lucee # Lucee
112 tenant # Организация доступов к мониторингу 93 rabbitmq # RabbitMQ
113 vcComplex # Создание готовой иерархии ресурсов 92 mongodb # MongoDB
114 GiteaComplex # Комплексная услуга из [&quot;gittea&quot;, &quot;postgres&quot;] 91 redis # Redis
115 mariadb # Управляемая база данных MySQL 90 postgres # PostgreSQL
116 kafka # Сервис создания кластера Apache Kafka 89 flask # Web-сервер с фреймворком Flask
117 nifi # ETL-система 88 k8sZitiController # k8sZitiController
119 Akhq # Web интерфейс Akhq для работы с Apache Kafka 86 k8sVelero # Velero
120 clickhouse # Управляемая база данных ClickHouse 82 harbor # Container Registry
149 valoTenant # Корпоративная система обмена и синхронизации файлов 81 superset # Apache Superset
150 k8sSthutrvalCluster # Платформа управления K8s<br/> 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 # Болванка
+3 -1
View File
@@ -24,7 +24,9 @@ func main() {
servicesListFlag := flag.String("services", "", "Path to TOOLS/config/{stand}/services_list.txt") servicesListFlag := flag.String("services", "", "Path to TOOLS/config/{stand}/services_list.txt")
excludeFlag := flag.String("exclude", "", "Comma-separated resource names to skip") excludeFlag := flag.String("exclude", "", "Comma-separated resource names to skip")
versionFlag := flag.String("version", "", "Provider version for example block") 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)") opsFlag := flag.Bool("ops", false, "Generate per-service operations docs (resources_ops_yaml → docs/.../operations)")
flag.Parse() flag.Parse()
+3
View File
@@ -74,4 +74,7 @@ type ParamSpec struct {
// === Генератор-специфичные поля (не сериализуются в YAML) === // === Генератор-специфичные поля (не сериализуются в YAML) ===
IsModifiable *bool `yaml:"is_modifiable,omitempty"` IsModifiable *bool `yaml:"is_modifiable,omitempty"`
IsSensitive bool `yaml:"is_sensitive,omitempty"` IsSensitive bool `yaml:"is_sensitive,omitempty"`
// SubParams — подполя для map-fixed/array-map-fixed параметров.
// Заполняется из dataDescriptor при генерации YAML.
SubParams []ParamSpec `yaml:"sub_params,omitempty"`
} }
+2 -1
View File
@@ -105,7 +105,8 @@ if [[ ! -f "$SERVICES_FILE" ]]; then
exit 2 exit 2
fi 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=), # Auto-detect API style: if endpoint contains "index.cfm" → legacy proxy (?endpoint=),
# otherwise → new REST gateway (direct paths). No forced /index.cfm normalization. # otherwise → new REST gateway (direct paths). No forced /index.cfm normalization.
@@ -92,7 +92,8 @@ mkdir -p "$DOCS_DIR"
# Determine API endpoint for doc examples. # Determine API endpoint for doc examples.
# Use NUBES_API_ENDPOINT from profile.env, fall back to production default. # 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 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 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 if [[ "$DOCS_API_ENDPOINT" != *"/index.cfm"* ]] && [[ "$DOCS_API_ENDPOINT" != *"/svc"* ]]; then
+4 -2
View File
@@ -9,8 +9,9 @@ PROFILE_DIR="${PROFILE_DIR:-}"
normalize_api_endpoint() { normalize_api_endpoint() {
local endpoint="$1" local endpoint="$1"
endpoint="${endpoint%/}" endpoint="${endpoint%/}"
# ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ.
if [[ -z "$endpoint" ]]; then 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 return
fi fi
# Keep as-is: both legacy proxy (index.cfm) and new REST gateway are valid. # 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
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")" DOCS_API_ENDPOINT="$(normalize_api_endpoint "$DOCS_API_ENDPOINT")"
if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then if [[ -n "${MKDOCS_DOCS_DIR:-}" ]]; then
+99 -4
View File
@@ -51,9 +51,12 @@ func (c *Client) GetService(serviceID int) (types.ServiceInfo, error) {
return res.Service, nil 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) { 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 var res types.ServiceOperationResponse
if err := c.callAPI(endpoint, &res); err != nil { if err := c.callAPI(endpoint, &res); err != nil {
return types.ServiceOperationInfo{}, err return types.ServiceOperationInfo{}, err
@@ -84,7 +87,9 @@ func (c *Client) callAPI(endpoint string, out interface{}) error {
if c.token != "" { if c.token != "" {
req.Header.Set("Authorization", "Bearer "+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) resp, err := c.httpClient.Do(req)
if err != nil { if err != nil {
lastErr = err lastErr = err
@@ -123,6 +128,26 @@ func (c *Client) isProxyAPI() bool {
return strings.Contains(c.endpoint, "index.cfm") 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 собирает и классифицирует все операции сервиса. // CollectOperations собирает и классифицирует все операции сервиса.
func (c *Client) CollectOperations(ops []types.OperationInfo) ([]types.OperationSpec, bool, bool, bool, error) { func (c *Client) CollectOperations(ops []types.OperationInfo) ([]types.OperationSpec, bool, bool, bool, error) {
result := make([]types.OperationSpec, 0, len(ops)) 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)) params := make([]types.ParamSpec, 0, len(opInfo.CfsParams))
for _, p := range opInfo.CfsParams { for _, p := range opInfo.CfsParams {
params = append(params, types.ParamSpec{ param := types.ParamSpec{
ID: p.ID, ID: p.ID,
Code: p.Code, Code: p.Code,
DataType: strings.TrimSpace(p.DataType), DataType: strings.TrimSpace(p.DataType),
@@ -161,8 +186,33 @@ func (c *Client) CollectOperations(ops []types.OperationInfo) ([]types.Operation
DependsOn: p.DependsOnCfsParams, DependsOn: p.DependsOnCfsParams,
IsModifiable: p.IsModifiable, IsModifiable: p.IsModifiable,
IsSensitive: p.IsSensitive, 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 }) sort.Slice(params, func(i, j int) bool { return params[i].ID < params[j].ID })
kind, action, subresource := classifyOperation(opName) kind, action, subresource := classifyOperation(opName)
@@ -232,3 +282,48 @@ func normalizeDefault(value interface{}) interface{} {
return value 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
}
@@ -30,7 +30,7 @@ type ServiceRef struct {
// Load читает конфигурацию из переменных окружения и файлов. // Load читает конфигурацию из переменных окружения и файлов.
func Load() (Config, error) { 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) apiEndpoint = normalize.APIEndpoint(apiEndpoint)
apiToken, err := loadToken() apiToken, err := loadToken()
if err != nil { if err != nil {
@@ -63,6 +63,33 @@ type CfsParam struct {
DependsOnCfsParams interface{} `json:"dependsOnCfsParams"` DependsOnCfsParams interface{} `json:"dependsOnCfsParams"`
IsModifiable *bool `json:"isModifiable"` IsModifiable *bool `json:"isModifiable"`
IsSensitive bool `json:"isSensitive"` 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 — общий контракт) ───────────────────────────── // ─── YAML-типы (алиасы к lib — общий контракт) ─────────────────────────────
+14
View File
@@ -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
+4 -1
View File
@@ -1,3 +1,5 @@
<!-- ⛔⛔⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ! Все примеры ниже — ИСТОРИЧЕСКИЕ. -->
<!-- Актуальный API: https://lk-api-gateway.ngcloud.ru/api/v1/svc -->
# Сводка по разработке Terraform-провайдера Nubes # Сводка по разработке Terraform-провайдера Nubes
Дата: 2026-01-22 Дата: 2026-01-22
@@ -111,7 +113,8 @@ curl -s -X POST "https://keycloak.nubes.ru/realms/cloud/protocol/openid-connect/
``` ```
- Проверка API: - Проверка API:
```bash ```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
``` ```
--- ---
+3
View File
@@ -1,5 +1,8 @@
# Terraform Provider для Nubes Cloud - История разработки # Terraform Provider для Nubes Cloud - История разработки
<!-- ⛔⛔⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ! Все упоминания ниже — ИСТОРИЧЕСКИЕ. -->
<!-- Актуальный API: https://lk-api-gateway.ngcloud.ru/api/v1/svc -->
**Дата**: 21 января 2026 **Дата**: 21 января 2026
**Проект**: terraform-provider-mycloud **Проект**: terraform-provider-mycloud
**Цель**: Создание Terraform Provider для управления ресурсами в облачной платформе Nubes **Цель**: Создание Terraform Provider для управления ресурсами в облачной платформе Nubes
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# PostgreSQL Service Analysis & Implementation Plan # PostgreSQL Service Analysis & Implementation Plan
**Date:** 2026-01-27 **Date:** 2026-01-27
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# Resource Realm: универсальное определение через API # Resource Realm: универсальное определение через API
## Зачем это нужно ## Зачем это нужно
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# VM Service Discovery & Implementation Details # VM Service Discovery & Implementation Details
## Обзор ## Обзор
+2 -1
View File
@@ -31,7 +31,8 @@ terraform {
} }
provider "nubes" { 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 api_token = var.api_token
} }
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# S3 Bucket Notifications: изменения в бакете и вызов функции # S3 Bucket Notifications: изменения в бакете и вызов функции
## Короткий ответ ## Короткий ответ
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_akhq" "baza" { resource "nubes_akhq" "baza" {
resource_realm = "TODO" # Выбрать платформу из списка resource_realm = "TODO" # Выбрать платформу из списка
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_dnsrecord" "baza" { resource "nubes_dnsrecord" "baza" {
zone_uid = "TODO" # UUID экземпляра услуги DNS-зоны zone_uid = "TODO" # UUID экземпляра услуги DNS-зоны
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_dnszone" "baza" { resource "nubes_dnszone" "baza" {
zone_email = "TODO" # Контактный e-mail zone_email = "TODO" # Контактный e-mail
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_dummy" "baza" { resource "nubes_dummy" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_flask" "baza" { resource "nubes_flask" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_gitea_complex" "baza" { resource "nubes_gitea_complex" "baza" {
} }
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_gitea" "baza" { resource "nubes_gitea" "baza" {
psql_uid = "TODO" # UUID Услуги k8sPgsql. Пользователя techGitea, базу данных gitea создаёт автоматически psql_uid = "TODO" # UUID Услуги k8sPgsql. Пользователя techGitea, базу данных gitea создаёт автоматически
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_harbor" "baza" { resource "nubes_harbor" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_http" "baza" { resource "nubes_http" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_k8s_sthutrval_cluster" "baza" { resource "nubes_k8s_sthutrval_cluster" "baza" {
nsxt_uid = "TODO" # InstanceUid nsxt. Nsxt должен быть создан nsxt_uid = "TODO" # InstanceUid nsxt. Nsxt должен быть создан
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_k8s_ziti_controller" "baza" { resource "nubes_k8s_ziti_controller" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_kafka" "baza" { resource "nubes_kafka" "baza" {
resource_instances = 1 # Пример: `2` resource_instances = 1 # Пример: `2`
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_lucee" "baza" { resource "nubes_lucee" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_mariadb" "baza" { resource "nubes_mariadb" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_mongodb" "baza" { resource "nubes_mongodb" "baza" {
resource_instances = 1 # Пример: `2` resource_instances = 1 # Пример: `2`
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_nextcloud" "baza" { resource "nubes_nextcloud" "baza" {
psql_uid = "TODO" psql_uid = "TODO"
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_nifi" "baza" { resource "nubes_nifi" "baza" {
kafka_uid = "TODO" # Выбрать кластер из списка kafka_uid = "TODO" # Выбрать кластер из списка
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_nodejs" "baza" { resource "nubes_nodejs" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_nodered" "baza" { resource "nubes_nodered" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_openwhisk" "baza" { resource "nubes_openwhisk" "baza" {
username = "TODO" # Имя пользователя Openwhisk username = "TODO" # Имя пользователя Openwhisk
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_pgadmin" "baza" { resource "nubes_pgadmin" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_rabbitmq" "baza" { resource "nubes_rabbitmq" "baza" {
resource_realm = "TODO" # Выбрать платформу из списка resource_realm = "TODO" # Выбрать платформу из списка
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_redis" "baza" { resource "nubes_redis" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_s3" "baza" { resource "nubes_s3" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_s3bucket" "baza" { resource "nubes_s3bucket" "baza" {
s3_user_uid = "235e0546-..." # UID Корневой услуги S3. На основе него будет создан бакет. s3_user_uid = "235e0546-..." # UID Корневой услуги S3. На основе него будет создан бакет.
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_superset" "baza" { resource "nubes_superset" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_template" "baza" { resource "nubes_template" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_tenant" "baza" { resource "nubes_tenant" "baza" {
grafana_org_name = "TODO" # WZ-Код клиента grafana_org_name = "TODO" # WZ-Код клиента
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_valo_tenant" "baza" { resource "nubes_valo_tenant" "baza" {
resource_realm = "TODO" resource_realm = "TODO"
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vapp" "baza" { resource "nubes_vapp" "baza" {
nsxt_uid = "TODO" # UUID Услуги `Сетевой шлюз периметра (Edge)` nsxt_uid = "TODO" # UUID Услуги `Сетевой шлюз периметра (Edge)`
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vc_complex" "baza" { resource "nubes_vc_complex" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vc_nsxt" "baza" { resource "nubes_vc_nsxt" "baza" {
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vc_org" "baza" { resource "nubes_vc_org" "baza" {
resource_realm = "TODO" # Облако в котором будет развёрнут тенант resource_realm = "TODO" # Облако в котором будет развёрнут тенант
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vc_org_saas" "baza" { resource "nubes_vc_org_saas" "baza" {
resource_realm = "TODO" # Платформа для развертывания resource_realm = "TODO" # Платформа для развертывания
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vc_vdc" "baza" { resource "nubes_vc_vdc" "baza" {
organization_uid = "TODO" # Для создания VDC предварительно необходимо создать организацию через услугу `Организация в Cloud Director` organization_uid = "TODO" # Для создания VDC предварительно необходимо создать организацию через услугу `Организация в Cloud Director`
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vc_vdc_group" "baza" { resource "nubes_vc_vdc_group" "baza" {
vdc_uid = "TODO" vdc_uid = "TODO"
+1 -1
View File
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vc_vm" "baza" { resource "nubes_vc_vm" "baza" {
vapp_uid = "TODO" # InstanceUid vApp. vApp должен быть создан vapp_uid = "TODO" # InstanceUid vApp. vApp должен быть создан
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vc_vm_v2" "baza" { resource "nubes_vc_vm_v2" "baza" {
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vc_vm_v3" "baza" { resource "nubes_vc_vm_v3" "baza" {
vapp_uid = "TODO" vapp_uid = "TODO"
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vcexternalip" "baza" { resource "nubes_vcexternalip" "baza" {
service_uid = "TODO" service_uid = "TODO"
@@ -21,7 +21,7 @@ terraform {
# Токен доступа api_token к Nubes API — замените на реальный. # Токен доступа api_token к Nubes API — замените на реальный.
provider "nubes" { provider "nubes" {
api_token = "token_***" 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" <!-- LEGACY index.cfm удалён, заменён на Gateway -->
} }
resource "nubes_vmpostgre" "baza" { resource "nubes_vmpostgre" "baza" {
vdc_uid = "TODO" # InstanceUid vdc. Vdc должен быть создан vdc_uid = "TODO" # InstanceUid vdc. Vdc должен быть создан
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# PostgreSQL backend bugs (2026-02-28) # PostgreSQL backend bugs (2026-02-28)
## Scope ## Scope
+71 -17
View File
@@ -33,30 +33,84 @@
--- ---
## 3. Обнаружение схемы параметров для сервиса (Parameter Scheme Discovery) ## 3. Обнаружение схемы параметров для сервиса (метод Виталия)
Поскольку прямого эндпоинта со списком всех определений параметров нет, используется паттерн "Черновик операции". > **Это канонический метод получения ВСЕХ параметров, включая подполя map-fixed.**
> Источник: Виталий Зайцев (DevOps Nubes), 15.07.2026.
### Три шага — полный список параметров без создания инстанса:
**Шаг 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):
### Шаг А: Создание черновика
1. **Запрос:** `POST /v1/index.cfm/instanceOperations`
2. **Тело:**
```json ```json
{ {
"operation": "create", "svcOperationCfsParamId": 788,
"serviceId": <svcId_из_шага_2>, "svcOperationCfsParam": "clusterConfiguration",
"instanceUid": null "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"
}
}
} }
``` ```
3. **Результат:** Заголовок `Location` или тело ответа содержат `instanceOperationUid` (UUID).
### Шаг Б: Получение метаданных параметров ### Формат valueList:
1. **Запрос:** `GET /v1/index.cfm/instanceOperations/{instanceOperationUid}?fields=cfsParams`
2. **Анализ `cfsParams`:** - Для **верхнеуровневых** параметров: JSON-массив `["false", "true"]`
- `svcOperationCfsParamId`: Числовой ID параметра (например, `8`). **Критично для работы провайдера.** - Для **подполей** dataDescriptor: comma-separated строка `"1,3,5,7"`
- `label`: Имя поля в UI (например, "UUID VDC"). - Для `boolean`: всегда `"false,true"` или `["false","true"]`
- `dataType`: Тип (`string`, `boolean`, `list`, `uuid`).
- `isRequired`: Обязательность. ### URL для разных стендов:
- `descr`: Подсказка по заполнению.
| Стенд | Базовый 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}`.
--- ---
+1 -1
View File
@@ -1,7 +1,7 @@
# Taffy API Technical Manual for AI Agents # Taffy API Technical Manual for AI Agents
## 1. Authentication & Security ## 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` <!-- ⛔ LEGACY: was deck-api.ngcloud.ru/api/v1/index.cfm -->
All requests MUST include these headers (as indicated by CORS `access-control-allow-headers`): All requests MUST include these headers (as indicated by CORS `access-control-allow-headers`):
- `Authorization`: `Bearer <TOKEN>` - `Authorization`: `Bearer <TOKEN>`
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# Universal Rebuild — Архитектура и рабочая цепочка (актуально) # Universal Rebuild — Архитектура и рабочая цепочка (актуально)
Документ для нового чата: описывает, как устроено «универсальное ядро», как формируются YAML‑спеки сервисов и как генерируются Go‑ресурсы. Учитывает ошибки/уроки из текущего чата. Документ для нового чата: описывает, как устроено «универсальное ядро», как формируются YAML‑спеки сервисов и как генерируются Go‑ресурсы. Учитывает ошибки/уроки из текущего чата.
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# Резюме для нового чата (подробно) # Резюме для нового чата (подробно)
## Контекст ## Контекст
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# Полный анализ кодовой базы и план развития # Полный анализ кодовой базы и план развития
**Дата:** 2026-03-13 **Дата:** 2026-03-13
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# Матрица состояний ресурсов в облаке ngcloud # Матрица состояний ресурсов в облаке ngcloud
## Основные параметры состояния ## Основные параметры состояния
+28
View File
@@ -8,6 +8,34 @@
- Чеклист разработки/клона: [docs/00_overview/dev-clone-checklist.md](00_overview/dev-clone-checklist.md) - Чеклист разработки/клона: [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) - НЛИ/чат-материалы: [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 и схемы
- Алгоритмы API-дискавери: [docs/70_api/api-discovery-algorithms.md](70_api/api-discovery-algorithms.md) - Алгоритмы 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) - Полный API-дамп: [docs/70_api/api_analysis/API_DOCUMENTATION_SUMMARY.md](70_api/api_analysis/API_DOCUMENTATION_SUMMARY.md)
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# Instance State Transitions - Матрица состояний инстансов ngcloud # Instance State Transitions - Матрица состояний инстансов ngcloud
Полное руководство по определению состояния инстансов через API ngcloud на основе комбинаций флагов и истории операций. Полное руководство по определению состояния инстансов через API ngcloud на основе комбинаций флагов и истории операций.
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# AI-Agent Glossary (Search-Oriented Index) # AI-Agent Glossary (Search-Oriented Index)
Purpose: compact, English, link-rich glossary to help AI agents find facts fast in this repo. Purpose: compact, English, link-rich glossary to help AI agents find facts fast in this repo.
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# Архитектура и методы (CRUD) # Архитектура и методы (CRUD)
## 1. Актуальная архитектура (универсальный rebuild) ## 1. Актуальная архитектура (универсальный rebuild)
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# СУПЕРглоссарий (словарь с ссылками) # СУПЕРглоссарий (словарь с ссылками)
Каждый термин содержит ссылки на места употребления в документации. Каждый термин содержит ссылки на места употребления в документации.
+21
View File
@@ -1,3 +1,5 @@
<!-- ⛔⛔⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ! Все примеры ниже — ИСТОРИЧЕСКИЕ. -->
<!-- Актуальный API: https://lk-api-gateway.ngcloud.ru/api/v1/svc -->
# How It Was Done — Developer Guide (закрытая страница) # How It Was Done — Developer Guide (закрытая страница)
**Filename & Versioning:** howitwasdone.md / 20260204 / Draft v1 **Filename & Versioning:** howitwasdone.md / 20260204 / Draft v1
@@ -76,6 +78,25 @@
## 2. База знаний ошибок ## 2. База знаний ошибок
### A. Аутентификация и токены ### 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 **Симптом:** 401 Unauthorized / Authorization header expected
**Причина:** токен истёк или не передан в окружение **Причина:** токен истёк или не передан в окружение
**Решение:** обновить access_token и сохранить в файле HH‑MM‑SS.token; убедиться, что Terraform читает токен **Решение:** обновить access_token и сохранить в файле HH‑MM‑SS.token; убедиться, что Terraform читает токен
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# API Token Saga — 30.06.2026 # API Token Saga — 30.06.2026
**Дата:** 30 июня 2026 **Дата:** 30 июня 2026
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# ⛔⛔⛔ ПРАВИЛА РАЗДЕЛЕНИЯ СТЕНДОВ ⛔⛔⛔ # ⛔⛔⛔ ПРАВИЛА РАЗДЕЛЕНИЯ СТЕНДОВ ⛔⛔⛔
> **НАРУШЕНИЕ = УВОЛЬНЕНИЕ. Без шуток.** > **НАРУШЕНИЕ = УВОЛЬНЕНИЕ. Без шуток.**
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# Testing Safety Rules # Testing Safety Rules
## ⛔ ЗАПРЕЩЕНО — прогонять тесты в PROD ## ⛔ ЗАПРЕЩЕНО — прогонять тесты в PROD
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# Troubleshooting # Troubleshooting
## API Nubes — ошибки доступа (403, 401, IAM error) ## API Nubes — ошибки доступа (403, 401, IAM error)
+1
View File
@@ -1,3 +1,4 @@
<!-- ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Актуальный API: lk-api-gateway.ngcloud.ru/api/v1/svc -->
# План: валидация параметров с выбором из списка # План: валидация параметров с выбором из списка
Дата составления: 2026-03-25 Дата составления: 2026-03-25
+3 -3
View File
@@ -98,9 +98,9 @@ func (p *NubesProvider) Configure(ctx context.Context, req provider.ConfigureReq
return return
} }
// TODO(api-gateway): default is legacy proxy (index.cfm?endpoint=). // ⛔ LEGACY: deck-api.ngcloud.ru ЗАКРЫВАЕТСЯ. Использовать ТОЛЬКО lk-api-gateway.
// core.UniversalClient still uses ?endpoint= pattern — needs migration to REST paths. // По умолчанию — Gateway. Переопределяется через NUBES_API_ENDPOINT.
apiEndpoint := "https://deck-api.ngcloud.ru/api/v1/index.cfm" apiEndpoint := "https://lk-api-gateway.ngcloud.ru/api/v1/svc"
apiToken := "" apiToken := ""
if !config.ApiEndpoint.IsNull() { if !config.ApiEndpoint.IsNull() {
+2 -1
View File
@@ -50,7 +50,8 @@ class InstanceInfo:
class CloudInstanceChecker: 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): def __init__(self, token: str):
""" """