diff --git a/internal/config/config.go b/internal/config/config.go index d0bb092..a3f3f6b 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -252,11 +252,9 @@ func (c *Config) validate() error { errs = append(errs, fmt.Errorf("worker.source_missing_threshold %d must be >= 1", c.Worker.SourceMissingThreshold)) } - // Обязательные секреты включённых секций (ловит криво отрендеренный деплоем - // файл). qBittorrent — ядро, пароль нужен всегда. - if c.QBittorrent.Password == "" { - errs = append(errs, errors.New("qbittorrent.password is empty (required secret)")) - } + // qbittorrent.password намеренно не обязателен: qBittorrent может работать без + // аутентификации (например, обход авторизации для клиентов из доверенной + // подсети) — пустой пароль валиден. // llm.api_key намеренно не обязателен: keyless-local LLM (LM Studio с // заданным base_url, но без ключа) — валидный документированный дефолт. diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 4660f4e..6288407 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -33,6 +33,17 @@ func TestValidate_OK(t *testing.T) { } } +// TestValidate_NoQBittorrentPassword — пустой пароль qBittorrent валиден: +// клиент может работать без аутентификации (обход авторизации для доверенной +// подсети). +func TestValidate_NoQBittorrentPassword(t *testing.T) { + c := validCfg(t) + c.QBittorrent.Password = "" + if err := c.validate(); err != nil { + t.Fatalf("пустой пароль qBittorrent должен быть валиден, got %v", err) + } +} + // TestValidate_KeylessLocalLLM — keyless-local LLM (задан base_url, пустой // api_key, напр. LM Studio) — валиден: ключ не обязателен. func TestValidate_KeylessLocalLLM(t *testing.T) { @@ -51,7 +62,6 @@ func TestValidate_Errors(t *testing.T) { want string }{ {"empty qbittorrent.url", func(c *Config) { c.QBittorrent.URL = "" }, "qbittorrent.url"}, - {"empty qbittorrent.password", func(c *Config) { c.QBittorrent.Password = "" }, "qbittorrent.password"}, {"empty db_path", func(c *Config) { c.Storage.DBPath = "" }, "storage.db_path"}, {"bad llm.type", func(c *Config) { c.LLM.Type = "anthropic" }, "llm.type"}, {"relative movies", func(c *Config) { c.Paths.Movies = "movies" }, "absolute"},