docs(release): перезаливка 1.0.0/2.0.0/3.0.0 с выходом password у подресурсов

- старые x.0.0 удалены физически из реестра по команде владельца, затем залиты заново
  теми же номерами; sha256 всех трёх сверен с локальными сборками;
- VERSIONS.md: новые sha256 + пометка об удалении версий;
- HISTORY: зачем, что удалено, схема залитой сборки (password — новый выход у
  postgres_user/kafka_user/clickhouse_user/mongodb_user; у mariadb_user и pgadmin
  это прежние входные параметры), проверка стенда, состояние state.
This commit is contained in:
Repinoid
2026-10-01 17:31:26 +03:00
parent 066d6b472b
commit cc8f338969
2 changed files with 109 additions and 3 deletions
@@ -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/<ns>/nubes/<v>/
```
| 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` — таблица версий (обновлена).
+7 -3
View File
@@ -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).