Files
tf_provider/TEST_STAND/CRUD
Repinoid ed92de1544 test_stand/crud: из README и комментариев убрана вся история (try, «раньше»)
README читает человек впервые — ему нужны структура, шаги запуска и операции,
а не разбор прошлых костылей. Удалено:
- раздел «Почему нельзя создать всё одним apply» с историей про try() и PGPASSWORD;
- упоминания try() в apps/lucee.tf, apps/flask.tf, apps/nodejs.tf;
- «data-source/backend» из apps/locals.tf и путь к удалённому разделу из pg/outputs.tf.

Заодно удалён старый TEST_STAND/CRUD/terraform.tfvars (не читается, значения
перенесены в pg/terraform.tfvars и apps/terraform.tfvars).

Проверено: terraform validate — Success в pg/ и apps/ (apps — с временным creds.json).
2026-10-01 16:42:46 +03:00
..

CRUD Test Stand

Три приложения (Lucee / Flask / Node.js) + общая PostgreSQL. Каждое делает CRUD в одной таблице crud_items.

Структура — ДВЕ папки, ДВА независимых состояния

CRUD/
├── pg/      ← база данных: кластер PostgreSQL + пользователь + база
└── apps/    ← приложения-потребители: Lucee + Flask + Node.js

🎯 Почему так, а не «всё в одной папке»

Зачем Что это даёт
destroy в apps/ убивает ТОЛЬКО приложения база данных с данными не трогается — она в другом state (pg/)
БД — общий ресурс к одному кластеру можно подключить сколько угодно папок-потребителей: apps/, потом ещё my-service/, reporting/ и т.д.
Разные жизненные циклы приложения пересоздаются сколько угодно раз, БД живёт всё это время

📋 Порядок запуска (по шагам)

Шаг 0. Скачать репозиторий

git clone https://gitea.services.ngcloud.ru/terraform/tf_examples.git
cd tf_examples/CRUD

Шаг 1. База данных — папка pg/

cd pg
cp terraform.tfvars.example terraform.tfvars
#  → отредактировать terraform.tfvars: api_token, realm, s3_name
terraform init
terraform apply

Создастся кластер PostgreSQL (несколько минут), затем пользователь БД и база. В конце apply выводятся outputs, включая пароль (помечен sensitive).

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

Шаг 2. Передать креды БД в папку приложений 👈 ОДНА команда

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

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

Почему файлом: pg/ и apps/ — разные состояния Terraform, значения между ними сами не передаются.

⚠️ В creds.json пароль в открытом виде. Файл добавлен в apps/.gitignore. Не коммитить и не пересылать. Если пользователя БД пересоздавали — повторите шаг 2.

Шаг 3. Приложения — папка apps/

cd ../apps
cp terraform.tfvars.example terraform.tfvars
#  → отредактировать: api_token (тот же), realm (ТОТ ЖЕ, где создана БД)
#  → проверить домены в locals.tf: они должны быть УНИКАЛЬНЫМИ
terraform init
terraform apply

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

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

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

Что нужно Команда
Передеплоить приложения cd apps && terraform apply (БД не затрагивается)
Снести приложения cd apps && terraform destroy — БД и данные остаются
Изменить БД cd pg && terraform apply
Снести БД cd pg && terraform destroy — кластер уйдёт в Suspend, а не удалится; юзер и база останутся внутри (keep_on_destroy = true)
Добавить ещё одного потребителя той же БД скопировать apps/ → своя папка → свой creds.json (шаг 2) → свои домены

Про destroy базы

  • Кластер PostgreSQL при 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 nubes_postgres_user + nubes_postgres_database
pg/outputs.tf выводы для потребителей (хост, порт, юзер, база, пароль)
apps/main.tf провайдер + переменные приложений
apps/locals.tf креды из creds.json + домены, версии, размеры
apps/lucee.tf nubes_lucee.applucee
apps/flask.tf nubes_flask.appflask
apps/nodejs.tf nubes_nodejs.appnodejs
apps/creds.json не в git — выгрузка кредов из pg/ (шаг 2)