docs(crud): в README не было клонирования и адресов приложений — добавлено

Владелец: «где про клонирование?? глазами юзера просмотри весь текст». Пройдено
по тексту целиком, добавлено то, без чего пользователь не начнёт и не проверит:
- раздел «Где взять манифесты»: git clone terraform/tf_provider, cd
  TEST_STAND/CRUD, проверка terraform version, откуда берётся провайдер и какой
  версии (обе папки: nubes-test/nubes 3.0.0);
- раздел «Запуск» стал «четыре шага»: шаг 4 «Проверить» с реальными адресами
  (lucee-crud.luceek8s.dev.nubes.ru, flask-crud.pythonk8s.dev.nubes.ru,
  nodejs-crud.nodejsk8s.dev.nubes.ru) и командой, как посмотреть свои адреса в
  state; проверено грепом по apps/terraform.tfstate;
- заменена заглушка <суффикс> на фактический суффикс nodejsk8s;
- добавлен раздел «Если apply упал» (журнал операции вместо errorLog);
- в «Файлы» добавлены terraform.tfvars.example;
- шаг 3: формулировка про имена приведена к исправленной (задаются в locals.tf).
Одновременно исправлена моя ошибка: предыдущая правка склеила две строки
таблицы «Файлы» (pg/main.tf и pg/postgres.tf) — восстановлено.
То же продублировано в docs/curated/crud/three_apps.md (файлы обязаны совпадать).
Проверено: 260 и 265 строк, блоки кода парные (22 и 24), заголовки на месте.
This commit is contained in:
Repinoid
2026-10-02 08:33:17 +03:00
parent 25f9114950
commit 272d4051f4
2 changed files with 102 additions and 9 deletions
+60 -4
View File
@@ -9,6 +9,27 @@ CRUD = Create / Read / Update / Delete — создать, прочитать,
---
## Где взять манифесты
Каталог примера — `TEST_STAND/CRUD` в репозитории провайдера. Клонируйте и перейдите в него:
```bash
git clone https://gitea.services.ngcloud.ru/terraform/tf_provider.git
cd tf_provider/TEST_STAND/CRUD
```
Нужен установленный Terraform:
```bash
terraform version
```
Провайдер берётся из реестра — источник и версия заданы в `pg/main.tf` и `apps/main.tf`
(test-стенд: `tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes`, версия `3.0.0`).
Дальше все команды выполняются из каталога `TEST_STAND/CRUD`.
---
## Как это устроено
Два каталога — два отдельных файла состояния Terraform:
@@ -50,7 +71,7 @@ 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` | здесь задаётся **не полный домен, а имя** — суффикс платформа добавляет сама: `lucee-crud` → `lucee-crud.luceek8s.dev.nubes.ru`, `flask-crud` → `flask-crud.pythonk8s.dev.nubes.ru`, `nodejs-crud` → `nodejs-crud.<суффикс>.dev.nubes.ru`. Полные имена уникальны (это обычные DNS-имена), поэтому и задаваемое имя должно быть уникальным |
| `lucee_domain`, `flask_domain`, `nodejs_domain` | `apps/locals.tf` | здесь задаётся **не полный домен, а имя** — суффикс платформа добавляет сама: `lucee-crud` → `lucee-crud.luceek8s.dev.nubes.ru`, `flask-crud` → `flask-crud.pythonk8s.dev.nubes.ru`, `nodejs-crud` → `nodejs-crud.nodejsk8s.dev.nubes.ru`. Полные имена уникальны (это обычные DNS-имена), поэтому и задаваемое имя должно быть уникальным |
Почему это важно: все ресурсы создаются с `adopt_existing_on_create = true`, а провайдер ищет
инстанс **по имени внутри своего сервиса** (`provider/internal/resources_core/crud.go:171`,
@@ -85,7 +106,7 @@ cd ../apps && cp terraform.tfvars.example terraform.tfvars
---
## Запуск — три шага
## Запуск — четыре шага
### 1. База данных (`pg/`)
@@ -128,8 +149,27 @@ terraform apply
Создадутся три приложения, подключённые к общей БД.
Обязательные значения — `api_token` и `realm` (те же, что в `pg/`). Имена доменов нужно
придумать самому, они должны быть уникальны в облаке — см. раздел «Что пользователь задаёт сам».
Обязательные значения — `api_token` и `realm` (те же, что в `pg/`). Имена доменов и имена
ресурсов приложений задаются в `apps/locals.tf` — см. раздел «Что пользователь задаёт сам».
### 4. Проверить
Откройте в браузере три адреса (это полные домены, которые платформа построила из имён в
`apps/locals.tf`):
| Приложение | Адрес |
|---|---|
| Lucee | <https://lucee-crud.luceek8s.dev.nubes.ru> |
| Flask | <https://flask-crud.pythonk8s.dev.nubes.ru> |
| Node.js | <https://nodejs-crud.nodejsk8s.dev.nubes.ru> |
Свои адреса можно посмотреть в state:
```bash
grep -o 'https://[a-z0-9.-]*\.dev\.nubes\.ru' apps/terraform.tfstate | sort -u
```
Добавьте запись в одном приложении — она появится в двух других (таблица `crud_items` общая).
---
@@ -147,6 +187,21 @@ terraform apply
---
## Если `apply` упал
Текст ошибки в поле `errorLog` у платформы **не всегда отражает суть** — реальная причина видна
в журнале операции:
```bash
GET {api_endpoint}/instanceOperations/<UID>?fields=cfsParams,errorLog,stages
```
`stages[].stageMsg` — массив пар `[заголовок, лог]`, смотреть последнюю запись; `cfsParams` —
фактический набор параметров, ушедший на платформу. Разбор реального случая:
`HISTORY/60_stands/2026-10-01_test_crud_pg_create_failure.md`.
---
## Файлы
| Файл | Что делает |
@@ -158,6 +213,7 @@ terraform apply
| `apps/main.tf` | провайдер, переменные приложений |
| `apps/locals.tf` | чтение `creds.json`, домены, версии, размеры |
| `apps/lucee.tf`, `apps/flask.tf`, `apps/nodejs.tf` | три приложения |
| `pg/terraform.tfvars.example`, `apps/terraform.tfvars.example` | шаблоны для копирования в `terraform.tfvars` |
| `apps/creds.json` | генерируется шагом 2, **не в git** |
---