// Создано: 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) }