docs: HISTORY — ответ Sonnet оценён: 7 поправок (PG не меняется, тот же кластер/шлюз, multi-port, EMQX env, /metrics, bcrypt, dedup); след.шаг: wss-тест старого прод-домена

This commit is contained in:
“Naeel”
2026-08-16 09:25:21 +04:00
parent 031e71b39d
commit b69f0b5276
+52
View File
@@ -334,3 +334,55 @@ Python 3.10, websocket-client 1.9.0 установлен. Тот же скрип
(или python websocket-client, ping 25с / echo 10с) — обрыв на 150–173с. (или python websocket-client, ping 25с / echo 10с) — обрыв на 150–173с.
- Связь с shared-sqs: таймауты 3133с (~5.5% HTTP-запросов), MSS=1448 при - Связь с shared-sqs: таймауты 3133с (~5.5% HTTP-запросов), MSS=1448 при
MTU 1400 — вероятно, тот же внешний шлюз. MTU 1400 — вероятно, тот же внешний шлюз.
---
## 10. Консультация Sonnet (промпт → ответ) — критическая оценка
**Что сделано:** составлен промпт для Sonnet (жёсткий список файлов: HISTORY
2026-08-16, migration-to-managed, sqs-integration, architecture/current-v0.2.3,
deployment-v0.2.3; 9 вопросов; формат «Ответ/Рекомендация/Риски», без кода).
Ответ получен, оценён ниже.
**Ключевые рекомендации Sonnet (приняты):**
- Компоновка: EMQX-контейнер + Go-монолит (API+bridge+consumer в одном бинарнике).
- EMQX оставить (не mochi-mqtt), если настроится на платформе.
- SQS в середине потока СОХРАНИТЬ (буфер при падении PG, admin-stats).
- Auth: перенос Secrets→таблица iot_devices ДО переключения; закрыть
authTestMode и ADMIN_STATS_TOKEN до прода.
- 3 фазы миграции; откат — DNS обратно; критерий готовности переключения
устройств: wss ≥600с с 3 независимых интернет-точек.
- Вопросы в техподдержку Nubes: кастомный домен, лимит ~150с, таймауты
3133с, MSS, subprotocol mqtt, multi-port, PVC, latest-pull, лимиты.
**ПОПРАВКИ к ответу Sonnet (важно):**
1. **PG НЕ меняется.** Managed PostgreSQL уже используется текущим consumer'ом
(IOT_PG_DSN → postgresqlk8s…svc.cluster.local). Утверждение Sonnet «новые
данные пишутся в новую PG» — ОШИБКА. Телеметрию переносить не нужно вовсе;
переносятся только CRD-объекты (устройства+пароли).
2. **Платформенные контейнеры живут в ТОМ ЖЕ кластере**, что и старый деплой
IoT: ноды `iot-naeel-*`, ingress `shturval` — один кластер. Значит старый
вход `iot.kube5s.ru` (185.247.187.147), скорее всего, идёт через ТОТ ЖЕ
краевой шлюз — вариант Sonnet «EMQX на старом кластере как точка входа»
проблему не обходит (и его сомнение в обратную сторону неверно).
Проверяемо тестом: держать wss к `wss://iot.kube5s.ru/mqtt` 5+ мин —
если stall ~150с есть и там, текущие устройства уже страдают.
3. **Multi-port** у Sonnet заявлен как факт в п.1 («1883 внутренний для bridge»),
но в п.9.6 сам же помечен НЕИЗВЕСТНО — противоречие. Вероятный реальный
сценарий: один порт на контейнер → EMQX наружу только 8083 (wss), bridge
к EMQX тоже по wss внутри платформы.
4. **Конфиг EMQX через env — не блокер.** EMQX 5 поддерживает env vars
(EMQX_*); плюс можно собрать свой образ на базе emqx/emqx с вшитым
emqx.conf (публичный Docker Hub) — снимает ограничение полностью.
5. **/metrics уже есть** в текущем операторе (порт 8080, controller-runtime)
— переносится в монолит, а не «отсутствует» (ошибка Sonnet).
6. **bcrypt для паролей** — ок для НОВЫХ устройств, но для переноса старых
нужен скрипт: прочитать все Secrets `iot-{deviceId}` в ns sless и вставить
в таблицу с сохранением работоспособности (хэшировать при вставке).
7. Дубли при at-least-once: нужен dedup-ключ в InsertTelemetry
(например уникальный индекс по (namespace, device_id, received_at) или
message-id) — сейчас отсутствует.
**Следующий шаг (предложен, ждёт «делай»):**
- Тест wss к СТАРОМУ прод-домену `wss://iot.kube5s.ru/mqtt` (5 мин, станция +
Vultr) — определить, страдают ли текущие устройства от того же шлюза.