IoT MVP: архитектура, план реализации, лог рассуждений

- Определена архитектура 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 ресурс)
This commit is contained in:
Repinoid
2026-04-04 08:34:14 +03:00
parent ebbba66146
commit 6dc2dc69ba
24 changed files with 2958 additions and 51 deletions
+107
View File
@@ -248,6 +248,113 @@ Error: Ошибка клиента
---
## 2026-04-03 — Коррекции и новые находки (PostgreSQL续)
### ERR-PG-02: id=(known after apply) при Update — ИСПРАВЛЕНО ✅
**Статус обновления**: Проблема уже решена в текущей версии провайдера.
**Где было**: `internal/provider/postgres_resource.go` Update() метод устанавливал `id = (known after apply)`
**Как исправлено**: Строка ~845 добавлена явная сохранение ID:
```go
// fix: plan.ID is Computed (empty in plan), must preserve existing ID from state
plan.ID = state.ID
```
**Проверка**: `terraform plan` больше НЕ показывает destroy+recreate зависимых ресурсов.
**Результат плана (ответно)**: `Plan: 0 to add, 1 to change, 0 to destroy` (только update, без replace)
**Вывод**: ERR-PG-02 не актуален для текущей версии провайдера.
---
### ERR-PG-06: Второй пользователь — ПЕРЕКВАЛИФИЦИРОВАНО 🔄
**Изменение статуса**: ERR-PG-06 была НЕВЕРНО диагностирована.
**Что было думано**: "Vault backend ограничен одним пользователем на инстанс"
**Что обнаружено**: `pg_test_user3` (u3) успешно создан в terraform state! Это второй пользователь на инстансе `pg-test-02`.
**Проверки**:
```bash
terraform state list
# Output:
# nubes_postgres.pg_test_instance
# nubes_postgres_user.pg_test_user ← user0
# nubes_postgres_user.pg_test_user3 ← u3 (УСПЕШНО)
```
**Статус**: Многопользовательское создание **РАБОТАЕТ** при правильной последовательности `depends_on`.
**Реальная проблема**: Не в создании пользователей, а в том что файл `postgres_extra.tf` с третьим пользователем был переименован в `postgres_extra.tf11` (бэкап), и текущий конфиг не имел этого файла.
**Вывод**: ERR-PG-06 была следствием неполного тестирования, а не действительным ограничением API.
---
### ERR-PG-08: Concurrent Operations Are Not Supported ❌ НОВАЯ ПРОБЛЕМА
**Симптом**
После успешного завершения Update операции на `nubes_postgres`, попытка создать
зависимый ресурс (например БД) немедленно падает с ошибкой 422:
```
Error: Ошибка клиента
with nubes_postgres_database.pg_test_db
ошибка API 422: {
"DETAIL": "There is a started operation on this instance",
"TYPE": "about:blank",
"TITLE": "Concurrent operations are not supported (job status: SUCCESS)"
}
```
**Когда воспроизводится**
1. `terraform plan` обнаруживает изменения (например, `vault_secrets` drift)
2. Apply запускает Update инстанса: `nubes_postgres.pg_test_instance: Modifying...`
3. Update успешно завершается: `Modifications complete after 0s`
4. Terraform пытается создать DB: `nubes_postgres_database.pg_test_db: Creating...`
5. **FAIL**: 422 Concurrent operations
**Попытки обхода (неуспешные)**
- Добавлен `depends_on = [pg_test_user3]` — не помогло ✗
- Ожидание 60 секунд между apply'ами — не помогло ✗
- Ожидание 120 секунд — не помогло ✗
**Причина**
Nubes API имеет встроенный serial-lock на операции per-instance. Даже хотя
`WaitForOperation()` возвращает `IsSuccessful = true`, сервер всё ещё обрабатывает
асинхронные побочные эффекты (Vault sync, state reconciliation и тд). Новые запросы
на операции отклоняются с 422 до полного завершения.
**Текущий workaround**
Разбить apply на несколько фаз вручную:
```bash
# Фаза 1: создание инстанса + пользователей (без БД)
cp postgres.tf postgres.tf.bak
sed -i '/resource.*nubes_postgres_database/,/^}/d' postgres.tf
terraform apply -auto-approve
# Фаза 2: добавить БД обратно и применить
cp postgres.tf.bak postgres.tf
terraform apply -auto-approve
```
**Статус**: Открытая проблема в провайдере. Требует fix на уровне `WaitForOperation()`.
**Рекомендуемое решение**: Добавить post-completion delay (30–60 сек) или retry mechanism
в `internal/provider/client_impl.go` метод `WaitForOperation`.
**Файл для анализа**: [`internal/provider/client_impl.go` line 240+](../../terra/terraform/internal/provider/client_impl.go#L240)
**Документация**: [ERR-PG-08-concurrent-operations.md](ERR-PG-08-concurrent-operations.md)
---
## 2026-03-29 — SSH timeout после destroy VM example
### Симптом