deploy: EMQX, iot-operator, managed Postgres, Docker Hub image

- Добавлен EMQX deployment + WS ingress (адаптирован из sless)
- Добавлен iot-operator deployment с RBAC (ServiceAccount, ClusterRole)
- Postgres: заменён self-hosted на managed (dc5db45d namespace)
- Image: naeel/iot-operator:v0.2.0 (Docker Hub)
- Убран imagePullSecrets (Docker Hub публичный)
This commit is contained in:
Naeel
2026-04-12 16:07:41 +03:00
parent 6caab6b729
commit 150146edba
8 changed files with 554 additions and 196 deletions
+21 -21
View File
@@ -10,15 +10,15 @@
package handler
import (
"encoding/json"
"log/slog"
"net/http"
"encoding/json"
"log/slog"
"net/http"
"github.com/gorilla/mux"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/gorilla/mux"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"gitea.services.ngcloud.ru/Nail/IoT/internal/storage/iotpg"
"gitea.services.ngcloud.ru/Nail/IoT/internal/storage/iotpg"
)
// defaultNamespace — fallback namespace для dev/тестов.
@@ -26,34 +26,34 @@ const defaultNamespace = "default"
// Handler содержит зависимости для всех IoT REST-обработчиков.
type Handler struct {
K8s client.Client
Scheme *runtime.Scheme
// IoTPG — хранилище IoT телеметрии (per-tenant Postgres). nil если IOT_PG_DSN не задан.
IoTPG *iotpg.IoTPostgresStore
Log *slog.Logger
K8s client.Client
Scheme *runtime.Scheme
// IoTPG — хранилище IoT телеметрии (per-tenant Postgres). nil если IOT_PG_DSN не задан.
IoTPG *iotpg.IoTPostgresStore
Log *slog.Logger
}
// writeJSON отправляет JSON-ответ с указанным статусом.
func writeJSON(w http.ResponseWriter, status int, v any) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(status)
_ = json.NewEncoder(w).Encode(v)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(status)
_ = json.NewEncoder(w).Encode(v)
}
// errResp возвращает структуру ошибки для JSON.
func errResp(msg string) map[string]string {
return map[string]string{"error": msg}
return map[string]string{"error": msg}
}
// pathVar читает переменную пути из gorilla/mux.
func pathVar(r *http.Request, key string) string {
return mux.Vars(r)[key]
return mux.Vars(r)[key]
}
// namespace читает {namespace} из пути URL.
func namespace(r *http.Request) string {
if ns := mux.Vars(r)["namespace"]; ns != "" {
return ns
}
return defaultNamespace
if ns := mux.Vars(r)["namespace"]; ns != "" {
return ns
}
return defaultNamespace
}