From c787fa929b97ca6d219b8cbe1a06a84ebd1cab7f Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Wed, 18 Jun 2025 21:27:19 +0300 Subject: [PATCH] fix: config for backend; refactor: docker compose env variables --- backend/cmd/main.go | 2 +- backend/config/config.go | 100 ++++++++++++++++++--------------------- docker-compose.yml | 4 ++ 3 files changed, 50 insertions(+), 56 deletions(-) diff --git a/backend/cmd/main.go b/backend/cmd/main.go index 6a0cd61..f66a4e0 100644 --- a/backend/cmd/main.go +++ b/backend/cmd/main.go @@ -14,7 +14,7 @@ import ( func main() { - if err := config.LoadConfig(); err != nil { + if _, err := config.Load(); err != nil { panic(err) } diff --git a/backend/config/config.go b/backend/config/config.go index 7e7a525..e2db862 100644 --- a/backend/config/config.go +++ b/backend/config/config.go @@ -2,84 +2,74 @@ package config import ( "fmt" - "log" - "reflect" + "strings" "github.com/spf13/viper" ) type Config struct { - Hostname string `mapstructure:"HOSTNAME"` - Port string `mapstructure:"PORT"` - - DatabaseUrl string `mapstructure:"POSTGRES_URL"` - RedisUrl string `mapstructure:"REDIS_URL"` - MinioUrl string `mapstructure:"MINIO_URL"` - - JwtAlgorithm string `mapstructure:"JWT_ALGORITHM"` - JwtSecret string `mapstructure:"JWT_SECRET"` - JwtIssuer string `mapstructure:"JWT_ISSUER"` - JwtAudience string `mapstructure:"JWT_AUDIENCE"` - JwtExpAccess string `mapstructure:"JWT_EXP_ACCESS"` - JwtExpRefresh string `mapstructure:"JWT_EXP_REFRESH"` - - Environment string `mapstructure:"ENVIRONMENT"` + Hostname string `mapstructure:"HOSTNAME"` + Port string `mapstructure:"PORT"` + DatabaseUrl string `mapstructure:"POSTGRES_URL"` + RedisUrl string `mapstructure:"REDIS_URL"` + MinioUrl string `mapstructure:"MINIO_URL"` + JwtAlgorithm string `mapstructure:"JWT_ALGORITHM"` + JwtSecret string `mapstructure:"JWT_SECRET"` + JwtIssuer string `mapstructure:"JWT_ISSUER"` + JwtAudience string `mapstructure:"JWT_AUDIENCE"` + JwtExpAccess string `mapstructure:"JWT_EXP_ACCESS"` + JwtExpRefresh string `mapstructure:"JWT_EXP_REFRESH"` + Environment string `mapstructure:"ENVIRONMENT"` } -var config *Config - -func LoadConfig() error { - - viper.AutomaticEnv() - - viper.SetConfigName(".env") - viper.SetConfigType("env") - viper.AddConfigPath(".") - - // Load .env file - if err := viper.ReadInConfig(); err != nil { - log.Printf("Error reading .env file, proceeding with environment variables. %s", err) - } +func Load() (*Config, error) { viper.SetDefault("HOSTNAME", "localhost") viper.SetDefault("PORT", "8080") - viper.SetDefault("JWT_ALGORITHM", "HS256") - viper.SetDefault("JWT_SECRET", "default_jwt_secret_please_change") // TODO: remove and randomly generate + viper.SetDefault("JWT_SECRET", "default_jwt_secret_please_change") viper.SetDefault("JWT_EXP_ACCESS", "5m") viper.SetDefault("JWT_EXP_REFRESH", "1w") viper.SetDefault("JWT_AUDIENCE", "easywish") viper.SetDefault("JWT_ISSUER", "easywish") - viper.SetDefault("ENVIRONMENT", "production") - if err := viper.Unmarshal(&config); err != nil { - log.Fatalf("Unable to decode into struct, %v", err) + viper.AutomaticEnv() + + required := []string{ + "POSTGRES_URL", + "REDIS_URL", + "MINIO_URL", } - - if err := validateConfig(); err != nil { - return err - } - - return nil -} - -func validateConfig() error { - v := reflect.ValueOf(*config) - t := v.Type() - - for i := range v.NumField() { - field := v.Field(i) - fieldType := t.Field(i) - - if field.Kind() == reflect.String && field.String() == "" { - return fmt.Errorf("Missing required configuration: %s", fieldType.Name) + var missing []string + for _, key := range required { + if !viper.IsSet(key) { + missing = append(missing, key) } } + if len(missing) > 0 { + return nil, fmt.Errorf("missing required environment variables: %s", strings.Join(missing, ", ")) + } - return nil + var cfg Config + if err := viper.Unmarshal(&cfg); err != nil { + return nil, fmt.Errorf("failed to unmarshal config: %w", err) + } + + config = &cfg + return &cfg, nil } func GetConfig() *Config { + + if config == nil { + + if _, err := Load(); err != nil { + panic(err) + } + } + return config } + +var config *Config diff --git a/docker-compose.yml b/docker-compose.yml index fd1991b..81fefc5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,6 +15,10 @@ services: interval: 5s timeout: 10s retries: 3 + environment: + POSTGRES_URL: ${POSTGRES_URL} + REDIS_URL: ${REDIS_URL} + MINIO_URL: ${MINIO_URL} ports: - "8080:8080" networks: