docs: HISTORY — Фаза 1 выполнена: монолит iot-service, структура пакетов, образ запушен (digest), инструкция deck-UI
This commit is contained in:
@@ -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-контейнер и проверки.
|
||||
|
||||
Reference in New Issue
Block a user