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:
@@ -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
@@ -4,9 +4,13 @@
|
|||||||
|
|
||||||
| Стенд | Namespace | Версия | Дата заливки | Примечание |
|
| Стенд | Namespace | Версия | Дата заливки | Примечание |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| PROD | `nubes` | `1.0.0` | 2026-10-01 | **перезалит** (полный цикл 01→02→03) с фичей `keep_on_destroy` для подресурсов; sha256 сверен: `e509ced2b11440fc…` |
|
| PROD | `nubes` | `1.0.0` | 2026-10-01 | **перезалит** с выходом `password` у подресурсов-пользователей; sha256: `0de9aa4537a74ecf…` |
|
||||||
| DEV | `nubes-dev` | `2.0.0` | 2026-10-01 | **перезалит** с фичей `keep_on_destroy`; sha256 сверен: `0d9897c2fdddff2b…`; в реестре также `2.0.1`, `2.0.21`–`2.0.24` (не пересобирались) |
|
| 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 | **перезалит** с фичей `keep_on_destroy`; sha256 сверен: `0e859ffd58fd5e7d…`; проверено схемой: атрибут есть у 60 из 62 ресурсов |
|
| 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`) версии
|
> ⚠️ **Хранение в реестре (2026-09-30):** в dev-реестре (`nubes-dev/nubes`) версии
|
||||||
> `2.0.0`–`2.0.20` были удалены физически (бакет un-versioned).
|
> `2.0.0`–`2.0.20` были удалены физически (бакет un-versioned).
|
||||||
|
|||||||
Reference in New Issue
Block a user