From fd2e57b3dccfacc8a2f19867e132fcd9d1186735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 16 Aug 2026 10:09:55 +0400 Subject: [PATCH] =?UTF-8?q?docs:=20HISTORY=20=E2=80=94=20=D0=A4=D0=B0?= =?UTF-8?q?=D0=B7=D0=B0=201=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0:=20=D0=BC=D0=BE=D0=BD=D0=BE=D0=BB=D0=B8=D1=82=20io?= =?UTF-8?q?t-service,=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BE=D0=B2,=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B7=20=D0=B7=D0=B0=D0=BF=D1=83=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=20(digest),=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20deck-UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-08-16-session-log.md | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/HISTORY/2026-08-16-session-log.md b/HISTORY/2026-08-16-session-log.md index d2890db..a184069 100644 --- a/HISTORY/2026-08-16-session-log.md +++ b/HISTORY/2026-08-16-session-log.md @@ -502,3 +502,42 @@ IoT вмешивались в проект. ПРОВЕРЬ.» `LEGACY.md`. Проверка: `go build ./...` — OK (компиляция не сломана, Go-код не переносился). + +--- + +## 15. Фаза 1: монолит iot-service (16.08, команда «делай») + +**Структура кода (много мелких файлов, без god-файлов):** +- `cmd/iot-service/main.go` — точка входа: config → PG → SQS-клиент → API + горутины bridge/consumer; graceful shutdown. +- `internal/service/config/` — env-конфигурация: config.go (Load + проверка секретов), defaults.go (все дефолты). +- `internal/service/store/` — устройства в PG (таблица iot_devices): open.go (схема), device.go (модель+ошибки), devices.go (CRUD + auth-lookup). +- `internal/service/sqsclient/` — общий SQS-клиент (endpoint override, внутренний адрес shared-sqs). +- `internal/service/api/` — router.go (маршруты + CORS + /health), middleware/ (auth.go — authTestMode из env, logging.go), handler/ (devices, mqtt_auth, telemetry, admin, sqsstats), admin_embed/console_embed + ui/ (HTML скопирован). +- `internal/service/bridge/` — bridge.go (подключение к EMQX, подписка +/telemetry/+), handler.go (envelope → SQS). +- `internal/service/consumer/` — consumer.go (long-poll, VisibilityTimeout), processor.go (envelope → iotpg). + +**Ключевые решения:** +1. Устройства — таблица iot_devices в PG (PRIMARY KEY namespace+name, UNIQUE + namespace+device_id); пароль генерится crypto/rand 32B hex при создании; + MQTT-auth — SQL + constant-time compare; last_connected обновляется. +2. k8s-зависимостей в новом коде НЕТ: старые хендлеры не тронуты, старый + оператор компилируется. k8s-депы в go.mod остаются до удаления легаси. +3. Admin-stats: PG (iotpg.GetAdminStats) + SQS (атрибуты очереди) + runtime + (version/uptime) — вместо статусов k8s-подов. +4. Env: дефолты вшиты в Dockerfile (порт 9090, внутренний SQS endpoint + f1ffb134...:4100, очередь iot-telemetry, регион us-east-1, long-poll 20с, + visibility 30с, clientID iot-bridge, MQTT 8083//mqtt, AUTH_TEST_MODE=false). + Секреты обязательны: IOT_PG_DSN, SQS_ACCESS_KEY, SQS_SECRET_KEY, + MQTT_USERNAME, MQTT_PASSWORD (+ ADMIN_STATS_TOKEN для статистики). +5. CORS "*" (консоль на домене платформы), /health и /healthz отдают + {"status":"ok","version":...}. + +**Проверки:** go build ./... OK; go vet OK; gofmt чистый; go test ./... OK; +smoke: без env бинарник падает с перечнем недостающих переменных. + +**Образ:** `naeel/iot-service:v0.1.0` (+latest), digest +`sha256:808b537fcbd1ca23e2c389a735162370645ed8188fec7ef0d6e09327b78cb568`, 15.2MB, +запушен на Docker Hub. Коммит `9d08473`. + +**Следующий шаг:** пользователь создаёт контейнер в deck-UI (образ +`naeel/iot-service:latest`, секреты в env). Затем — EMQX-контейнер и проверки.