docs(crud): раздел «Что пользователь задаёт сам» + правила уникальности имён

Замечание владельца: в README не было видно, какие параметры юзер задаёт СВОИМИ
значениями, и не сказано про уникальность домена и имени инстанса.
Добавлен раздел (сразу после «Как это устроено»):
- обязательные значения: api_token (pg+apps), realm (pg+apps, одно и то же),
  s3_name (pg) + команды создания terraform.tfvars в обеих папках;
- имена, которые нужно придумать: pg_resource_name и *_resource_name приложений —
  уникальны в пределах стенда; pg_username/pg_db_name — в пределах кластера
  (служебные admin/postgres/standby платформа не примет); *_domain — уникальны
  в облаке;
- почему: adopt_existing_on_create ищет инстанс по имени внутри сервиса
  (provider/internal/resources_core/crud.go:171, provider/internal/core/refsvc_find.go:47),
  поэтому при занятом имени провайдер не создаёт новый ресурс, а усыновляет
  существующий; без adopt — падает с «уже существует». Пример: tflucee/tfflask/
  tfnodejs заняты старыми инстансами (apps/locals.tf:45,57,68);
- что можно не задавать: перечислены дефолты pg/main.tf и размеры в apps/locals.tf.
Из шагов 1 и 3 убраны дублирующие таблицы — теперь ссылка на раздел, комментарии
в командах поправлены («см. таблицу ниже» больше не существует).
Проверено: 190 строк, 14 строк с блоками кода (чётно), заголовки на месте.
This commit is contained in:
Repinoid
2026-10-02 08:07:58 +03:00
parent d0c20f42a0
commit 7b63f12347
+51 -12
View File
@@ -26,6 +26,51 @@ CRUD/
--- ---
## Что пользователь задаёт сам
### Обязательные значения (без них `apply` не пройдёт)
| Переменная | Где | Что это |
|---|---|---|
| `api_token` | `pg/terraform.tfvars` и `apps/terraform.tfvars` | токен Nubes: ЛК → Профиль → Токены → создать «Технический» |
| `realm` | там же, **одно и то же значение** | ресурсная платформа (кластер Kubernetes), например `k8s-4-sandbox-nubes-ru`; в `apps/` обязан совпасть с `pg/`, иначе приложения не увидят кластер с базой |
| `s3_name` | `pg/terraform.tfvars` | имя (или UUID) экземпляра S3 для бэкапов: ЛК → S3 |
Файлы создаются из примеров и нужны в обеих папках:
```bash
cd pg && cp terraform.tfvars.example terraform.tfvars
cd ../apps && cp terraform.tfvars.example terraform.tfvars
```
### Имена: придумать самому, и они обязаны быть уникальными
| Имя | Где задаётся | Правило |
|---|---|---|
| `pg_resource_name` (кластер) | `pg/terraform.tfvars` | уникально **в пределах стенда** |
| `pg_username`, `pg_db_name` | `pg/terraform.tfvars` | уникальны в пределах кластера; служебные имена (`admin`, `postgres`, `standby`) платформа не примет |
| `lucee_resource_name`, `flask_resource_name`, `nodejs_resource_name` | `apps/locals.tf` | уникальны **в пределах стенда** |
| `lucee_domain`, `flask_domain`, `nodejs_domain` | `apps/locals.tf` | уникальны **в облаке** — один домен нельзя повесить на два инстанса |
Почему это важно: все ресурсы создаются с `adopt_existing_on_create = true`, а провайдер ищет
инстанс **по имени внутри своего сервиса** (`provider/internal/resources_core/crud.go:171`,
`provider/internal/core/refsvc_find.go:47`). Если такое имя уже занято, он не станет создавать
новый ресурс, а **усыновит** существующий — то есть при занятом имени можно подцепить чужой или
старый инстанс. Если усыновление отключено, `apply` упадёт с «инстанс с resource_name … уже
существует».
Живой пример: прежние имена `tflucee`, `tfflask`, `tfnodejs` заняты старыми инстансами,
поэтому в стенде взяты `lucee-crud`, `flask-crud`, `nodejs-crud` (`apps/locals.tf:45,57,68`).
### Можно не задавать (есть значения по умолчанию)
`pg/main.tf`: `pg_cpu=500`, `pg_memory=512`, `pg_replicas=1`, `pg_disk=10`, `pg_version="17"`,
`pg_retain=14`, `pg_schedule="0 0 * * *"`, `pg_timeout="11m"`, `pg_username="user4crudpg"`,
`pg_role="ddl_user"`, `pg_db_name="db4crudpg"`. Размеры приложений (`*_cpu`, `*_memory`,
`*_replicas`) — в `apps/locals.tf`.
---
## Запуск — три шага ## Запуск — три шага
### 1. База данных (`pg/`) ### 1. База данных (`pg/`)
@@ -33,18 +78,15 @@ CRUD/
```bash ```bash
cd pg cd pg
cp terraform.tfvars.example terraform.tfvars cp terraform.tfvars.example terraform.tfvars
# отредактировать terraform.tfvars (см. таблицу ниже) # заполнить api_token, realm, s3_name (раздел «Что пользователь задаёт сам»)
terraform init terraform init
terraform apply terraform apply
``` ```
Создадутся кластер (несколько минут), пользователь БД и база. Создадутся кластер (несколько минут), пользователь БД и база.
| Переменная (`pg/terraform.tfvars`) | Где взять | Обязательные значения — `api_token`, `realm`, `s3_name`. Полный список и правила по именам —
|---|---| в разделе «Что пользователь задаёт сам» выше.
| `api_token` | ЛК → Профиль → Токены → «Технический» |
| `realm` | ЛК → Кластеры (например `k8s-4-sandbox-nubes-ru`) |
| `s3_name` | ЛК → S3 → имя экземпляра (для бэкапов) |
### 2. Передать креды БД в `apps/` ### 2. Передать креды БД в `apps/`
@@ -65,18 +107,15 @@ terraform output -json > ../apps/creds.json
```bash ```bash
cd ../apps cd ../apps
cp terraform.tfvars.example terraform.tfvars cp terraform.tfvars.example terraform.tfvars
# отредактировать terraform.tfvars (см. таблицу ниже) # заполнить api_token и realm — те же, что в pg/
terraform init terraform init
terraform apply terraform apply
``` ```
Создадутся три приложения, подключённые к общей БД. Создадутся три приложения, подключённые к общей БД.
| Что заполнить/проверить | Файл | Зачем | Обязательные значения — `api_token` и `realm` (те же, что в `pg/`). Имена доменов нужно
|---|---|---| придумать самому, они должны быть уникальны в облаке — см. раздел «Что пользователь задаёт сам».
| `api_token` | `apps/terraform.tfvars` | тот же, что в `pg/` |
| `realm` | `apps/terraform.tfvars` | должен совпадать с БД |
| `lucee_domain`, `flask_domain`, `nodejs_domain` | `apps/locals.tf` | имена доменов — должны быть **уникальны** в облаке |
--- ---