Files
tf_provider/README.md
T
Repinoid 61405dd3dd 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_...: дополнение с фактами и указанием, что первый разбор ошибся.
2026-10-01 14:06:06 +03:00

143 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Terraform Provider Nubes — карта проекта
Репозиторий содержит **Terraform-провайдер Nubes Cloud** и всю обвязку вокруг него:
генераторы (API → YAML → Go), пайплайн сборки/заливки, документацию, стенды и служебные материалы.
Облачная платформа — **VMware Cloud Director**; сервисы Nubes (`vcOrg`, `vcVdc`, `vcNsxt`, `k8s…`)
создают объекты в ней. Провайдер генерируется из спецификаций API, а не пишется руками.
---
## 🚦 Быстрая навигация
| Что нужно | Куда идти |
|---|---|
| **Инструкции: сборка, заливка, добавление сервиса** | **[`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/) |
| Пайплайн публикации документации | [`DOCS_PIPELINE/README.md`](DOCS_PIPELINE/README.md) |
| Залитые версии провайдера (источник правды) | [`VERSIONS.md`](VERSIONS.md) |
| Правила генерации кода (обязательны для генератора) | [`TOOLS/ARCHITECTURE.md`](TOOLS/ARCHITECTURE.md) |
| Правила работы для агента | [`.github/copilot-instructions.md`](.github/copilot-instructions.md) |
| Текущая задача (IaC + `modify`) | [`NOTES/40_chat_summaries/CHAT_RESUME_IAC_2026-09-24.md`](NOTES/40_chat_summaries/CHAT_RESUME_IAC_2026-09-24.md) |
---
## ⚠️ Грабли, на которые уже наступали (чтобы не искать заново)
| Симптом | Что на самом деле | Где смотреть |
|---|---|---|
| `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
cd /home/naeel/TF/tf_provider
# 1) YAML-спеки из API стенда
./TOOLS/scripts/01_generate_yamls.sh --profile TOOLS/config/dev
# 2) YAML → Go-ресурсы + документация
./TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/dev
# 3) Сборка (linux/windows/darwin) + GPG-подпись + заливка в S3
./TOOLS/scripts/03_build_and_upload_provider.sh --profile TOOLS/config/dev 2.0.18
# 4) (опционально) публикация документации
./TOOLS/scripts/04_build_and_publish_docs.sh --profile TOOLS/config/dev 2.0.18
```
**Подробные инструкции:**
[`HOW_TO/HOWTO-UPLOAD.md`](HOW_TO/HOWTO-UPLOAD.md) (сборка/заливка) ·
[`HOW_TO/DEVOPS_BUILD_PIPELINE.md`](HOW_TO/DEVOPS_BUILD_PIPELINE.md) (полный ранбук + GPG-bootstrap) ·
[`HOW_TO/HOWTO_ADD_NEW_SERVICE.md`](HOW_TO/HOWTO_ADD_NEW_SERVICE.md) (новый сервис).
**Схема версий (жёстко):** `prod = 1.*`, `dev = 2.*`, `test = 3.*`.
Легаси (`prod=2.*`, `dev=3.*`, `test=5.*`, `0.0.1`) — не использовать.
---
## Структура репозитория
| Путь | Что это |
|---|---|
| **`HOW_TO/`** | **Все общие инструкции:** сборка/заливка, пайплайн, добавление сервиса, миграция, генерация доков. Индекс: `HOW_TO/README.md` |
| **`NOTES/`** | Рабочие материалы: `10_plans`, `20_prompts`, `30_analysis`, `40_chat_summaries`, `60_reference`. Карта: `NOTES/README.md` |
| **`docs/`** | Документация: публикуемый сайт (mkdocs) + внутренние разделы (см. ниже) |
| **`DOCS_PIPELINE/`** | Пайплайн публикации сайта документации (`publish-docs.sh`) |
| **`HISTORY/`** | Архив по датам (`HISTORY/OPUS/`, `HISTORY/SONNET/`) — хроника решений и разборов |
| **`TOOLS/`** | Генераторы и скрипты: `yaml-generator` (API→YAML), `resource-generator` (YAML→Go), `docs-generator`, `scripts/`, `config/`, `lib/`. Правила: `TOOLS/ARCHITECTURE.md` |
| **`provider/`** | Исходники самого провайдера (ядро, CRUD-хелперы, `main.go`) |
| **`generated/`** | Машинный выхлоп: `generated/<стенд>/resources_yaml`, `/go`, `/docs`, `/provider_build` |
| **`DEV_STAND/`, `TEST_STAND/`, `PROD_STAND/`** | Terraform-манифесты стендов (проверочные конфигурации, `sync.sh`) |
| **`HAR/`** | HAR-дампы live-запросов к API (сырые данные для анализа) |
| **`secrets/`** | Токены стендов, GPG-ключи, S3-креды. **Не коммитить** |
| **`gateway/`, `apps/`, `charts/`** | Вспомогательный сервис/приложения/чарты (вне ядра провайдера) |
| **`tf_examples/`, `tfflaskcrud/`, `tfluceecrud/`, `tfnodejscrud/`** | Примеры конфигураций Terraform |
| **`! /`** | Прецедент Cloud Director (чужой tf-код на официальном `terraform-provider-vcd`) — образец «как надо» |
| **`TMP/`** | Временное/бэкапы |
| `mkdocs.yml`, `site/`, `site_test/` | Конфиг и вывод сборки сайта документации |
---
## Документация: `docs/`
Собирается mkdocs (`mkdocs.yml`, nav → `docs/`). Разделы:
| Раздел | Что внутри |
|---|---|
| `docs/index.md`, `docs/30_registry/` | **Публикуется**: главная, справочник ресурсов, руководства, ассеты |
| `docs/curated/` | Проверенные примеры (напр. `postgres/pg_user_db.md`) |
| `docs/90_finance/` | Финансовые шаблоны (акт) |
| `docs/ops/` | Операционные runbook'и: `API_TOKENS.md`, `STANDS.md`, `MONITORING.md`, `ROLLBACK.md`, `RUNBOOK.md`, `TESTING.md` |
| `docs/help/` | Внутренние справки: `BUILD.md`, `build-and-publish.md`, `architecture-and-methods.md`, `error-knowledge-base.md`, `dev-reference/` |
| `docs/00_overview/`, `docs/20_discovery/`, `docs/40_analysis/`, `docs/50_history/`, `docs/60_strategy/`, `docs/70_api/` | Внутренние разделы (исключены из сайта: `exclude_docs` в `mkdocs.yml`) |
| `docs/TODO/` | Технические заметки «что не сделано» |
---
## Пайплайн (что происходит под капотом)
```
API стенда ──01──▶ generated/<стенд>/resources_yaml/*.yaml (yaml-generator)
│
├──02──▶ generated/<стенд>/go/*.go (resource-generator + registry)
│ generated/<стенд>/docs/*.md (docs-generator)
│
├──03──▶ сборка linux/windows/darwin → GPG-подпись → S3-реестр
└──04──▶ mkdocs build → публикация документации
```
Ключевое: **схема tf-ресурса строится из операции `create`** в YAML, а ID операций/параметров
сохраняются из API. Нюансы и известные ограничения — в `NOTES/30_analysis/` и `NOTES/README.md`.
---
## Стенды и реестр
| Стенд | Namespace | Диапазон версий | Профиль |
|---|---|---|---|
| PROD | `nubes` | `1.*` | `TOOLS/config/prod` |
| DEV | `nubes-dev` | `2.*` | `TOOLS/config/dev` |
| TEST | `nubes-test` | `3.*` | `TOOLS/config/test` |
- Реестр: `tf-registry.containerk8s.services.ngcloud.ru`; бакет бинарников `nubes-terraform-registry`.
- Общий конфиг реестра: `TOOLS/config/registry.env`; стенд-специфика: `TOOLS/config/<стенд>/profile.env`
(`NUBES_API_ENDPOINT`, `TOKEN_FILE`, `NAMESPACE`, `VERSION`).
- Список сервисов для генерации: `TOOLS/config/<стенд>/services_list.txt` (у каждого стенда свой;
общего списка нет — см. `HISTORY/2026-09-30_yaml_pipeline_hardening.md`).
---
## ⛔ Чего не делать
- **Не использовать** легаси-схемы версий (`prod=2.*`, `dev=3.*`, `test=5.*`, `0.0.1`).
- **Не использовать** закрытые API и хосты: `index.cfm`, `registry.kube5s.ru`, `deck-api.ngcloud.ru`.
- **Не вызывать** старые бинарники из `TOOLS/*/bin/` — скрипты пересобирают генераторы сами.
- **Не перегенерировать GPG-ключ** подписи — сломается `terraform init` у пользователей.
- **Не путать бакеты:** бинарники `nubes-terraform-registry`, документация `terraform-registry`.
- **Не опираться** на файлы с баннером ⛔ в `NOTES/` и `HISTORY/` — это отменённые («ложные») пути.