From 61405dd3dd56b0a41da7c5141a282c55b3edbef6 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Thu, 1 Oct 2026 14:06:06 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=91=D0=94=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20vault=5Fsecrets?= =?UTF-8?q?["users"]=20=E2=80=94=20=D0=B7=D0=B0=D0=B4=D0=BE=D0=BA=D1=83?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE,=20=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=B0=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проверено по API 2026-10-01 (pg4crud2, TEST): GET /instances//vault/users -> {"users":{"user4crudpg":{"password":"..."}}}. Пароль ЕСТЬ; state.out.users — метаданные без пароля (их легко перепутать). - README.md: строка навигации «Пароль БД / секреты Vault» + раздел «Грабли, на которые уже наступали» (Invalid index из-за одного apply; errorLog врёт — смотреть stages; лишний sensitive). - docs/curated/postgres/pg_user_db.md: раздел «Пароль пользователя БД и секреты Vault» (ловушки, два apply, диагностика через /instanceOperations?fields=stages); исправлено утверждение «все 4 ресурса за один apply» — для приложений, читающих пароль, нужен второй apply. - docs/30_registry/guides/getting-started.md: помечены устаревшие ключи adminUser/adminPass (сейчас 404). - HISTORY/2026-10-01_...: дополнение с фактами и указанием, что первый разбор ошибся. --- .../2026-10-01_test_crud_pg_create_failure.md | 16 ++++++ README.md | 11 +++++ docs/30_registry/guides/getting-started.md | 3 ++ docs/curated/postgres/pg_user_db.md | 49 +++++++++++++++++++ 4 files changed, 79 insertions(+) diff --git a/HISTORY/2026-10-01_test_crud_pg_create_failure.md b/HISTORY/2026-10-01_test_crud_pg_create_failure.md index be97a9a..4695717 100644 --- a/HISTORY/2026-10-01_test_crud_pg_create_failure.md +++ b/HISTORY/2026-10-01_test_crud_pg_create_failure.md @@ -107,3 +107,19 @@ id=1094 {"certCA":"","certServer":"","durationCA":"175200","durationServer":"87 2. **Действие за пределами прямого поручения** (`TEST_STAND/CRUD/README.md`): по команде «замени `Nail` → `terraform` в путях реп» заменён и владелец репозитория `tf_examples`, который остался у `Nail` (`/terraform/tf_examples` → 301 → `/Nail/tf_examples`). + +## Дополнение: где пароль и почему падало (проверено по API) + +- Пароль пользователя **есть**. `GET /instances/8d5b240c-fce6-4b01-8c6b-04c6bf732ba8/vault/users` → + `{"name":"users","value":{"user4crudpg":{"password":"<64 символа>"}}}`. + То же читает провайдер: `provider/internal/core/instance_outputs.go:94` (`/instances/{uid}/vault/{name}`). +- `state.out.users` — **метаданные** (`role`, `rights`, `username`, `mtlsAccess`), пароля там нет. + Именно этот объект легко принять за секрет и сделать вывод «пароля нет» — так и произошло при первом разборе. +- `vault.fields = ["users"]`; имена `adminPass`, `adminUser`, `standbyPass`, `standbyUser`, `password` → 404. +- Причина `Invalid index` в locals приложений (Lucee/Flask/Node.js): PostgreSQL и пользователь создавались + **одним** `apply`, `vault_secrets` читались на этапе Create PG, когда пользователя ещё не существовало. + Нужны два `apply` — об этом же прямо написано в `TEST_STAND/CRUD/README.md`. +- Документация расходится с фактом: `docs/30_registry/guides/getting-started.md:199-200` использует + `vault_secrets["adminUser"]` / `["adminPass"]`; актуальный формат `users..password` + не был описан нигде. Исправлено 2026-10-01: добавлен раздел в `docs/curated/postgres/pg_user_db.md`, + ссылка в корневом `README.md`, предупреждение в самом гайде. diff --git a/README.md b/README.md index 3353cb1..faf4fc3 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ | Что нужно | Куда идти | |---|---| | **Инструкции: сборка, заливка, добавление сервиса** | **[`HOW_TO/`](HOW_TO/README.md)** ← начинать отсюда | +| **Пароль БД / секреты Vault (PostgreSQL)** | **[`docs/curated/postgres/pg_user_db.md`](docs/curated/postgres/pg_user_db.md)** — откуда брать пароль и почему нужен второй `apply` | | Рабочие материалы: планы, промпты, анализы, выжимки чатов | [`NOTES/`](NOTES/README.md) | | Пользовательская документация (mkdocs) | [`docs/`](docs/README.md) | | Архив по датам и разборам | [`HISTORY/`](HISTORY/) | @@ -24,6 +25,16 @@ --- +## ⚠️ Грабли, на которые уже наступали (чтобы не искать заново) + +| Симптом | Что на самом деле | Где смотреть | +|---|---|---| +| `Invalid index ... The given key does not identify an element in this collection value` в `locals` приложений (Lucee/Flask/Node.js) | Пароль БД читается из `vault_secrets["users"]`, а он пуст, если PostgreSQL и пользователь создаются **одним** `apply`. Нужны **два apply** | [`docs/curated/postgres/pg_user_db.md`](docs/curated/postgres/pg_user_db.md) | +| `errorLog` операции не совпадает с сутью («Invalid JSON String» и подобное) | Реальная причина — в `stages`: `GET {api_endpoint}/instanceOperations/?fields=cfsParams,errorLog,stages` | [`HISTORY/2026-10-01_test_crud_pg_create_failure.md`](HISTORY/2026-10-01_test_crud_pg_create_failure.md) | +| В `plan` вместо значения печатается `(sensitive value)` | Переменная помечена `sensitive = true` без необходимости (`realm`, `s3_uid`). Секрет — только `api_token` | `TEST_STAND/CRUD/main.tf` | + +--- + ## Как собрать и залить провайдер (кратко) ```bash diff --git a/docs/30_registry/guides/getting-started.md b/docs/30_registry/guides/getting-started.md index 0584b18..bd5072e 100644 --- a/docs/30_registry/guides/getting-started.md +++ b/docs/30_registry/guides/getting-started.md @@ -196,6 +196,9 @@ resource "nubes_lucee" "app1" { testds_bundleName = "org.postgresql.jdbc" testds_bundleVersion = "42.6.0" testds_connectionString = "jdbc:postgresql://${nubes_postgres.db2.state_out_flat["internalConnect.master"]}:5432/postgres" + # ⚠️ УСТАРЕЛО: ключей adminUser/adminPass у новых инстансов НЕТ — эндпоинт /vault/<имя> отдаёт 404. + # Актуально: vault_secrets["users"] → JSON { "": { "password": "<пароль>" } }. + # Подробно: docs/curated/postgres/pg_user_db.md → «Пароль пользователя БД и секреты Vault». testds_username = nubes_postgres.db2.vault_secrets["adminUser"] testds_password = nubes_postgres.db2.vault_secrets["adminPass"] testds_connectionLimit = "5" diff --git a/docs/curated/postgres/pg_user_db.md b/docs/curated/postgres/pg_user_db.md index 68255c9..5ceb01b 100644 --- a/docs/curated/postgres/pg_user_db.md +++ b/docs/curated/postgres/pg_user_db.md @@ -139,3 +139,52 @@ terraform apply ``` Все 4 ресурса за один `apply`. Terraform сам выстроит порядок: кластер → пользователь → БД → бакет. + +> ⚠️ **Исключение — если приложение берёт пароль БД из `vault_secrets` (как в CRUD-стенде): нужен второй `apply`.** +> В первом создаются кластер и пользователь, во втором приложения получают уже появившийся пароль. +> Иначе — `Invalid index ... does not identify an element in this collection value`. + +## Пароль пользователя БД и секреты Vault + +Проверено 2026-10-01 на TEST-стенде (инстанс `pg4crud2`). + +Пароль пользователя, созданного через `nubes_postgres_user`, платформа пишет в Vault и отдаёт в выходе +`vault_secrets["users"]` — это **JSON-строка**: + +```json +{ "<имя_пользователя>": { "password": "<пароль>" } } +``` + +Как брать в конфиге: + +```hcl +locals { + pg_host = nubes_postgres.main_pg.state_out_flat["internalMaster"] + pg_user = nubes_postgres_user.crud_user_0.username + pg_pass = nonsensitive(jsondecode(nubes_postgres.main_pg.vault_secrets["users"])[local.pg_user].password) +} +``` + +Проверить вручную (то же, что читает провайдер): + +```bash +GET {api_endpoint}/instances//vault/users +``` + +### Ловушки + +- **`state.out.users` — это метаданные** (`role`, `rights`, `username`, `mtlsAccess`), **пароля там нет**. + Пароль лежит только в `vault_secrets["users"]`. Это два разных объекта, их легко перепутать. +- Список доступных имён секретов — выход `vault_fields` (у PostgreSQL это `["users"]`). +- Ключей `adminUser` / `adminPass` / `standbyUser` / `standbyPass` у новых инстансов **нет** — эндпоинт `/vault/<имя>` отдаёт 404. Они встречаются в старых материалах (например, в `docs/30_registry/guides/getting-started.md`). +- ⚠️ **Нужно два `apply`**, если PG и пользователь создаются в одном прогоне, а приложения читают пароль: см. предупреждение в разделе «Запуск» выше. + +### Диагностика сбоя операции + +`errorLog` у платформы **не отражает суть**. Реальная причина — в `stages`: + +```bash +GET {api_endpoint}/instanceOperations/?fields=cfsParams,errorLog,stages +``` + +`stages[].stageMsg` — JSON-массив пар `[заголовок, лог]`, смотреть последнюю запись. Там же `cfsParams` — фактический payload, ушедший на платформу. Разбор реального случая: `HISTORY/2026-10-01_test_crud_pg_create_failure.md`.