diff --git a/HISTORY/2026-10-01_release_subresource_password_output.md b/HISTORY/2026-10-01_release_subresource_password_output.md new file mode 100644 index 0000000..dd8fc51 --- /dev/null +++ b/HISTORY/2026-10-01_release_subresource_password_output.md @@ -0,0 +1,102 @@ +# 2026-10-01 — Перезаливка 1.0.0 / 2.0.0 / 3.0.0 с выходом `password` у подресурсов-пользователей + +> Команда владельца: «делай. сначала удали старые .0 провайдеры чтобы не путаться» + +> подтверждение номеров: `1.0.0` / `2.0.0` / `3.0.0`. + +## Зачем перезаливать + +После релиза `keep_on_destroy` (см. `HISTORY/2026-10-01_release_keep_on_destroy_subresources.md`) +в мастер пришла новая фича: **подресурс-пользователь отдаёт пароль своим выходом** +(коммиты `58c519e` — генератор/ядро, `066d6b4` — стенд, `1a049ef` — архитектура). + +Причина: пароль пользователя генерирует платформа и кладёт его в секрет Vault +**родительского инстанса**, а `vault_secrets` родителя — `Computed` и обновляется +только при его `Read`. Поэтому внутри одного `apply` после `create_user` пароль был +недоступен: `jsondecode(vault_secrets["users"])[...]` → `Invalid index`. Из-за этого +стенду требовались костыль `try()` или двухшаговый apply. + +## Шаг 0. Удаление старых версий (необратимо) + +Сначала удалены **физически** старые версии (бакет `un-versioned`): + +```bash +mc --config-dir /tmp/mc-cfg rm --recursive --force \ + prod-s3/nubes-terraform-registry/tf-registry.containerk8s.services.ngcloud.ru//nubes// +``` + +| Namespace | Версия | Удалено объектов | +|---|---|---| +| `nubes` (prod) | `1.0.0` | 5 | +| `nubes-test` | `3.0.0` | 5 | +| `nubes-dev` | `2.0.0` | 5 | + +Не тронуты: `2.0.1`, `2.0.21`–`2.0.24` (dev). + +## Шаг 1. Заливка новых сборок под теми же номерами + +```bash +export MC_CONFIG_DIR=/tmp/mc-cfg +./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/test 3.0.0 +./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/dev 2.0.0 +./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/prod 1.0.0 +``` + +| Стенд | Namespace | Версия | sha256 залитого == локальному | +|---|---|---|---| +| TEST | `nubes-test` | `3.0.0` | ✅ `e188a635064ec0fc…` | +| DEV | `nubes-dev` | `2.0.0` | ✅ `ac8d99fb02487272…` | +| PROD | `nubes` | `1.0.0` | ✅ `0de9aa4537a74ecf…` | + +API `/versions`: `nubes` → `['1.0.0']`, `nubes-test` → `['3.0.0']`, +`nubes-dev` → `['2.0.0','2.0.1','2.0.21','2.0.22','2.0.23','2.0.24']`. + +## Шаг 2. Проверка схемы залитой сборки (test 3.0.0) + +`terraform providers schema -json` (62 ресурса): + +| Ресурс | `password` в схеме | Что это | +|---|---|---| +| `nubes_postgres_user` | `computed: true, sensitive: true` | **новый выход** (читается из Vault родителя) | +| `nubes_kafka_user` | `computed: true, sensitive: true` | новый выход | +| `nubes_clickhouse_user` | `computed: true, sensitive: true` | новый выход | +| `nubes_mongodb_user` | `computed: true, sensitive: true` | новый выход | +| `nubes_postgres_database` | нет атрибута | — | +| `nubes_mariadb_user` | `optional+computed+sensitive` | **входной** параметр (не тронут) | +| `nubes_pgadmin` | `required+sensitive` | **входной** параметр сервиса (не тронут) | + +Признак фичи вычисляется из данных спека (см. `TOOLS/ARCHITECTURE.md`): +`подресурс user` + `у сервиса есть vault-выходы` + `create_user принимает username` ++ `create_user НЕ принимает password`. Имя сервиса в коде не проверяется. + +## Шаг 3. Стенд + +`TEST_STAND/CRUD/pg/outputs.tf`: + +```hcl +output "pg_password" { + value = nubes_postgres_user.crud_user_0.password + sensitive = true +} +``` + +Проверено после релиза: `terraform init` + `validate` → Success; `plan` → `3 to add, +0 to change, 0 to destroy`, в плане `password = (sensitive value)`. +Ни `try()`, ни двух apply в `pg/` больше не требуется. + +Локальные кэши провайдера в `pg/` и `apps/` переинициализированы (при той же версии +Terraform не перекачивает пакет: `.terraform.lock.hcl` фиксирует хэши — при +несовпадении удалить lock и `.terraform/providers`, затем `terraform init`). + +## ⚠️ Состояние стенда на момент релиза + +`TEST_STAND/CRUD/pg/terraform.tfstate` — **пуст** (180 байт, `resources: []`, +`terraform state list` пуст), бэкап — 10010 байт. В облаке инстанс `pg4crud2` +существовал в статусе `deleted`/`isSuspended` (проверка по API ранее). Исполнитель +(агент) `apply`/`destroy` не запускал — только `init`/`validate`/`plan`/`state`-чтение. + +## Связанные документы + +- `TOOLS/ARCHITECTURE.md` → «Subresource-born secrets» — принцип и правило; +- `HISTORY/2026-10-01_release_keep_on_destroy_subresources.md` — прошлая перезаливка; +- `HISTORY/2026-09-30_dev_registry_prune_versions.md` — процедура удаления версий; +- `VERSIONS.md` — таблица версий (обновлена). diff --git a/VERSIONS.md b/VERSIONS.md index e47324b..53b24fe 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -4,9 +4,13 @@ | Стенд | Namespace | Версия | Дата заливки | Примечание | |---|---|---|---|---| -| PROD | `nubes` | `1.0.0` | 2026-10-01 | **перезалит** (полный цикл 01→02→03) с фичей `keep_on_destroy` для подресурсов; sha256 сверен: `e509ced2b11440fc…` | -| DEV | `nubes-dev` | `2.0.0` | 2026-10-01 | **перезалит** с фичей `keep_on_destroy`; sha256 сверен: `0d9897c2fdddff2b…`; в реестре также `2.0.1`, `2.0.21`–`2.0.24` (не пересобирались) | -| TEST | `nubes-test` | `3.0.0` | 2026-10-01 | **перезалит** с фичей `keep_on_destroy`; sha256 сверен: `0e859ffd58fd5e7d…`; проверено схемой: атрибут есть у 60 из 62 ресурсов | +| PROD | `nubes` | `1.0.0` | 2026-10-01 | **перезалит** с выходом `password` у подресурсов-пользователей; sha256: `0de9aa4537a74ecf…` | +| DEV | `nubes-dev` | `2.0.0` | 2026-10-01 | **перезалит** с выходом `password`; sha256: `ac8d99fb02487272…`; в реестре также `2.0.1`, `2.0.21`–`2.0.24` | +| TEST | `nubes-test` | `3.0.0` | 2026-10-01 | **перезалит** с выходом `password`; sha256: `e188a635064ec0fc…` | + +> ⚠️ **2026-10-01: старые `1.0.0` / `2.0.0` / `3.0.0` перед перезаливкой УДАЛЕНЫ физически** +> (бакет un-versioned, удаление необратимо), затем залиты заново теми же номерами. +> Прочие dev-версии (`2.0.1`, `2.0.21`–`2.0.24`) не тронуты. > ⚠️ **Хранение в реестре (2026-09-30):** в dev-реестре (`nubes-dev/nubes`) версии > `2.0.0`–`2.0.20` были удалены физически (бакет un-versioned).