From b607fe0a6425c05544b2cce99bb391ea07694822 Mon Sep 17 00:00:00 2001 From: Vassiliy Yegorov Date: Tue, 22 Sep 2026 17:35:48 +0700 Subject: [PATCH] =?UTF-8?q?fix:=20healthcheck=20=D0=BD=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BB=D0=B6=D0=B5=D0=BD=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B5=D1=82=D1=8C=20=D0=BE=D1=82=20=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=BE=D1=82=D1=8B=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HEALTHCHECK в образе запускается отдельным процессом без -config и без секретов, поэтому валидация конфига делала контейнер unhealthy при полностью рабочем демоне. Проверка /healthz перенесена до разбора ошибки Load, который и при ошибке возвращает конфиг со значениями по умолчанию. Co-Authored-By: Claude Opus 5 (1M context) --- cmd/traefik-selectel-dns/main.go | 11 +++++++---- internal/config/config_test.go | 12 ++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) 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) + } +}