diff --git a/Dockerfile b/Dockerfile index 9768ae9..9de3981 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,7 +24,7 @@ USER 65532:65532 EXPOSE 9090 ENV API_PORT=9090 \ - SQS_ENDPOINT=http://containerk8s.f1ffb134-7d16-45bd-8bef-69f6ec8ab33c.svc.cluster.local:4100 \ + SQS_ENDPOINT=https://sqs.sinefo.ru \ SQS_QUEUE_NAME=iot-telemetry \ SQS_REGION=us-east-1 \ SQS_LONG_POLL_SECONDS=20 \ diff --git a/internal/service/config/config.go b/internal/service/config/config.go index 5b1aaee..a5d096b 100644 --- a/internal/service/config/config.go +++ b/internal/service/config/config.go @@ -123,13 +123,17 @@ func Load() (*Config, error) { LogLevel: parseLogLevel(os.Getenv("LOG_LEVEL"), slog.LevelInfo), } - // MQTT broker URL: либо полный MQTT_BROKER_URL, либо из HOST/PORT/WS_PATH + // MQTT broker URL: либо полный MQTT_BROKER_URL, либо из HOST/PORT/WS_PATH. + // MQTT_HOST обязателен: EMQX в другом namespace платформы, дефолта нет + // (см. DefaultMQTTHost). cfg.MQTTBrokerURL = os.Getenv("MQTT_BROKER_URL") if cfg.MQTTBrokerURL == "" { host := getEnv("MQTT_HOST", DefaultMQTTHost) port := getEnv("MQTT_PORT", DefaultMQTTPort) path := getEnv("MQTT_WS_PATH", DefaultMQTTWSPath) - cfg.MQTTBrokerURL = "ws://" + host + ":" + port + path + if host != "" { + cfg.MQTTBrokerURL = "ws://" + host + ":" + port + path + } } else if !strings.HasPrefix(cfg.MQTTBrokerURL, "ws://") && !strings.HasPrefix(cfg.MQTTBrokerURL, "wss://") { return nil, fmt.Errorf("MQTT_BROKER_URL must start with ws:// or wss://, got %q", cfg.MQTTBrokerURL) @@ -139,6 +143,9 @@ func Load() (*Config, error) { if cfg.IOTPGDSN == "" { missing = append(missing, "IOT_PG_DSN") } + if cfg.MQTTBrokerURL == "" { + missing = append(missing, "MQTT_HOST (или MQTT_BROKER_URL)") + } if cfg.SQSAccessKey == "" { missing = append(missing, "SQS_ACCESS_KEY") } diff --git a/internal/service/config/defaults.go b/internal/service/config/defaults.go index d3367dd..74c52f2 100644 --- a/internal/service/config/defaults.go +++ b/internal/service/config/defaults.go @@ -6,9 +6,9 @@ const ( // DefaultAPIPort — единственный порт контейнера: API + /health + /metrics. DefaultAPIPort = "9090" - // DefaultSQSEndpoint — внутренний адрес shared-sqs в том же кластере Nubes. - // Обходит внешний шлюз платформы (таймауты 31-33с, MSS 1448, ~150с). - DefaultSQSEndpoint = "http://containerk8s.f1ffb134-7d16-45bd-8bef-69f6ec8ab33c.svc.cluster.local:4100" + // DefaultSQSEndpoint — публичный endpoint shared-sqs (ВМ 213), внешний доступ + // обязателен: shared-sqs живёт НЕ в кластере Nubes. Переопределяется SQS_ENDPOINT. + DefaultSQSEndpoint = "https://sqs.sinefo.ru" // DefaultSQSQueueName — очередь телеметрии IoT. DefaultSQSQueueName = "iot-telemetry" @@ -21,9 +21,11 @@ const ( // DefaultSQSRegion — регион для self-hosted SQS (не важен, оставлен для SDK). DefaultSQSRegion = "us-east-1" - // DefaultMQTTHost — внутреннее имя EMQX-контейнера на платформе. - // Реальный UUID namespace EMQX задаётся в deck-UI (MQTT_HOST) при создании. - DefaultMQTTHost = "emqx" + // DefaultMQTTHost — пусто: вменяемого дефолта нет, EMQX живёт в ДРУГОМ + // namespace платформы и доступен только по FQDN + // containerk8s..svc.cluster.local. Поэтому MQTT_HOST обязателен + // (задаётся Terraform'ом из state EMQX), иначе config.Load вернёт ошибку. + DefaultMQTTHost = "" // DefaultMQTTPort — WebSocket-листенер EMQX (wss внутри платформы). DefaultMQTTPort = "8083"