docs: полная документация v0.2.3 — архитектура, API, деплой, тестирование

Новые файлы:
- doc/architecture/current-v0.2.3.md — актуальная архитектура
- doc/api/endpoints-v0.2.3.md — полная документация REST API
- doc/deployment-v0.2.3.md — инструкция деплоя v0.2.3
- doc/run-and-test.md — руководство по запуску и E2E тесту

Обновлено:
- doc/progress.md — секция документации
- doc/thinking/2026-04-12.md — лог мышления
This commit is contained in:
Naeel
2026-04-12 18:36:12 +03:00
parent 4cba163ace
commit 907aaad100
12 changed files with 1303 additions and 5 deletions
+4
View File
@@ -31,6 +31,10 @@ type Handler struct {
// IoTPG — хранилище IoT телеметрии (per-tenant Postgres). nil если IOT_PG_DSN не задан.
IoTPG *iotpg.IoTPostgresStore
Log *slog.Logger
// BridgeUsername — username внутреннего MQTT bridge (env MQTT_BRIDGE_USERNAME)
BridgeUsername string
// BridgePassword — пароль bridge (env MQTT_BRIDGE_PASSWORD)
BridgePassword string
}
// writeJSON отправляет JSON-ответ с указанным статусом.
@@ -151,6 +151,18 @@ func (h *Handler) MQTTAuth(w http.ResponseWriter, r *http.Request) {
return
}
// Bridge — внутренний MQTT bridge клиент. Проверяем фиксированные credentials
// до парсинга namespace_deviceId.
if h.BridgeUsername != "" && req.Username == h.BridgeUsername {
if subtle.ConstantTimeCompare([]byte(h.BridgePassword), []byte(req.Password)) == 1 {
writeJSON(w, http.StatusOK, mqttAuthResponse{Result: "allow"})
return
}
writeJSON(w, http.StatusOK, mqttAuthResponse{Result: "deny"})
return
}
// Парсим username: "{namespace}_{deviceId}"
// Namespace содержит только [a-z0-9-], первый "_" — разделитель.
idx := strings.Index(req.Username, "_")
@@ -427,6 +439,9 @@ func (h *Handler) MQTTAcl(w http.ResponseWriter, r *http.Request) {
return
}
// Bridge — внутренний MQTT bridge клиент. Проверяем фиксированные credentials
// до парсинга namespace_deviceId.
// Парсим username → namespace + deviceId (формат: "{ns}_{deviceId}")
// strings.Index находит ПЕРВЫЙ '_' — namespace содержит только дефисы
idx := strings.Index(req.Username, "_")