- Добавлен HTML SPA: internal/api/ui/iot-console.html Ванильный JS + mqtt.js (CDN), без фреймворков. Страницы: вход, список устройств, credentials, эмулятор MQTT, заглушка телеметрии. - Добавлен go:embed: internal/api/console_embed.go, GET /console - Добавлен CORS middleware в router.go для http://iot.kube5s.ru - Ingress emqx-ws-ingress.yaml: /console → sless-operator:9090 - Версия образа v0.1.53, задеплоен Доступно: http://iot.kube5s.ru/console
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)
|
|
}
|