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-контейнер и проверки.