diff --git a/cmd/traefik-selectel-dns/main.go b/cmd/traefik-selectel-dns/main.go index 3a13974..7e1b45c 100644 --- a/cmd/traefik-selectel-dns/main.go +++ b/cmd/traefik-selectel-dns/main.go @@ -39,10 +39,9 @@ func run() int { } cfg, err := config.Load(*configPath, os.Getenv, config.OSReadFile) - if err != nil { - fmt.Fprintln(os.Stderr, "ошибка конфигурации:", err) - return 2 - } + // Проверка здоровья намеренно идёт ДО разбора ошибки конфигурации: HEALTHCHECK в образе + // запускается как отдельный процесс, без -config и без секретов, и ему нужен только адрес + // /healthz. Load возвращает конфиг с значениями по умолчанию даже при ошибке. if *healthcheck { if err := health.Probe(cfg.Listen, 3*time.Second); err != nil { fmt.Fprintln(os.Stderr, err) @@ -50,6 +49,10 @@ func run() int { } return 0 } + if err != nil { + fmt.Fprintln(os.Stderr, "ошибка конфигурации:", err) + return 2 + } log := newLogger(cfg) log.Info("запуск", "version", version, "zones", cfg.Zones, "ip", cfg.IP, "ttl", cfg.TTL, diff --git a/internal/config/config_test.go b/internal/config/config_test.go index fd99df5..15a6df6 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -138,3 +138,15 @@ func TestSecretMissingFile(t *testing.T) { t.Fatal("ожидалась ошибка") } } + +// Load обязан возвращать пригодный Listen даже при ошибке: на этом построена проверка +// здоровья в контейнере — HEALTHCHECK запускается без -config и без секретов. +func TestLoadReturnsDefaultListenOnError(t *testing.T) { + cfg, err := Load("", func(string) string { return "" }, OSReadFile) + if err == nil { + t.Fatal("ожидали ошибку: не заданы ни конфиг, ни креды") + } + if cfg.Listen != ":9090" { + t.Fatalf("Listen = %q, ожидали значение по умолчанию :9090", cfg.Listen) + } +}