From f5547c046595668c4e265c751039d37474f97a37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Thu, 16 Jul 2026 13:48:34 +0400 Subject: [PATCH] =?UTF-8?q?svc-api:=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=BD=D0=B0=20Gateway=20(lk-api-gateway),=20User-Agen?= =?UTF-8?q?t+Referer=20=D0=B4=D0=BB=D1=8F=20DDoS-Guard,=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=20=D0=92=D0=B8=D1=82=D0=B0=D0=BB=D0=B8=D1=8F?= =?UTF-8?q?=20/instanceOperations/default/{id}=20=D1=81=20dataDescriptor,?= =?UTF-8?q?=20LEGACY-=D0=BF=D0=BE=D0=BC=D0=B5=D1=82=D0=BA=D0=B8=20=D0=B2?= =?UTF-8?q?=D0=B5=D0=B7=D0=B4=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROD_STAND/PG1/main.tf | 3 +- PROD_STAND/POSTGRES/main.tf | 3 +- PROD_STAND/RABBIT/main.tf | 3 +- RABBIT/main.tf | 30 ----- RABBIT/resources.tf | 41 ------- TOOLS/config/dev/profile.env | 2 +- TOOLS/config/dev/services_list.txt | 95 ++++++++-------- TOOLS/config/prod/profile.env | 2 +- TOOLS/config/prod/services_list.txt | 89 ++++++++------- TOOLS/config/test/services_list.txt | 91 ++++++++------- TOOLS/docs-generator/main.go | 4 +- TOOLS/lib/types.go | 3 + TOOLS/scripts/01_generate_yamls.sh | 3 +- .../02_generate_resources_and_docs_v2.sh | 3 +- TOOLS/scripts/04_build_and_publish_docs.sh | 6 +- .../yaml-generator/internal/client/client.go | 105 +++++++++++++++++- .../yaml-generator/internal/config/config.go | 2 +- TOOLS/yaml-generator/internal/types/types.go | 27 +++++ apis.txt | 14 +++ docs/00_overview/for_nomo_chat.md | 5 +- docs/20_discovery/development-journey.md | 3 + docs/20_discovery/postgres-service.md | 1 + .../20_discovery/resource_realms_available.md | 1 + docs/20_discovery/vm_service.md | 1 + docs/30_registry/guides/getting-started.md | 3 +- .../guides/s3-bucket-notifications.md | 1 + docs/30_registry/resources/akhq_example.md | 2 +- .../resources/dnsrecord_example.md | 2 +- docs/30_registry/resources/dnszone_example.md | 2 +- docs/30_registry/resources/dummy_example.md | 2 +- docs/30_registry/resources/flask_example.md | 2 +- .../resources/gitea_complex_example.md | 2 +- docs/30_registry/resources/gitea_example.md | 2 +- docs/30_registry/resources/harbor_example.md | 2 +- docs/30_registry/resources/http_example.md | 2 +- .../k8s_sthutrval_cluster_example.md | 2 +- .../resources/k8s_ziti_controller_example.md | 2 +- docs/30_registry/resources/kafka_example.md | 2 +- docs/30_registry/resources/lucee_example.md | 2 +- docs/30_registry/resources/mariadb_example.md | 2 +- docs/30_registry/resources/mongodb_example.md | 2 +- .../resources/nextcloud_example.md | 2 +- docs/30_registry/resources/nifi_example.md | 2 +- docs/30_registry/resources/nodejs_example.md | 2 +- docs/30_registry/resources/nodered_example.md | 2 +- .../resources/openwhisk_example.md | 2 +- docs/30_registry/resources/pgadmin_example.md | 2 +- .../30_registry/resources/rabbitmq_example.md | 2 +- docs/30_registry/resources/redis_example.md | 2 +- docs/30_registry/resources/s3_example.md | 2 +- .../30_registry/resources/s3bucket_example.md | 2 +- .../30_registry/resources/superset_example.md | 2 +- .../30_registry/resources/template_example.md | 2 +- docs/30_registry/resources/tenant_example.md | 2 +- .../resources/valo_tenant_example.md | 2 +- docs/30_registry/resources/vapp_example.md | 2 +- .../resources/vc_complex_example.md | 2 +- docs/30_registry/resources/vc_nsxt_example.md | 2 +- docs/30_registry/resources/vc_org_example.md | 2 +- .../resources/vc_org_saas_example.md | 2 +- docs/30_registry/resources/vc_vdc_example.md | 2 +- .../resources/vc_vdc_group_example.md | 2 +- docs/30_registry/resources/vc_vm_example.md | 2 +- .../30_registry/resources/vc_vm_v2_example.md | 2 +- .../30_registry/resources/vc_vm_v3_example.md | 2 +- .../resources/vcexternalip_example.md | 2 +- .../resources/vmpostgre_example.md | 2 +- .../postgres_backend_bugs_2026-02-28.md | 1 + docs/70_api/api-discovery-algorithms.md | 96 ++++++++++++---- docs/70_api/api_analysis/DOC_AI_AGENT_EN.md | 2 +- docs/ARCHITECTURE_NEW.md | 1 + docs/CHAT_RESUME_NEW.md | 1 + docs/CODEBASE_ANALYSIS_AND_ROADMAP.md | 1 + docs/INSTANCE_STATES.md | 1 + docs/README.md | 28 +++++ docs/STATE_TRANSITIONS.md | 1 + docs/help/ai_glossary.md | 1 + docs/help/architecture-and-methods.md | 1 + docs/help/super_glossary.md | 1 + docs/howitwasdone.md | 21 ++++ docs/ops/API_TOKENS.md | 1 + docs/ops/STANDS.md | 1 + docs/ops/TESTING.md | 1 + docs/ops/TROUBLESHOOTING.md | 1 + docs/ops/VALIDATION_LIST_PARAMS_PLAN.md | 1 + provider/internal/provider/provider.go | 6 +- scripts/check_cloud_instances.py | 3 +- 87 files changed, 505 insertions(+), 288 deletions(-) delete mode 100644 RABBIT/main.tf delete mode 100644 RABBIT/resources.tf create mode 100644 apis.txt 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): """