Commit Graph
39 Commits
Author SHA1 Message Date
Repinoid 3f05d798e1 docs(crud): раздел «Код приложений (git)» со ссылками на репозитории
В README стенда не было путей к репозиториям приложений. Добавлен раздел перед
«Запуск — три шага»: таблица со ссылками на terraform/tfluceecrud, terraform/
tfflaskcrud, terraform/tfnodejscrud и указание, что пути задаются в apps/locals.tf.
Про git_revision не написано — в этом стенде такого поля нет (проверено grep:
в apps/*.tf только version/git_path/health_path).
Проверено: раздел на месте, фаерсы 14 (чётно).
2026-10-02 08:13:43 +03:00
Repinoid 39849bf459 docs(crud): раздел «Что пользователь задаёт сам» продублирован на странице сайта
Стендовый README и страница curated/crud/three_apps.md описывают одно и то же,
поэтому раздел перенесён в страницу сайта сразу после «Структура манифестов»:
- обязательные значения (api_token, realm, s3_name) и создание terraform.tfvars;
- имена с правилами уникальности (кластер и приложения — в пределах стенда,
  юзер/база — в пределах кластера, домены — в облаке) и объяснение через
  adopt_existing_on_create (crud.go:171, refsvc_find.go:47);
- что можно не задавать (дефолты pg/main.tf).
Из шагов 1 и 3 убраны дублирующие таблицы — вместо них ссылка на раздел.
Плюс выровнены отступы в блоке cp terraform.tfvars.example (в двух файлах было
по-разному).
Проверено: diff разделов — совпадает построчно, отличие только в разделителе «---»
(есть в README, не используется на странице); страница 228 строк, 18 строк с
блоками кода (чётно).
2026-10-02 08:08:35 +03:00
Repinoid 7b63f12347 docs(crud): раздел «Что пользователь задаёт сам» + правила уникальности имён
Замечание владельца: в README не было видно, какие параметры юзер задаёт СВОИМИ
значениями, и не сказано про уникальность домена и имени инстанса.
Добавлен раздел (сразу после «Как это устроено»):
- обязательные значения: api_token (pg+apps), realm (pg+apps, одно и то же),
  s3_name (pg) + команды создания terraform.tfvars в обеих папках;
- имена, которые нужно придумать: pg_resource_name и *_resource_name приложений —
  уникальны в пределах стенда; pg_username/pg_db_name — в пределах кластера
  (служебные admin/postgres/standby платформа не примет); *_domain — уникальны
  в облаке;
- почему: adopt_existing_on_create ищет инстанс по имени внутри сервиса
  (provider/internal/resources_core/crud.go:171, provider/internal/core/refsvc_find.go:47),
  поэтому при занятом имени провайдер не создаёт новый ресурс, а усыновляет
  существующий; без adopt — падает с «уже существует». Пример: tflucee/tfflask/
  tfnodejs заняты старыми инстансами (apps/locals.tf:45,57,68);
- что можно не задавать: перечислены дефолты pg/main.tf и размеры в apps/locals.tf.
Из шагов 1 и 3 убраны дублирующие таблицы — теперь ссылка на раздел, комментарии
в командах поправлены («см. таблицу ниже» больше не существует).
Проверено: 190 строк, 14 строк с блоками кода (чётно), заголовки на месте.
2026-10-02 08:07:58 +03:00
Repinoid b8f5238f05 docs(crud): справка по выходам pg перенесена в конец файла
Из шага 2 убран развёрнутый блок (он мешал последовательности трёх шагов),
вместо него одна ссылка. Сам блок стал последним разделом файла
«## Справка: выходные параметры pg/» (уровень заголовка 4 -> 2, т.к. теперь
это самостоятельный раздел, а не подпункт шага 2). Содержимое не менялось.
Проверено: grep заголовков (112: ## Справка), состав файла — 151 строка.
2026-10-02 07:59:06 +03:00
Repinoid 5674b86d58 docs(crud): справка по выходным параметрам pg — состав, вид JSON и как их читают приложения
Шаг 2 теперь поясняет не только команду выгрузки, но и что именно выгружается:
- таблица шести выходов pg/outputs.tf (pg_host/pg_port/pg_username/pg_db_name/
  pg_password/pg_ssl_mode) с указанием источника каждого;
- что terraform output -json кладёт объекты {sensitive, type, value}, а не голые
  значения, поэтому в apps/locals.tf обращение идёт через .value;
- таблица соответствия: выход pg/ -> переменная окружения в Flask/Node.js/Lucee
  (PGHOST/PGPORT/PGUSER/PGPASSWORD/PGDATABASE/PGSSLMODE, у Lucee ещё testds_* и DATABASE_URL).
Все факты сверены чтением файлов: pg/outputs.tf, apps/locals.tf, apps/flask.tf,
apps/nodejs.tf, apps/lucee.tf.
2026-10-02 07:56:47 +03:00
Repinoid 6ef003bc58 docs(crud): покрыты и apply, и destroy — про удаление было сказано однобоко
В разделе «Как это устроено» первая строка говорила только про destroy,
про изменения (apply) не было ни слова. Теперь явно: apply и destroy
в apps/ меняют только приложения, apply и destroy в pg/ — только базу.
Проверено: чтением файла после правки.
2026-10-02 07:54:04 +03:00
Repinoid 5fdbc316c2 docs(crud): раздел «Как это устроено» — без натянутых терминов
Убрано «(разделение ответственности, decoupling)» — это про модули кода, не про
состояния Terraform. Написано прямо: два отдельных файла состояния.
Добавлен факт, который был скрыт: связь pg -> apps идёт через apps/creds.json,
после смены хоста или пароля файл нужно обновить и повторить apply в apps/.
Проверено: чтением файла после правки.
2026-10-02 07:52:55 +03:00
Repinoid d0cbd050fe test_stand/crud(apps): новые домены flask-crud / lucee-crud / nodejs-crud
Прежние домены (tfflask / tflucee / tfnodejs) заняты старыми инстансами:
crud-flask suspended (с зависшей операцией), crud-lucee suspended, crud-nodejs running.
Создание новых сервисов с теми же доменами платформа отвергла бы как
'domain уже используется другим инстансом'.

Домен указан без точек, поэтому A-запись создаётся автоматически в служебной
DNS-зоне ресурсной платформы.

terraform validate — Success.
2026-10-01 18:39:29 +03:00
Repinoid 03b368a55a test_stand/crud(apps): новые имена ресурсов + SERVICE_NAME для колонки created_by
- locals.tf: crud-flask → flask-crud, crud-lucee → lucee-crud, crud-nodejs → nodejs-crud;
- json_env: SERVICE_NAME = flask/lucee/nodejs (без -crud) — это значение пишется
  приложением в колонку created_by таблицы crud_items;
- terraform validate — Success.

Код приложений (DDL created_at/created_by + INSERT + UI) — в репозиториях
tfflaskcrud/tfnodejscrud/tfluceecrud (origin переключён на terraform/*):
e5fce97, 23338cb, ffcd0c0.
2026-10-01 18:37:44 +03:00
Repinoid 066d6b472b test_stand/crud(pg): пароль берётся из выхода подресурса, а не из vault_secrets кластера
output pg_password = nubes_postgres_user.crud_user_0.password — значение известно в том
же apply, где создан пользователь, поэтому ни try(), ни двух apply в pg/ больше не
требуется. Обновлён комментарий про порядок вычисления.
2026-10-01 17:15:20 +03:00
Repinoid ed92de1544 test_stand/crud: из README и комментариев убрана вся история (try, «раньше»)
README читает человек впервые — ему нужны структура, шаги запуска и операции,
а не разбор прошлых костылей. Удалено:
- раздел «Почему нельзя создать всё одним apply» с историей про try() и PGPASSWORD;
- упоминания try() в apps/lucee.tf, apps/flask.tf, apps/nodejs.tf;
- «data-source/backend» из apps/locals.tf и путь к удалённому разделу из pg/outputs.tf.

Заодно удалён старый TEST_STAND/CRUD/terraform.tfvars (не читается, значения
перенесены в pg/terraform.tfvars и apps/terraform.tfvars).

Проверено: terraform validate — Success в pg/ и apps/ (apps — с временным creds.json).
2026-10-01 16:42:46 +03:00
Repinoid 4834e992f3 test_stand/crud: разделение на pg/ (общая БД) и apps/ (потребители)
Было: одна папка, один state — destroy убивал и БД, и приложения; пароль БД
приходилось вытаскивать костылём try() в одном apply, приложения поднимались
с пустым PGPASSWORD.

Стало:
- pg/  — кластер PostgreSQL + пользователь + база + outputs (хост/порт/юзер/база/пароль);
  destroy здесь переводит кластер в Suspend, а пользователь и база не удаляются
  (keep_on_destroy = true + adopt_existing_on_create = true);
- apps/ — три приложения-потребителя; креды БД читаются из creds.json (выгрузка
  outputs папки pg/, т.к. state раздельные, а data-source у провайдера нет);
  try() убран полностью — пароль к моменту этого apply уже существует;
- apps/.gitignore — creds.json, terraform.tfvars, state/lock;
- README.md переписан: структура, «зачем разделено», пошаговые 3 шага запуска,
  повседневные операции (destroy приложений не трогает БД), про destroy базы.

Проверено: terraform init+validate в обеих папках — Success;
plan в pg/ — 3 to add (кластер, пользователь, база) + 6 outputs.
2026-10-01 16:35:14 +03:00
Repinoid e8c03d8ded test_stand/crud: keep_on_destroy=true для пользователя и базы PostgreSQL
Инстанс PG при destroy уходит в Suspend (suspend_on_destroy_default: true в
90_postgres.yaml), а не удаляется. Без keep_on_destroy подресурсы (create_user/
create_database) удалялись бы из живого кластера — после resume приложения
работали бы с пустой БД, данные базы были бы потеряны.

keep_on_destroy=true → режим state_only: при destroy подресурс остаётся в облаке
и только убирается из state. В паре с adopt_existing_on_create=true следующий
apply усыновляет существующий объект, а не падает на 'уже существует'.

Проверено: terraform validate — Success (провайдером 3.0.0, где атрибут есть).
2026-10-01 16:08:30 +03:00
Repinoid c2c870bc34 stand(TEST/CRUD): terraform fmt — выравнивание access_configuration в postgres.tf 2026-10-01 14:24:19 +03:00
Repinoid 0353ff79e5 stand(TEST/CRUD): пароль БД через try() — первый apply больше не падает
Раньше locals читали пароль напрямую: jsondecode(vault_secrets["users"]).user4crudpg.password.
При первом apply пароля ещё нет (create_user выполняется после создания кластера), поэтому
Terraform падал с «Invalid index ... does not identify an element in this collection value».

Теперь через try(... = ""): на первом apply в env идёт пустая строка и прогон не роняет;
на втором apply пароль уже в Vault, try возвращает настоящее значение, приложения получают верный env.

Комментарии в lucee.tf/flask.tf/nodejs.tf объясняют зачем try и почему два apply.
Проверено: terraform validate — Success; plan — No changes; Exit 0.
2026-10-01 14:23:11 +03:00
Repinoid e3182c3f98 stand(TEST/CRUD): postgres_conf — ключи camelCase и значение ''
Провайдер отправляет postgres_conf на платформу как есть (resources_core.FormatString
возвращает строку без перевода имён), поэтому ключи обязаны совпадать со спекой:
postgresConf.paramName / postgresConf.paramValue. С snake_case (param_name/param_value)
платформа падала с "Invalid JSON String" (операция 5AAF1E39-8812-4994-AD14-78D51ED2077D).

Значение paramValue взято '' — как в HAR/pgmodify.har и в TEST_STAND/PG/resources.tf.
План проходит: 6 to add, exit 0.
2026-10-01 12:28:52 +03:00
Repinoid 4b31eca807 stand(TEST/CRUD): var.realm больше не sensitive
realm — не секрет, но из-за sensitive = true в plan вместо имени печаталось
"(sensitive value)". Теперь видно resource_realm = "k8s-3-sandbox-nubes-ru".
Плана это не меняло: plan по-прежнему 6 to add, exit 0.

Прочие sensitive оставлены как есть: api_token (секрет), vault_secrets (платформа).
2026-10-01 12:20:23 +03:00
Repinoid 4197a76aba 1 2026-09-30 21:01:05 +03:00
Repinoid 106ddbe092 stand: switch every stand to actual provider versions (prod=1.0.0, dev=2.0.0, test=3.0.0)
Легаси-версии (5.0.x/5.1.x/3.1.x/2.1.x) в реестре отсутствуют (404), стенды не могли
пройти terraform init. Приведены к новой схеме нумерации от 2026-09-03.

- DEV  (nubes-dev):  CRUD, POSTGRES, SHTURVAL_MGMT -> 2.0.0
- TEST (nubes-test): CRUD, PG, POSTGRES, MARIA_DB, buck0, kuber, IOT_RMQ_DEMO -> 3.0.0
                     (DEV_STAND/IOT_KAFKA_DEMO тоже nubes-test -> 3.0.0)
- PROD (nubes):      PG1, POSTGRES, RABBIT -> 1.0.0
- README стендов TEST_STAND/buck0, TEST_STAND/PG: версии приведены к 3.0.0
- getting-started: убрана versioned-ссылка на доки (2.1.7) -> актуальный домен без версии
- .gitignore: откатано правило TMP/ (на remote TMP/init-test-*/main.tf трекаются)
2026-09-16 16:34:40 +03:00
“Naeel” 05694a3446 stand(CRUD): refactor resource names, drop git_revision, add adopt_existing, provider 5.0.5 2026-08-13 12:49:46 +04:00
“Naeel” 2af2d2af16 chore: registry.kube5s.ru → tf-registry.containerk8s.services.ngcloud.ru
- All code/script/.tf defaults replaced
- Docs annotated with ⛔ LEGACY
2026-08-10 11:17:57 +04:00
“Naeel” 55d4109eee 11 2026-07-21 18:17:03 +04:00
“Naeel” f0e01dad6e docs: point to tf_examples repo, add tf_examples to .gitignore 2026-07-21 09:06:13 +04:00
“Naeel” 5d338bbd02 fix: remove non-existent Download button mention 2026-07-21 09:03:28 +04:00
“Naeel” b093bff148 fix: download whole repo archive, no folder-level Download in Gitea 2026-07-21 09:03:02 +04:00
“Naeel” 3d831b16a0 docs: how to download just the CRUD folder (sparse checkout) 2026-07-21 08:59:50 +04:00
“Naeel” 1d1258a83b docs: fill + rename terraform.tfvars.example, not copy 2026-07-21 08:57:08 +04:00
“Naeel” 9ee16ce371 fix: s3_name — S3 instance name, not user 2026-07-21 08:54:54 +04:00
“Naeel” 5ec3c8aceb fix: add PGSSLMODE to nodejs.tf (TEST + DEV), bump flask_git_revision 2026-07-21 08:41:59 +04:00
“Naeel” 89163e9609 bump nodejs_git_revision to 809d30b (fix startup + SSL) 2026-07-21 08:31:44 +04:00
“Naeel” eb36731d3e docs: explain why two applies — PG user not ready for apps 2026-07-21 08:23:39 +04:00
“Naeel” ecace0311b docs: TEST_STAND README + clean terraform.tfvars.example 2026-07-21 08:18:48 +04:00
“Naeel” a4a3f8e63c fix: domain comments — correct .dev.nubes.ru suffix, add uniqueness note 2026-07-21 08:06:45 +04:00
“Naeel” 4ea4cc82b0 docs: TEST_STAND locals.tf — comments on every line 2026-07-21 08:03:29 +04:00
“Naeel” 664ab51b0d fix: update lucee_git_revision (8268568) + flask_git_revision (54746e9) — no DROP, init_db at module level 2026-07-21 07:32:42 +04:00
“Naeel” f56c0c0cf4 add Node.js CRUD (tfnodejscrud) + nodejs.tf in TEST_STAND 2026-07-20 13:50:13 +04:00
“Naeel” 3a24690c3f docs: add comments to terraform.tfvars.example (s3_name/S3 UUID interchangeability) 2026-07-20 12:17:24 +04:00
“Naeel” b05969aad0 bump flask_git_revision to 34c030c (site/ structure) 2026-07-20 12:12:44 +04:00
“Naeel” 4c5a61cbbf refactor: LUCEE/ → CRUD/, npg_lucee → main_pg, add flask.tf 2026-07-20 11:05:39 +04:00