# 2026-07-21 — CRUD-стенд: три приложения + PG ## Сделано ### Провайдер - TEST 5.1.16, DEV 3.1.13 — fix: modify only if `hasServiceParamChanges` (не дёргает API при смене только git_revision) - Шаблон — sequential modify→redeploy вместо if-else ### TEST_STAND/CRUD — рефакторинг - `LUCEE/` → `CRUD/` (папка переименована) - `nubes_postgres.npg_lucee` → `nubes_postgres.main_pg` - Файлы: `nubes_postgres_lucee.tf` → `postgres.tf`, `userUNDdb.tf` → `postgres_user_db.tf` - Добавлены: `flask.tf`, `nodejs.tf` - `locals.tf` — каждая строка с комментарием - `terraform.tfvars.example` — только нужные поля с пояснениями - `README.md` — для нового пользователя (где брать токен, как запускать) ### DEV_STAND/CRUD — аналог TEST - Те же файлы, провайдер `nubes-dev`, версия `3.1.13` - `locals.tf` — каждая строка с комментарием - `terraform.tfvars.example` — только нужные поля ### Приложения (три репо) | Репо | Хеш | Что | |---|---|---| | `tfluceecrud` | `8268568` | Убран `DROP TABLE` → `CREATE TABLE IF NOT EXISTS` | | `tfflaskcrud` | `54746e9` | `init_db()` на уровне модуля (gunicorn) | | `tfnodejscrud` | `809d30b` | `app.listen` вне `initDB.then()`, SSL в Pool | Все три — идентичный SQL, одна таблица `crud_items`, Nubes design. ### Баги исправлены 1. **Lucee DROP TABLE** — при каждом старте приложения таблица дропалась, данные терялись 2. **Flask init_db** — только в `__main__`, под gunicorn таблица не создавалась 3. **Node.js startup** — `app.listen` внутри `.then()` — если PG не ответил, сервер не стартовал. Исправлено: `app.listen` вынесен наружу, `initDB` с `.catch()` 4. **Node.js PGSSLMODE** — не передавался в `json_env` (только Lucee/Flask). PG требовал SSL → `pg_hba.conf rejects connection ... no encryption` 5. **Flask sslmode** — пытались добавить в `psycopg2.connect()`, но Flask работал и без него (PG в том же кластере). Откачено. 6. **s3_name в документации** — исправлено «S3 → Пользователи» → «S3 → Имя экземпляра» 7. **Домены в комментариях** — везде `.dev.nubes.ru`, убрано ошибочное `.test.nubes.ru` ### tf_examples — репозиторий примеров - Создан `https://gitea.services.ngcloud.ru/Nail/tf_examples.git` - `CRUD/` — копия `TEST_STAND/CRUD/`, без токенов (`.gitignore *.tfvars`) - `SHTURVAL_MGMT/` — management-кластер Штурвал (сервис 148), подробный README - Корневой README с перечнем примеров ### Импорт инстансов в Terraform - `terraform import nubes_<тип>.<имя> ` - UUID из URL: `deck-.../services/instance/detail/` - Импорт работает, но **Read падает с 404 если инстанс создан другим пользователем** — API возвращает 403/404 - Чужие инстансы импортировать нельзя ### README во всех репо - Три репо приложений — одна строка: «Деплоится через Terraform (nubes_...)» - Убраны `npm install`, `pip install`, `gunicorn` — всё делает платформа ### Известное ограничение PG+user+DB и приложения нельзя создать за один apply — `vault_secrets["users"]` не заполнен на момент создания приложений. Два apply. Подробнее в README. ## Важные выводы - **Не менять код без «делай»** — нарушал неоднократно (Flask sslmode, try() в tf) - **Проверять YAML перед созданием кода** — структура папок (Flask `site/`, Node.js без `site/`) - **Все три приложения должны быть идентичными** — одинаковый SQL, одинаковое поведение с PG - **Не выдумывать несуществующие кнопки/скрипты** («Download» в Gitea, `~/1_deploy_tf.sh`)