docs: пароль БД через vault_secrets["users"] — задокументировано, чтобы не искать

Проверено по API 2026-10-01 (pg4crud2, TEST):
GET /instances/<uid>/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_...: дополнение с фактами и указанием, что первый разбор ошибся.
This commit is contained in:
Repinoid
2026-10-01 14:06:06 +03:00
parent 9c1acabb4e
commit 61405dd3dd
4 changed files with 79 additions and 0 deletions
@@ -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.<username>.password`
не был описан нигде. Исправлено 2026-10-01: добавлен раздел в `docs/curated/postgres/pg_user_db.md`,
ссылка в корневом `README.md`, предупреждение в самом гайде.
+11
View File
@@ -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/<UID>?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
@@ -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 { "<username>": { "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"
+49
View File
@@ -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/<instanceUid>/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/<UID>?fields=cfsParams,errorLog,stages
```
`stages[].stageMsg` — JSON-массив пар `[заголовок, лог]`, смотреть последнюю запись. Там же `cfsParams` — фактический payload, ушедший на платформу. Разбор реального случая: `HISTORY/2026-10-01_test_crud_pg_create_failure.md`.