fix: curated PG example — use S3 name not UUID, comment every parameter

This commit is contained in:
“Naeel”
2026-08-10 21:42:41 +04:00
parent a21cbd9cd2
commit 657157527b
8 changed files with 56 additions and 274 deletions
+53 -50
View File
@@ -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 сам выстроит порядок: кластер → пользователь БД бакет.