- Определена архитектура managed IoT service - Согласовано решение: RabbitMQ (MVP), потом Kafka; EMQX + CRD контроллер - Создан подробный план для Sonnet (doc/iot-mvp-plan.md) - Добавлено правило в copilot-instructions: лог мышления в doc/thinking/ по датам - Полный ход рассуждений в doc/thinking/2026-04-04.md Ключевые решения: - IoT код в iot/ (легко вынести потом) - CRD IoTDevice + контроллер (как все остальное в sless) - EMQX HTTP Auth Backend для динамической аутентификации устройств - Архитектура broker-agnostic (легко переключить на Kafka) - Terraform: расширяем текущий provider (sless_iot_device ресурс)
57 lines
3.1 KiB
Plaintext
57 lines
3.1 KiB
Plaintext
// 2026-04-01 — postgres_extra.tf: дополнительные пользователи и базы данных для lifecycle-тестов.
|
|
//
|
|
// ВАЖНО: ресурсы создаются строго последовательно через depends_on.
|
|
// Параллельное создание нескольких пользователей в одном инстансе вызывает
|
|
// ошибки API ("Секрет не был создан", "key doesn't exist") — race condition на стороне Nubes.
|
|
//
|
|
// ИЗВЕСТНОЕ ОГРАНИЧЕНИЕ: если apply упал в середине создания пользователя —
|
|
// этот пользователь может "зависнуть" в промежуточном состоянии в Nubes API.
|
|
// adopt_existing_on_create не спасает. Решение: использовать имена без истории,
|
|
// либо ждать очистки на стороне Nubes.
|
|
|
|
// ── Пользователь 1 ───────────────────────────────────────────────────────────
|
|
// Первый в extra-цепочке. Ждёт pg_test_db (postgres.tf).
|
|
|
|
resource "nubes_postgres_user" "test_extra_user1" {
|
|
postgres_id = nubes_postgres.pg_test_instance.id
|
|
username = "test_eu1"
|
|
role = "ddl_user"
|
|
adopt_existing_on_create = true
|
|
|
|
# Ждём pg_test_db — иначе параллельный старт с созданием БД ломает API.
|
|
depends_on = [nubes_postgres_database.pg_test_db]
|
|
}
|
|
|
|
// ── Пользователь 2 ───────────────────────────────────────────────────────────
|
|
|
|
resource "nubes_postgres_user" "test_extra_user2" {
|
|
postgres_id = nubes_postgres.pg_test_instance.id
|
|
username = "test_eu2"
|
|
role = "ddl_user"
|
|
adopt_existing_on_create = true
|
|
|
|
depends_on = [nubes_postgres_user.test_extra_user1]
|
|
}
|
|
|
|
// ── База данных 1 (owner = test_eu1) ─────────────────────────────────────────
|
|
|
|
resource "nubes_postgres_database" "test_extra_db1" {
|
|
postgres_id = nubes_postgres.pg_test_instance.id
|
|
db_name = "test_edb1"
|
|
db_owner = nubes_postgres_user.test_extra_user1.username
|
|
adopt_existing_on_create = true
|
|
|
|
depends_on = [nubes_postgres_user.test_extra_user2]
|
|
}
|
|
|
|
// ── База данных 2 (owner = test_eu2) ─────────────────────────────────────────
|
|
|
|
resource "nubes_postgres_database" "test_extra_db2" {
|
|
postgres_id = nubes_postgres.pg_test_instance.id
|
|
db_name = "test_edb2"
|
|
db_owner = nubes_postgres_user.test_extra_user2.username
|
|
adopt_existing_on_create = true
|
|
|
|
depends_on = [nubes_postgres_database.test_extra_db1]
|
|
}
|