Files
tf_provider/TEST_STAND/CRUD
Repinoid b8f5238f05 docs(crud): справка по выходам pg перенесена в конец файла
Из шага 2 убран развёрнутый блок (он мешал последовательности трёх шагов),
вместо него одна ссылка. Сам блок стал последним разделом файла
«## Справка: выходные параметры pg/» (уровень заголовка 4 -> 2, т.к. теперь
это самостоятельный раздел, а не подпункт шага 2). Содержимое не менялось.
Проверено: grep заголовков (112: ## Справка), состав файла — 151 строка.
2026-10-02 07:59:06 +03:00
..

CRUD Test Stand

CRUD = Create / Read / Update / Delete — создать, прочитать, изменить, удалить.

Три приложения (Lucee, Flask, Node.js) работают с одной общей таблицей crud_items в PostgreSQL: в любом из них можно добавлять записи, просматривать их, редактировать и удалять.

Итог после запуска: добавьте запись в одном приложении — остальные два её увидят.


Как это устроено

Два каталога — два отдельных файла состояния Terraform:

CRUD/
├── pg/     база данных: кластер PostgreSQL + пользователь + база
└── apps/   приложения: Lucee + Flask + Node.js
  • terraform apply и terraform destroy в apps/ меняют только приложения (создают, изменяют, удаляют) — база в pg/ не затрагивается;
  • terraform apply и terraform destroy в pg/ меняют только базу — приложения в apps/ не затрагиваются;
  • приложения можно пересоздавать сколько угодно, база при этом не меняется;
  • связь между каталогами — файл apps/creds.json (см. шаг 2): он делается из terraform output в pg/, поэтому после смены хоста или пароля его нужно обновить и повторить apply в apps/.

Запуск — три шага

1. База данных (pg/)

cd pg
cp terraform.tfvars.example terraform.tfvars
# отредактировать terraform.tfvars (см. таблицу ниже)
terraform init
terraform apply

Создадутся кластер (несколько минут), пользователь БД и база.

Переменная (pg/terraform.tfvars) Где взять
api_token ЛК → Профиль → Токены → «Технический»
realm ЛК → Кластеры (например k8s-4-sandbox-nubes-ru)
s3_name ЛК → S3 → имя экземпляра (для бэкапов)

2. Передать креды БД в apps/

# всё ещё в папке pg/
terraform output -json > ../apps/creds.json

Одна команда выгружает хост, порт, имя пользователя, имя БД и пароль в apps/creds.json. Приложения читают этот файл (см. apps/locals.tf).

⚠️ В creds.json пароль лежит открытым текстом: файл в apps/.gitignore, не коммитить и не пересылать.

Что именно выгружается и как это читают приложения — в разделе «Справка» в конце файла.

3. Приложения (apps/)

cd ../apps
cp terraform.tfvars.example terraform.tfvars
# отредактировать terraform.tfvars (см. таблицу ниже)
terraform init
terraform apply

Создадутся три приложения, подключённые к общей БД.

Что заполнить/проверить Файл Зачем
api_token apps/terraform.tfvars тот же, что в pg/
realm apps/terraform.tfvars должен совпадать с БД
lucee_domain, flask_domain, nodejs_domain apps/locals.tf имена доменов — должны быть уникальны в облаке

Повседневные операции

Задача Команда
Передеплоить приложения cd apps && terraform apply
Удалить приложения cd apps && terraform destroy — БД не трогается
Изменить БД cd pg && terraform apply
Удалить БД cd pg && terraform destroy — кластер уйдёт в Suspend, а не удалится

При destroy БД кластер переводится в Suspend, а пользователь и база остаются (keep_on_destroy = true). Полное удаление: снять keep_on_destroy в pg/postgres_user_db.tf и apply.


Файлы

Файл Что делает
pg/main.tf провайдер, переменные кластера/пользователя/базы
pg/postgres.tf кластер nubes_postgres.main_pg
pg/postgres_user_db.tf пользователь crud_user_0 + база pg_db
pg/outputs.tf хост, порт, юзер, база, пароль — для выгрузки кредов
apps/main.tf провайдер, переменные приложений
apps/locals.tf чтение creds.json, домены, версии, размеры
apps/lucee.tf, apps/flask.tf, apps/nodejs.tf три приложения
apps/creds.json генерируется шагом 2, не в git

Справка: выходные параметры pg/

В pg/outputs.tf объявлено шесть выходов:

Выход Значение Откуда
pg_host внутренний хост master state_out_flat["internalMaster"] кластера
pg_port 5432 константа в outputs.tf
pg_username имя пользователя БД выход подресурса nubes_postgres_user
pg_db_name имя базы выход nubes_postgres_database
pg_password пароль, sensitive = true выход подресурса nubes_postgres_user: платформа генерирует пароль сама при создании пользователя, провайдер читает его из Vault и отдаёт выходом подресурса
pg_ssl_mode require константа в outputs.tf

terraform output -json кладёт в файл не голые значения, а объекты вида { "sensitive": ..., "type": ..., "value": ... }:

{
  "pg_host":     { "sensitive": false, "type": "string", "value": "<хост master>" },
  "pg_password": { "sensitive": true,  "type": "string", "value": "<пароль>" }
}

Поэтому в apps/locals.tf значение берётся через .value:

creds   = jsondecode(file("${path.module}/creds.json"))
pg_host = local.creds.pg_host.value
pg_pass = local.creds.pg_password.value

Дальше apps/*.tf передают эти значения приложениям как переменные окружения:

Выход pg/ Flask Node.js Lucee
pg_host PGHOST PGHOST PGHOST, testds_connectionString
pg_port PGPORT PGPORT PGPORT, testds_connectionString
pg_username PGUSER PGUSER PGUSER, testds_username
pg_password PGPASSWORD PGPASSWORD PGPASSWORD, testds_password
pg_db_name PGDATABASE PGDATABASE testds_connectionString, DATABASE_URL
pg_ssl_mode PGSSLMODE PGSSLMODE PGSSLMODE