Files
tf_provider/docs/curated/postgres/pg_user_db.md
T

3.9 KiB

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:

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

Провайдер

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

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"
}

Пользователь и база данных

# Пользователь с правами создания БД и ролей
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-бакет для бэкапов

resource "nubes_s3bucket" "backups" {
  resource_name = "pg-backup-bucket"
  s3_user_uid   = var.s3_user_uid
  bucket_name   = "my-app-backups"
}

Запуск

terraform init
terraform apply

Все четыре ресурса создаются за один apply. Порядок не важен — Terraform сам выстроит зависимости: сначала кластер, потом пользователь, потом БД и бакет.