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
+5 -1
View File
@@ -1,5 +1,9 @@
# Пример: Виртуальная машина (vApp + VM) в Nubes vDC
> ⚠️ **Тестовое окружение.** Пример работает с тестовым API Nubes и тестовым кластером sless. Не использовать в продакшне без предварительного согласования.
> В этом примере используются только **разовые джобы** (`sless_job`) — для установки ПО на ВМ. Примеры с HTTP-сервисами (`sless_service`) появятся позднее.
Создаёт:
- **vApp** — виртуальный каталог (контейнер для ВМ в VMware vDC)
- **ВМ** — Ubuntu 22.04, 2 CPU / 2 GB RAM / 20 GB disk
@@ -200,5 +204,5 @@ terraform destroy
| `vm.tf` | Ресурс ВМ (Ubuntu 22.04) |
| `sless.tf` | Serverless-джобы для установки ПО |
| `outputs.tf` | Вывод IP-адреса и ID ресурсов |
| `vm_key` / `vm_key.pub` | SSH-ключ для доступа к ВМ |
| `vm_key` / `vm_key.pub` | SSH-ключ **создаётся вами на Шаге 2**, в git не хранится |
| `functions/` | Код Python-функций для install-джобов |
+1
View File
@@ -39,4 +39,5 @@ variable "api_token" {
provider "nubes" {
api_token = var.api_token
api_endpoint = "https://deck-api-test.ngcloud.ru/api/v1/index.cfm"
log_level = "debug" # none | info | debug, default = "none"
}
+1 -4
View File
@@ -24,15 +24,12 @@ provider "sless" {
# ---------------------------------------------------------------------------
locals {
# TODO: заменить externalConnect → internalConnect когда DevOps настроят
# сеть между k8s кластером и Nubes vDC (сейчас только внешний IP доступен).
vm_ip = nubes_vc_vm_v3.vm.state_out_flat["externalConnect"]
ssh_env = {
VM_IP = local.vm_ip
SSH_USER = "ubuntu"
# TODO(vault): заменить на чтение из Vault когда сервис заработает; пока тестовый стенд — прямой файл.
SSH_KEY = file("${path.module}/vm_key")
SSH_KEY = file("${path.module}/vm_key") # приватный ключ, созданный на шаге 2 (не хранится в git)
}
}