From 657157527bc697afc301c78d6947298d9956735c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 10 Aug 2026 21:42:41 +0400 Subject: [PATCH] =?UTF-8?q?fix:=20curated=20PG=20example=20=E2=80=94=20use?= =?UTF-8?q?=20S3=20name=20not=20UUID,=20comment=20every=20parameter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BUG_SCRIPT26_resourceRealm.md | 51 --------- DEV_STAND/PGwNewRegistry/main.tf | 35 ------ DEV_STAND/PGwNewRegistry/nubes_postgres.tf | 58 ---------- DEV_STAND/PGwNewRegistry/userUNDdb.tf | 50 --------- TEST_STAND/PGwNewRegistry/main.tf | 4 - TEST_STAND/PGwNewRegistry/userUNDdb.tf | 28 +---- TEST_STAND/sync.sh | 1 + docs/curated/postgres/pg_user_db.md | 103 +++++++++--------- 8 files changed, 56 insertions(+), 274 deletions(-) delete mode 100644 DEV_STAND/PGwNewRegistry/BUG_SCRIPT26_resourceRealm.md delete mode 100644 DEV_STAND/PGwNewRegistry/main.tf delete mode 100644 DEV_STAND/PGwNewRegistry/nubes_postgres.tf delete mode 100644 DEV_STAND/PGwNewRegistry/userUNDdb.tf diff --git a/DEV_STAND/PGwNewRegistry/BUG_SCRIPT26_resourceRealm.md b/DEV_STAND/PGwNewRegistry/BUG_SCRIPT26_resourceRealm.md deleted file mode 100644 index fe399f1..0000000 --- a/DEV_STAND/PGwNewRegistry/BUG_SCRIPT26_resourceRealm.md +++ /dev/null @@ -1,51 +0,0 @@ -# Баг: DEV postgres Script26 не знает resourceRealm - -Дата: 2026-08-09 - -## Симптом - -`terraform apply` на DEV стенде падает с ошибкой: - -``` -nubes_postgres.npg: операция ... завершилась с ошибкой: -No such property: resourceRealm for class: Script26 -``` - -## Причина - -DEV API (`lk-api-gateway-dev.ngcloud.ru`) возвращает `resourceRealm` в метаданных -сервиса postgres (ID 90, операция create, параметр startupConfiguration). -Но бэкенд-скрипт `Script26`, который фактически выполняет создание Postgres на DEV, -**не имеет** свойства `resourceRealm`. - -TEST стенд работает нормально — его скрипт `resourceRealm` принимает. - -## Доказательства - -1. Оба API (DEV и TEST) возвращают одинаковые метаданные — `resourceRealm` присутствует: - ``` - generated/dev/resources_yaml/90_postgres.yaml — 2 occurrences - generated/test/resources_yaml/90_postgres.yaml — 2 occurrences - ``` - -2. Провайдер собран **из DEV API** (не перепутан с TEST): - - YAML сгенерированы: `./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/dev` - - Go сгенерирован: `./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/dev` - - Версия: `3.0.2`, Namespace: `nubes-dev` - -3. Terraform-конфиг (DEV_STAND/PGwNewRegistry): - ```hcl - provider "nubes" { - api_endpoint = "https://lk-api-gateway-dev.ngcloud.ru/api/v1/svc" - } - resource "nubes_postgres" "npg" { - startup_configuration = { - resource_realm = "k8s-3-sandbox-nubes-ru" - } - } - ``` - -## Что нужно сделать - -Добавить свойство `resourceRealm` в скрипт `Script26` (DEV postgres create). -Привести DEV-скрипт в соответствие с метаданными API (как на TEST). diff --git a/DEV_STAND/PGwNewRegistry/main.tf b/DEV_STAND/PGwNewRegistry/main.tf deleted file mode 100644 index 1efe1e4..0000000 --- a/DEV_STAND/PGwNewRegistry/main.tf +++ /dev/null @@ -1,35 +0,0 @@ -terraform { - required_providers { - nubes = { - source = "tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes" - version = "5.0.1" - } - } -} - -variable "api_token" { - type = string - sensitive = true - description = "Nubes API token" -} -variable "s3_uid" { - type = string - sensitive = true - description = "Nubes S3 UID" -} -variable "realm" { - type = string - sensitive = true - description = "resource_realm parameter for nubes_postgres resource" -} -variable "s3_user_uid" { - type = string - description = "S3 user UUID" -} - -provider "nubes" { - api_token = var.api_token - api_endpoint = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc" - # log_level = "debug" # none | info | debug, default = "none" -} - diff --git a/DEV_STAND/PGwNewRegistry/nubes_postgres.tf b/DEV_STAND/PGwNewRegistry/nubes_postgres.tf deleted file mode 100644 index 72791e1..0000000 --- a/DEV_STAND/PGwNewRegistry/nubes_postgres.tf +++ /dev/null @@ -1,58 +0,0 @@ -resource "nubes_postgres" "npg" { - resource_name = "pgdev02" - - startup_configuration = { - resource_realm = var.realm - } - - cluster_configuration = { - cpu = 500 - memory = 512 - replicas = 1 - disk = 10 - } - - access_configuration = { - master_ip_space = "no-needed" - master_access_list = jsonencode(["10.0.0.0/8"]) - slave_ip_space = "no-needed" - slave_access_list = jsonencode([]) - } - - postgres_configuration = { - version = "17" - ssl_required = true - pooler_master = false - pooler_slave = false - } - - postgres_conf = jsonencode([{ - param_name = "log_connections" - param_value = "" - }]) - - backup_configuration = { - s3_uid = var.s3_uid - retain = 14 - schedule = "0 0 * * *" - } - - autoscale_configuration = { - enabled = false - schedule = 0 - percent = 10 - quota = 100 - } - - mtls_configuration = { - type = "off" - duration_ca = 175200 - duration_server = 87600 - } - - operation_timeout = "11m" - adopt_existing_on_create = true -} - - - diff --git a/DEV_STAND/PGwNewRegistry/userUNDdb.tf b/DEV_STAND/PGwNewRegistry/userUNDdb.tf deleted file mode 100644 index 33475e6..0000000 --- a/DEV_STAND/PGwNewRegistry/userUNDdb.tf +++ /dev/null @@ -1,50 +0,0 @@ -# ============================================================================= -# PostgreSQL — пользователи (6 шт.) -# ============================================================================= -resource "nubes_postgres_user" "pg_user_0" { - postgres_id = nubes_postgres.npg.id - username = "user0" - role = "ddl_user" - mtls_access = false - adopt_existing_on_create = true -} - -# resource "nubes_postgres_user" "pg_user_1" { -# postgres_id = nubes_postgres.npg.id -# username = "user1" -# role = "ddl_user" -# adopt_existing_on_create = true -# } - -# # ============================================================================= -# # PostgreSQL — базы данных (3 шт.) -# # ============================================================================= -# resource "nubes_postgres_database" "pg_db_1" { -# postgres_id = nubes_postgres.npg.id -# db_name = "dbapp1" -# db_owner = nubes_postgres_user.pg_user_1.username -# adopt_existing_on_create = true -# } - -resource "nubes_postgres_database" "pg_db_2" { - postgres_id = nubes_postgres.npg.id - db_name = "dbapp2" - db_owner = nubes_postgres_user.pg_user_0.username - adopt_existing_on_create = true -} - -# resource "nubes_postgres_database" "pg_db_3" { -# postgres_id = nubes_postgres.npg.id -# db_name = "dbapp3" -# db_owner = nubes_postgres_user.pg_user_1.username -# adopt_existing_on_create = true -# } - -# S3 bucket — замени "buck0" на своё имя везде ниже -resource "nubes_s3bucket" "bukka0" { # ← замени buck0 на своё имя ресурса - resource_name = "btst" # ← замени buck0 на своё имя ресурса - #s3_user_uid = "naeel-s3" - s3_user_uid = var.s3_user_uid - bucket_name = "bucktst000" # ← замени buck0 на своё имя бакета - adopt_existing_on_create = true -} diff --git a/TEST_STAND/PGwNewRegistry/main.tf b/TEST_STAND/PGwNewRegistry/main.tf index bcb14b2..1251db3 100644 --- a/TEST_STAND/PGwNewRegistry/main.tf +++ b/TEST_STAND/PGwNewRegistry/main.tf @@ -22,10 +22,6 @@ variable "realm" { sensitive = true description = "resource_realm parameter for nubes_postgres resource" } -variable "s3_user_uid" { - type = string - description = "S3 user UUID" -} provider "nubes" { api_token = var.api_token diff --git a/TEST_STAND/PGwNewRegistry/userUNDdb.tf b/TEST_STAND/PGwNewRegistry/userUNDdb.tf index 33475e6..ab5e6e6 100644 --- a/TEST_STAND/PGwNewRegistry/userUNDdb.tf +++ b/TEST_STAND/PGwNewRegistry/userUNDdb.tf @@ -9,23 +9,6 @@ resource "nubes_postgres_user" "pg_user_0" { adopt_existing_on_create = true } -# resource "nubes_postgres_user" "pg_user_1" { -# postgres_id = nubes_postgres.npg.id -# username = "user1" -# role = "ddl_user" -# adopt_existing_on_create = true -# } - -# # ============================================================================= -# # PostgreSQL — базы данных (3 шт.) -# # ============================================================================= -# resource "nubes_postgres_database" "pg_db_1" { -# postgres_id = nubes_postgres.npg.id -# db_name = "dbapp1" -# db_owner = nubes_postgres_user.pg_user_1.username -# adopt_existing_on_create = true -# } - resource "nubes_postgres_database" "pg_db_2" { postgres_id = nubes_postgres.npg.id db_name = "dbapp2" @@ -33,18 +16,11 @@ resource "nubes_postgres_database" "pg_db_2" { adopt_existing_on_create = true } -# resource "nubes_postgres_database" "pg_db_3" { -# postgres_id = nubes_postgres.npg.id -# db_name = "dbapp3" -# db_owner = nubes_postgres_user.pg_user_1.username -# adopt_existing_on_create = true -# } - # S3 bucket — замени "buck0" на своё имя везде ниже resource "nubes_s3bucket" "bukka0" { # ← замени buck0 на своё имя ресурса resource_name = "btst" # ← замени buck0 на своё имя ресурса - #s3_user_uid = "naeel-s3" - s3_user_uid = var.s3_user_uid + s3_user_uid = "naeel-s3" + # s3_user_uid = var.s3_user_uid bucket_name = "bucktst000" # ← замени buck0 на своё имя бакета adopt_existing_on_create = true } diff --git a/TEST_STAND/sync.sh b/TEST_STAND/sync.sh index bd6ad35..4bc7e16 100755 --- a/TEST_STAND/sync.sh +++ b/TEST_STAND/sync.sh @@ -12,6 +12,7 @@ rsync -avz --delete \ --exclude='.terraform/' \ --exclude='terraform.tfstate*' \ --exclude='.terraform.lock.hcl' \ + --exclude='IOT_RMQ_DEMO_VM/' \ -e "ssh -i ${SSH_KEY} -o ConnectTimeout=10" \ "${LOCAL_PATH}/" \ "${VM_HOST}:${VM_PATH}/" diff --git a/docs/curated/postgres/pg_user_db.md b/docs/curated/postgres/pg_user_db.md index 12bd424..1220059 100644 --- a/docs/curated/postgres/pg_user_db.md +++ b/docs/curated/postgres/pg_user_db.md @@ -6,20 +6,19 @@ | Ресурс | Имя в манифесте | Назначение | |--------|----------------|-----------| -| `nubes_postgres` | `main_pg` | Кластер PostgreSQL (1 реплика, 500m CPU, 512MB RAM, 10GB диск) | -| `nubes_postgres_user` | `app_user` | Пользователь БД с правами `ddl_user` | -| `nubes_postgres_database` | `app_db` | База данных, владелец — `app_user` | -| `nubes_s3bucket` | `backups` | S3-бакет для хранения бэкапов | +| `nubes_postgres` | `main_pg` | Кластер PostgreSQL | +| `nubes_postgres_user` | `app_user` | Пользователь БД | +| `nubes_postgres_database` | `app_db` | База данных | +| `nubes_s3bucket` | `backups` | S3-бакет для бэкапов | ## Переменные Создай `terraform.tfvars`: ```hcl -api_token = "***" # токен из Личного кабинета -realm = "k8s-3-sandbox-nubes-ru" # кластер Kubernetes -s3_uid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # UUID твоего S3 -s3_user_uid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # UUID пользователя S3 +api_token = "***" # токен из Личного кабинета +realm = "k8s-3-sandbox-nubes-ru" # кластер Kubernetes (из организации) +s3_name = "my-s3" # ИМЯ экземпляра S3 (не UUID!) ``` ## Провайдер @@ -34,10 +33,9 @@ terraform { } } -variable "api_token" { type = string; sensitive = true } -variable "realm" { type = string } -variable "s3_uid" { type = string } -variable "s3_user_uid" { type = string } +variable "api_token" { type = string; sensitive = true } +variable "realm" { type = string } +variable "s3_name" { type = string } provider "nubes" { api_token = var.api_token @@ -49,72 +47,77 @@ provider "nubes" { ```hcl resource "nubes_postgres" "main_pg" { - resource_name = "my-postgres" + resource_name = "my-postgres" # любое имя + # На каком кластере Kubernetes развернуть startup_configuration = { - resource_realm = var.realm + resource_realm = var.realm # имя кластера } + # Ресурсы пода cluster_configuration = { - cpu = 500 # milicores (1000 = 1 ядро) - memory = 512 # megabytes - replicas = 1 # 1, 3, 5 или 7 - disk = 10 # gigabytes + cpu = 500 # milicores (1000 = 1 ядро) + memory = 512 # megabytes + replicas = 1 # 1, 3, 5 или 7 + disk = 10 # gigabytes } + # Сетевой доступ access_configuration = { - master_ip_space = "no-needed" - master_access_list = jsonencode(["10.0.0.0/8"]) - slave_ip_space = "no-needed" - slave_access_list = jsonencode([]) + master_ip_space = "no-needed" # Ip-Space для внешнего IP мастера + master_access_list = jsonencode(["10.0.0.0/8"]) # кому доступ к мастеру + slave_ip_space = "no-needed" # Ip-Space для внешнего IP слейва + slave_access_list = jsonencode([]) # кому доступ к слейву ([] = всем) } + # Версия и настройки PostgreSQL postgres_configuration = { - version = "17" - ssl_required = true - pooler_master = false - pooler_slave = false + version = "17" # 16 или 17 + ssl_required = true # требовать SSL + pooler_master = false # PgBouncer для записи + pooler_slave = false # PgBouncer для чтения } + # Резервное копирование backup_configuration = { - s3_uid = var.s3_uid - retain = 14 # хранить 14 копий - schedule = "0 0 * * *" # ежедневно в полночь + s3_uid = var.s3_name # ИМЯ S3 (не UUID!) + retain = 14 # сколько бэкапов хранить + schedule = "0 0 * * *" # cron (ежедневно в полночь) } + # Автоскейлинг диска autoscale_configuration = { - enabled = false - schedule = 0 - percent = 10 - quota = 100 + enabled = false # выключен + schedule = 0 # час окна (0-23) + percent = 10 # % расширения + quota = 100 # макс. размер диска (GB) } + # Mutual TLS mtls_configuration = { - type = "off" - duration_ca = 175200 - duration_server = 87600 + type = "off" # off | manual | auto + duration_ca = 175200 # время жизни CA (часы) + duration_server = 87600 # время жизни сертификата (часы) } - operation_timeout = "11m" + operation_timeout = "11m" # таймаут операции } ``` ## Пользователь и база данных ```hcl -# Пользователь с правами создания БД и ролей resource "nubes_postgres_user" "app_user" { - postgres_id = nubes_postgres.main_pg.id - username = "app_user" - role = "ddl_user" # app_user — только DML; ddl_user — DDL + DML - mtls_access = false + postgres_id = nubes_postgres.main_pg.id # ссылка на кластер + username = "app_user" # имя пользователя + role = "ddl_user" # app_user (DML) | ddl_user (DDL) + mtls_access = false # mTLS для пользователя } -# База данных, владелец — созданный выше пользователь resource "nubes_postgres_database" "app_db" { - postgres_id = nubes_postgres.main_pg.id - db_name = "my_app_db" - db_owner = nubes_postgres_user.app_user.username + postgres_id = nubes_postgres.main_pg.id # ссылка на кластер + db_name = "my_app_db" # имя базы данных + db_owner = nubes_postgres_user.app_user.username # владелец } ``` @@ -122,9 +125,9 @@ resource "nubes_postgres_database" "app_db" { ```hcl resource "nubes_s3bucket" "backups" { - resource_name = "pg-backup-bucket" - s3_user_uid = var.s3_user_uid - bucket_name = "my-app-backups" + resource_name = "pg-backup-bucket" # любое имя + s3_user_uid = var.s3_name # ИМЯ S3 (не UUID!) + bucket_name = "my-app-backups" # имя бакета } ``` @@ -135,4 +138,4 @@ terraform init terraform apply ``` -Все четыре ресурса создаются за один `apply`. Порядок не важен — Terraform сам выстроит зависимости: сначала кластер, потом пользователь, потом БД и бакет. +Все 4 ресурса за один `apply`. Terraform сам выстроит порядок: кластер → пользователь → БД → бакет.