- Определена архитектура 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 ресурс)
106 lines
3.5 KiB
Terraform
106 lines
3.5 KiB
Terraform
# 2026-03-29 — sless.tf: провайдер sless и sless_job ресурсы для установки ПО на ВМ.
|
|
#
|
|
# Схема работы:
|
|
# 1. terraform apply создаёт FunctionJob CR в k8s
|
|
# 2. Провайдер загружает код из source_dir в S3
|
|
# 3. Оператор собирает Docker-образ (kaniko) и запускает Job
|
|
# 4. Job подключается к ВМ по SSH и устанавливает ПО
|
|
# 5. terraform apply завершается: outputs содержат статус каждого шага
|
|
#
|
|
# Для повторного запуска: увеличь install_run_id в terraform.tfvars → terraform apply
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Провайдер
|
|
# ---------------------------------------------------------------------------
|
|
|
|
provider "sless" {
|
|
endpoint = "https://sless.kube5s.ru"
|
|
token = var.api_token # тот же JWT что и в provider "nubes"
|
|
nubes_endpoint = "https://deck-api-test.ngcloud.ru/api/v1/index.cfm"
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Общие locals: SSH-параметры для подключения к ВМ
|
|
# ---------------------------------------------------------------------------
|
|
|
|
locals {
|
|
vm_ip = nubes_vc_vm_v3.vm.state_out_flat["externalConnect"]
|
|
|
|
ssh_env = {
|
|
VM_IP = local.vm_ip
|
|
SSH_USER = "ubuntu"
|
|
SSH_KEY = file("${path.module}/vm_key") # приватный ключ, созданный на шаге 2 (не хранится в git)
|
|
}
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Job 1: базовые пакеты (jq, pip3 и др.)
|
|
# ---------------------------------------------------------------------------
|
|
|
|
resource "sless_job" "install_packages" {
|
|
count = var.install_packages ? 1 : 0
|
|
|
|
name = "vm-install-packages"
|
|
runtime = "python3.11"
|
|
entrypoint = "handler.install"
|
|
source_dir = "${path.module}/functions/install-packages"
|
|
memory_mb = 128
|
|
|
|
env_vars = local.ssh_env
|
|
event_json = jsonencode({
|
|
packages = var.base_packages
|
|
update = true
|
|
})
|
|
|
|
run_id = var.install_run_id
|
|
wait_timeout_sec = 600
|
|
|
|
depends_on = [nubes_vc_vm_v3.vm]
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Job 2: nginx
|
|
# ---------------------------------------------------------------------------
|
|
|
|
resource "sless_job" "install_nginx" {
|
|
count = var.install_nginx ? 1 : 0
|
|
|
|
name = "vm-install-nginx"
|
|
runtime = "python3.11"
|
|
entrypoint = "handler.install"
|
|
source_dir = "${path.module}/functions/install-nginx"
|
|
memory_mb = 128
|
|
|
|
env_vars = local.ssh_env
|
|
event_json = jsonencode({})
|
|
|
|
run_id = var.install_run_id
|
|
wait_timeout_sec = 600
|
|
|
|
depends_on = [nubes_vc_vm_v3.vm, sless_job.install_packages]
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Job 3: Docker CE
|
|
# ---------------------------------------------------------------------------
|
|
|
|
resource "sless_job" "install_docker" {
|
|
count = var.install_docker ? 1 : 0
|
|
|
|
name = "vm-install-docker"
|
|
runtime = "python3.11"
|
|
entrypoint = "handler.install"
|
|
source_dir = "${path.module}/functions/install-docker"
|
|
memory_mb = 128
|
|
|
|
env_vars = local.ssh_env
|
|
event_json = jsonencode({
|
|
compose = true
|
|
})
|
|
|
|
run_id = var.install_run_id
|
|
wait_timeout_sec = 900
|
|
|
|
depends_on = [nubes_vc_vm_v3.vm, sless_job.install_packages, sless_job.install_nginx]
|
|
}
|