# PostgreSQL: кластер + пользователь + база + S3-бэкап Проверенный сценарий. Протестировано 2026-08-10 на TEST-стенде. ## Что создаётся | Ресурс | Имя в манифесте | Назначение | |--------|----------------|-----------| | `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_name = "my-s3" # ИМЯ экземпляра S3 (не UUID!) ``` ## Провайдер ```hcl terraform { required_providers { nubes = { source = "{{PROVIDER_SOURCE}}" version = "{{VERSION}}" } } } variable "api_token" { type = string; sensitive = true } variable "realm" { type = string } variable "s3_name" { type = string } provider "nubes" { api_token = var.api_token api_endpoint = "{{NUBES_API_ENDPOINT}}" } ``` ## Кластер PostgreSQL ```hcl resource "nubes_postgres" "main_pg" { resource_name = "my-postgres" # любое имя # На каком кластере Kubernetes развернуть 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" # 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" # 16 или 17 ssl_required = true # требовать SSL pooler_master = false # PgBouncer для записи pooler_slave = false # PgBouncer для чтения } # Резервное копирование backup_configuration = { s3_uid = var.s3_name # ИМЯ S3 (не UUID!) retain = 14 # сколько бэкапов хранить schedule = "0 0 * * *" # cron (ежедневно в полночь) } # Автоскейлинг диска autoscale_configuration = { enabled = false # выключен schedule = 0 # час окна (0-23) percent = 10 # % расширения quota = 100 # макс. размер диска (GB) } # Mutual TLS mtls_configuration = { type = "off" # off | manual | auto duration_ca = 175200 # время жизни CA (часы) 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) 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 # владелец } ``` ## S3-бакет для бэкапов ```hcl resource "nubes_s3bucket" "backups" { resource_name = "pg-backup-bucket" # любое имя s3_user_uid = var.s3_name # ИМЯ S3 (не UUID!) bucket_name = "my-app-backups" # имя бакета } ``` ## Запуск ```bash terraform init terraform apply ``` Все 4 ресурса за один `apply`. Terraform сам выстроит порядок: кластер → пользователь → БД → бакет.