Files
tf_provider/TEST_STAND/CRUD
Repinoid 03b368a55a test_stand/crud(apps): новые имена ресурсов + SERVICE_NAME для колонки created_by
- locals.tf: crud-flask → flask-crud, crud-lucee → lucee-crud, crud-nodejs → nodejs-crud;
- json_env: SERVICE_NAME = flask/lucee/nodejs (без -crud) — это значение пишется
  приложением в колонку created_by таблицы crud_items;
- terraform validate — Success.

Код приложений (DDL created_at/created_by + INSERT + UI) — в репозиториях
tfflaskcrud/tfnodejscrud/tfluceecrud (origin переключён на terraform/*):
e5fce97, 23338cb, ffcd0c0.
2026-10-01 18:37:44 +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)