Files
tf_provider/TEST_STAND/CRUD/README.md
T
Repinoid 5fdbc316c2 docs(crud): раздел «Как это устроено» — без натянутых терминов
Убрано «(разделение ответственности, decoupling)» — это про модули кода, не про
состояния Terraform. Написано прямо: два отдельных файла состояния.
Добавлен факт, который был скрыт: связь pg -> apps идёт через apps/creds.json,
после смены хоста или пароля файл нужно обновить и повторить apply в apps/.
Проверено: чтением файла после правки.
2026-10-02 07:52:55 +03:00

4.9 KiB
Raw Blame History

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 destroy в apps/ удаляет только приложения — данные в pg/ остаются;
  • изменения в одном каталоге не трогают другой: приложения можно пересоздавать сколько угодно, база при этом не меняется;
  • связь между каталогами — файл 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