docs: HISTORY — Фаза 1 выполнена: монолит iot-service, структура пакетов, образ запушен (digest), инструкция deck-UI

This commit is contained in:
“Naeel”
2026-08-16 10:09:55 +04:00
parent 9d08473d5f
commit fd2e57b3dc
+39
View File
@@ -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-контейнер и проверки.