# PostgreSQL: кластер + пользователь + база + S3-бэкап Проверенный сценарий. Протестировано 2026-08-10 на TEST-стенде. ## Что создаётся | Ресурс | Имя в манифесте | Назначение | |--------|----------------|-----------| | `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-бакет для хранения бэкапов | ## Переменные Создай `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 ``` ## Провайдер ```hcl terraform { required_providers { nubes = { source = "tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes" version = "5.0.5" } } } variable "api_token" { type = string; sensitive = true } variable "realm" { type = string } variable "s3_uid" { type = string } variable "s3_user_uid" { type = string } provider "nubes" { api_token = var.api_token api_endpoint = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc" } ``` ## Кластер PostgreSQL ```hcl resource "nubes_postgres" "main_pg" { resource_name = "my-postgres" startup_configuration = { resource_realm = var.realm } cluster_configuration = { 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([]) } postgres_configuration = { version = "17" ssl_required = true pooler_master = false pooler_slave = false } backup_configuration = { s3_uid = var.s3_uid retain = 14 # хранить 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" } ``` ## Пользователь и база данных ```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 } # База данных, владелец — созданный выше пользователь 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 } ``` ## S3-бакет для бэкапов ```hcl resource "nubes_s3bucket" "backups" { resource_name = "pg-backup-bucket" s3_user_uid = var.s3_user_uid bucket_name = "my-app-backups" } ``` ## Запуск ```bash terraform init terraform apply ``` Все четыре ресурса создаются за один `apply`. Порядок не важен — Terraform сам выстроит зависимости: сначала кластер, потом пользователь, потом БД и бакет.