chore(config): rename SMARTMUSIC_ env prefix to MINSTREL_; default admin user
The legacy SMARTMUSIC_ prefix dates from when the project was specced as "smart-music" before being renamed to Minstrel. Hard cutover to MINSTREL_* across config.go, tests, config.example.yaml, README, and docker-compose. Also renames SMARTMUSIC_CONFIG in cmd/minstrel/main.go which was missed in the original audit. Also seeds Auth.AdminBootstrap.Username = "admin" in Default() so MINSTREL_DATABASE_URL is the only env var required for a fresh prod deployment — the bootstrap auto-generates a password and prints it to stderr. Drops the now-redundant MINSTREL_AUTH_ADMIN_USERNAME=admin line from the README quickstart and docker-compose. M1 follow-up from the #363 final review: guards MINSTREL_BRANDING_APP_NAME and _DESCRIPTION against empty-string overrides — empty would have shipped <title></title> to share-preview crawlers. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+17
-12
@@ -111,6 +111,11 @@ func Default() Config {
|
||||
AppName: "Minstrel",
|
||||
Description: "Self-hosted music server with Subsonic compatibility, smart shuffle, and Lidarr integration.",
|
||||
},
|
||||
Auth: AuthConfig{
|
||||
AdminBootstrap: AdminBootstrapConfig{
|
||||
Username: "admin",
|
||||
},
|
||||
},
|
||||
Events: EventsConfig{
|
||||
SessionTimeoutMinutes: 30,
|
||||
SkipMaxCompletionRatio: 0.5,
|
||||
@@ -148,42 +153,42 @@ func Load(path string) (Config, error) {
|
||||
}
|
||||
|
||||
func applyEnv(cfg *Config) {
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_SERVER_ADDRESS"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_SERVER_ADDRESS"); ok {
|
||||
cfg.Server.Address = v
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_STORAGE_DATA_DIR"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_STORAGE_DATA_DIR"); ok {
|
||||
cfg.Storage.DataDir = v
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_DATABASE_URL"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_DATABASE_URL"); ok {
|
||||
cfg.Database.URL = v
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_LOG_LEVEL"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_LOG_LEVEL"); ok {
|
||||
cfg.Log.Level = strings.ToLower(v)
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_LOG_FORMAT"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_LOG_FORMAT"); ok {
|
||||
cfg.Log.Format = strings.ToLower(v)
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_BRANDING_APP_NAME"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_BRANDING_APP_NAME"); ok && v != "" {
|
||||
cfg.Branding.AppName = v
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_BRANDING_DESCRIPTION"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_BRANDING_DESCRIPTION"); ok && v != "" {
|
||||
cfg.Branding.Description = v
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_AUTH_ADMIN_USERNAME"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_AUTH_ADMIN_USERNAME"); ok {
|
||||
cfg.Auth.AdminBootstrap.Username = v
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_AUTH_ADMIN_PASSWORD"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_AUTH_ADMIN_PASSWORD"); ok {
|
||||
cfg.Auth.AdminBootstrap.Password = v
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_LIBRARY_SCAN_PATHS"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_LIBRARY_SCAN_PATHS"); ok {
|
||||
cfg.Library.ScanPaths = splitPaths(v)
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_LIBRARY_SCAN_ON_STARTUP"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_LIBRARY_SCAN_ON_STARTUP"); ok {
|
||||
if b, err := strconv.ParseBool(v); err == nil {
|
||||
cfg.Library.ScanOnStartup = b
|
||||
}
|
||||
}
|
||||
if v, ok := os.LookupEnv("SMARTMUSIC_SUBSONIC_ALLOW_PLAINTEXT_PASSWORD"); ok {
|
||||
if v, ok := os.LookupEnv("MINSTREL_SUBSONIC_ALLOW_PLAINTEXT_PASSWORD"); ok {
|
||||
if b, err := strconv.ParseBool(v); err == nil {
|
||||
cfg.Subsonic.AllowPlaintextPassword = b
|
||||
}
|
||||
|
||||
@@ -56,10 +56,10 @@ func TestLoadMissingFileReturnsDefaults(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestEnvOverrides(t *testing.T) {
|
||||
t.Setenv("SMARTMUSIC_SERVER_ADDRESS", ":8080")
|
||||
t.Setenv("SMARTMUSIC_DATABASE_URL", "postgres://env")
|
||||
t.Setenv("SMARTMUSIC_LOG_LEVEL", "WARN")
|
||||
t.Setenv("SMARTMUSIC_LOG_FORMAT", "JSON")
|
||||
t.Setenv("MINSTREL_SERVER_ADDRESS", ":8080")
|
||||
t.Setenv("MINSTREL_DATABASE_URL", "postgres://env")
|
||||
t.Setenv("MINSTREL_LOG_LEVEL", "WARN")
|
||||
t.Setenv("MINSTREL_LOG_FORMAT", "JSON")
|
||||
|
||||
cfg, err := Load("")
|
||||
if err != nil {
|
||||
@@ -80,8 +80,8 @@ func TestEnvOverrides(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestAdminBootstrapEnvOverrides(t *testing.T) {
|
||||
t.Setenv("SMARTMUSIC_AUTH_ADMIN_USERNAME", "root")
|
||||
t.Setenv("SMARTMUSIC_AUTH_ADMIN_PASSWORD", "sekret")
|
||||
t.Setenv("MINSTREL_AUTH_ADMIN_USERNAME", "root")
|
||||
t.Setenv("MINSTREL_AUTH_ADMIN_PASSWORD", "sekret")
|
||||
|
||||
cfg, err := Load("")
|
||||
if err != nil {
|
||||
@@ -96,8 +96,8 @@ func TestAdminBootstrapEnvOverrides(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestLibraryEnvOverrides(t *testing.T) {
|
||||
t.Setenv("SMARTMUSIC_LIBRARY_SCAN_PATHS", "/music:/other::/third")
|
||||
t.Setenv("SMARTMUSIC_LIBRARY_SCAN_ON_STARTUP", "true")
|
||||
t.Setenv("MINSTREL_LIBRARY_SCAN_PATHS", "/music:/other::/third")
|
||||
t.Setenv("MINSTREL_LIBRARY_SCAN_ON_STARTUP", "true")
|
||||
|
||||
cfg, err := Load("")
|
||||
if err != nil {
|
||||
@@ -118,7 +118,7 @@ func TestLibraryEnvOverrides(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSubsonicEnvOverride(t *testing.T) {
|
||||
t.Setenv("SMARTMUSIC_SUBSONIC_ALLOW_PLAINTEXT_PASSWORD", "true")
|
||||
t.Setenv("MINSTREL_SUBSONIC_ALLOW_PLAINTEXT_PASSWORD", "true")
|
||||
cfg, err := Load("")
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
@@ -185,8 +185,8 @@ func TestBrandingYAMLOverride(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestBrandingEnvOverride(t *testing.T) {
|
||||
t.Setenv("SMARTMUSIC_BRANDING_APP_NAME", "Office Music")
|
||||
t.Setenv("SMARTMUSIC_BRANDING_DESCRIPTION", "Office tunes.")
|
||||
t.Setenv("MINSTREL_BRANDING_APP_NAME", "Office Music")
|
||||
t.Setenv("MINSTREL_BRANDING_DESCRIPTION", "Office tunes.")
|
||||
cfg, err := Load("")
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
|
||||
Reference in New Issue
Block a user