4.3 KiB
IoT на Nubes — чек-лист деплоя (актуально на 2026-10-11)
Детальная процедура —
deployment-nubes-production.md. Здесь — конкретные шаги текущего стенда. Секреты НЕ хранятся в репо (*.keyв.gitignore); значения<>берутся изpg.key/deck/генератора.
0. Готово
- Образы в Gitea (
gitea.services.ngcloud.ru/nail):iot-service:v0.1.13(+ latest)iot-emqx:v0.2.4(+ latest)
- shared-SQS тенант
demo-service(SSAK-b8fb2b3000c178b865091686, регионus-east-1):- очередь
iot-telemetry— создана; - DLQ
iot-telemetry-dlq— создана. - публичный endpoint:
https://sqs.sinefo.ru.
- очередь
- PostgreSQL managed: хост
postgresqlk8s-master.509145c3-ba71-4687-a084-d9dcbc88d3d2.svc.cluster.local:5432(изpg.key).
1. PostgreSQL (разово, SQL на master-инстансе)
Подключиться из консоли/порт-форварда (роль из pg.key — ddl_user):
CREATE ROLE iot_service LOGIN PASSWORD '<PG_PASS>'; -- <PG_PASS> сгенерировать
ALTER ROLE iot_service CREATEROLE CREATEDB; -- нужно iotpg (per-tenant БД)
GRANT iot_service TO <текущая роль>; -- роль из pg.key
CREATE DATABASE iotdb OWNER iot_service;
REVOKE iot_service FROM <текущая роль>;
Таблицы (iot_devices, per-tenant БД телеметрии) создаются кодом при старте.
2. EMQX-контейнер (создаётся ПЕРВЫМ в deck, CPU ≥ 1000m)
Образ: gitea.services.ngcloud.ru/nail/iot-emqx:v0.2.4, порт из EXPOSE = 8083.
Env (все — при создании, потом не меняются):
| Переменная | Значение |
|---|---|
EMQX_AUTHENTICATION__1__SERVER |
postgresqlk8s-master.509145c3-ba71-4687-a084-d9dcbc88d3d2.svc.cluster.local:5432 |
EMQX_AUTHENTICATION__1__DATABASE |
iotdb |
EMQX_AUTHENTICATION__1__USERNAME |
iot_service |
EMQX_AUTHENTICATION__1__PASSWORD |
<PG_PASS> |
EMQX_AUTHORIZATION__SOURCES__1__SERVER |
как AUTHENTICATION |
EMQX_AUTHORIZATION__SOURCES__1__DATABASE |
iotdb |
EMQX_AUTHORIZATION__SOURCES__1__USERNAME |
iot_service |
EMQX_AUTHORIZATION__SOURCES__1__PASSWORD |
<PG_PASS> |
EMQX_LOG__CONSOLE_HANDLER__LEVEL |
warning |
⚠ Не задавать ...__URL (HTTP-auth старой схемы — уронит под). SSL обязателен.
После создания — записать UUID namespace EMQX (нужен в MQTT_HOST).
3. iot-service-контейнер (создаётся ВТОРЫМ)
Образ: gitea.services.ngcloud.ru/nail/iot-service:v0.1.13, порт из EXPOSE = 9090.
Env (обязательные — секреты; необязательные имеют дефолты в образе):
| Переменная | Значение |
|---|---|
IOT_PG_DSN |
postgresql://iot_service:<PG_PASS>@postgresqlk8s-master.509145c3-ba71-4687-a084-d9dcbc88d3d2.svc.cluster.local:5432/iotdb?sslmode=require |
SQS_ACCESS_KEY |
SSAK-b8fb2b3000c178b865091686 |
SQS_SECRET_KEY |
<из Admin API / лога сервиса> |
MQTT_USERNAME |
iot-bridge (device_id строки бриджа) |
MQTT_PASSWORD |
<сгенерировать> |
JWT_HMAC_SECRET |
<сгенерировать> |
SQS_ENDPOINT |
https://sqs.sinefo.ru (не дефолт: shared-sqs НЕ в кластере, а на ВМ 213) |
SQS_QUEUE_NAME |
iot-telemetry (дефолт) |
SQS_DLQ_NAME |
iot-telemetry-dlq (дефолт) |
MQTT_HOST |
<UUID namespace EMQX из шага 2> |
MQTT_PORT |
8083 (дефолт) |
AUTH_TEST_MODE |
false |
При старте монолит: подключается к PG, создаёт схему, EnsureBridgeDevice(MQTT_USERNAME, MQTT_PASSWORD) → строка __bridge/iot-bridge в iot_devices для EMQX-auth.
4. Проверка
/healthи/ready(порт 9090) → 200.- В логе:
bridge: MQTT connected,bridge: subscribed,consumer: SQS queue resolved. - EMQX:
curl https://<emqx-домен>/mqtt→ 400 (норма). wss-рука — клиент с subprotocolmqtt.