test_stand/crud: разделение на pg/ (общая БД) и apps/ (потребители)

Было: одна папка, один state — destroy убивал и БД, и приложения; пароль БД
приходилось вытаскивать костылём try() в одном apply, приложения поднимались
с пустым PGPASSWORD.

Стало:
- pg/  — кластер PostgreSQL + пользователь + база + outputs (хост/порт/юзер/база/пароль);
  destroy здесь переводит кластер в Suspend, а пользователь и база не удаляются
  (keep_on_destroy = true + adopt_existing_on_create = true);
- apps/ — три приложения-потребителя; креды БД читаются из creds.json (выгрузка
  outputs папки pg/, т.к. state раздельные, а data-source у провайдера нет);
  try() убран полностью — пароль к моменту этого apply уже существует;
- apps/.gitignore — creds.json, terraform.tfvars, state/lock;
- README.md переписан: структура, «зачем разделено», пошаговые 3 шага запуска,
  повседневные операции (destroy приложений не трогает БД), про destroy базы.

Проверено: terraform init+validate в обеих папках — Success;
plan в pg/ — 3 to add (кластер, пользователь, база) + 6 outputs.
This commit is contained in:
Repinoid
2026-10-01 16:35:14 +03:00
parent db69965520
commit 4834e992f3
21 changed files with 733 additions and 452 deletions
+72
View File
@@ -0,0 +1,72 @@
# =============================================================================
# PG — общая база данных для CRUD-приложений
# =============================================================================
#
# Эта папка управляет ТОЛЬКО базой данных: сам кластер PostgreSQL, пользователь и
# база. Она НЕ знает про приложения (Lucee/Flask/Node.js) — приложения живут в
# соседней папке apps/ и подключаются к этой БД через выгруженные креды.
#
# ЗАЧЕМ так разделено (папка pg/ отдельно от apps/):
# - БД — общий ресурс: к одному кластеру может подключаться несколько наборов
# приложений (сейчас apps/, потом любые другие папки).
# - terraform destroy в apps/ должен убивать ТОЛЬКО приложения, а не БД с данными.
# Если бы всё лежало в одном state, destroy снёс бы и кластер.
# - Разные state ⇒ разные жизненные циклы: БД живёт дольше приложений.
#
# Порядок запуска — см. README.md в родительской папке CRUD/.
# =============================================================================
resource "nubes_postgres" "main_pg" {
resource_name = var.pg_resource_name
startup_configuration = {
resource_realm = var.realm
}
cluster_configuration = {
cpu = var.pg_cpu
memory = var.pg_memory
replicas = var.pg_replicas
disk = var.pg_disk
}
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 = var.pg_version
ssl_required = true
pooler_master = false
pooler_slave = false
}
postgres_conf = jsonencode([{
paramName = "log_connections"
paramValue = "''"
}])
backup_configuration = {
s3_uid = var.s3_name
retain = var.pg_retain
schedule = var.pg_schedule
}
autoscale_configuration = {
enabled = false
schedule = 0
percent = 10
quota = 100
}
operation_timeout = var.pg_timeout
adopt_existing_on_create = true
# ⚠️ destroy: кластер НЕ удалять, а переводить в Suspend.
# Это поведение по умолчанию сервиса postgres (suspend_on_destroy_default: true
# в generated/test/resources_yaml/90_postgres.yaml). Явно НЕ ставим отсюда, чтобы
# destroy случайно не снёс БД с данными.
}