Компоненты: - iot-operator: controller-manager (IoTDevice CRD) + REST API (порт 9090) - mqtt-bridge: MQTT (EMQX) → Kafka bridge - kafka-consumer: Kafka → Postgres pipeline Модуль: gitea.services.ngcloud.ru/Nail/IoT Все 3 бинарника собираются, import paths адаптированы.
33 lines
1.7 KiB
Go
33 lines
1.7 KiB
Go
// Создано: 2026-04-04
|
|
// console_embed.go — встраивает HTML-файл IoT консоли в бинарник оператора через go:embed.
|
|
//
|
|
// Файл ui/iot-console.html встраивается при компиляции и раздаётся по GET /console.
|
|
// Путь /console доступен без JWT — это публичная статическая страница.
|
|
// Авторизация в UI происходит через Bearer-токен который пользователь вводит сам.
|
|
//
|
|
// Почему go:embed а не отдельный nginx: нет лишних pod'ов, единый деплой, нет drift.
|
|
// Почему /console без auth: HTML файл не содержит секретов, токен вводит пользователь.
|
|
|
|
package api
|
|
|
|
import (
|
|
_ "embed"
|
|
"net/http"
|
|
)
|
|
|
|
// iotConsoleHTML — бинарное содержимое IoT консоли, встроенное при сборке.
|
|
// При изменении HTML-файла достаточно пересобрать оператор.
|
|
//
|
|
//go:embed ui/iot-console.html
|
|
var iotConsoleHTML []byte
|
|
|
|
// ServeIoTConsole обрабатывает GET /console — отдаёт HTML SPA без JWT-проверки.
|
|
// Браузер кэширует HTML; API-запросы из JS защищены Bearer-токеном.
|
|
func ServeIoTConsole(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
|
// Не кэшировать агрессивно — консоль обновляется вместе с оператором
|
|
w.Header().Set("Cache-Control", "no-cache, must-revalidate")
|
|
w.WriteHeader(http.StatusOK)
|
|
_, _ = w.Write(iotConsoleHTML)
|
|
}
|