3.9 KiB
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 сам выстроит зависимости: сначала кластер, потом пользователь, потом БД и бакет.