Из шага 2 убран развёрнутый блок (он мешал последовательности трёх шагов), вместо него одна ссылка. Сам блок стал последним разделом файла «## Справка: выходные параметры pg/» (уровень заголовка 4 -> 2, т.к. теперь это самостоятельный раздел, а не подпункт шага 2). Содержимое не менялось. Проверено: grep заголовков (112: ## Справка), состав файла — 151 строка.
7.3 KiB
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 |