From 47edce1eaed6544d0d985d0cb74642fc6d8b2aa5 Mon Sep 17 00:00:00 2001 From: Wikid82 Date: Wed, 19 Nov 2025 21:36:26 -0500 Subject: [PATCH] feat: Add configuration management with environment variable support --- backend/internal/config/config.go | 59 +++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 backend/internal/config/config.go diff --git a/backend/internal/config/config.go b/backend/internal/config/config.go new file mode 100644 index 00000000..74f5a633 --- /dev/null +++ b/backend/internal/config/config.go @@ -0,0 +1,59 @@ +package config + +import ( + "fmt" + "os" + "path/filepath" +) + +// Config captures runtime configuration sourced from environment variables. +type Config struct { + Environment string + HTTPPort string + DatabasePath string + FrontendDir string + CaddyAdminAPI string + CaddyConfigDir string + CaddyBinary string + ImportCaddyfile string + ImportDir string + JWTSecret string +} + +// Load reads env vars and falls back to defaults so the server can boot with zero configuration. +func Load() (Config, error) { + cfg := Config{ + Environment: getEnv("CPM_ENV", "development"), + HTTPPort: getEnv("CPM_HTTP_PORT", "8080"), + DatabasePath: getEnv("CPM_DB_PATH", filepath.Join("data", "cpm.db")), + FrontendDir: getEnv("CPM_FRONTEND_DIR", filepath.Clean(filepath.Join("..", "frontend", "dist"))), + CaddyAdminAPI: getEnv("CPM_CADDY_ADMIN_API", "http://localhost:2019"), + CaddyConfigDir: getEnv("CPM_CADDY_CONFIG_DIR", filepath.Join("data", "caddy")), + CaddyBinary: getEnv("CPM_CADDY_BINARY", "caddy"), + ImportCaddyfile: getEnv("CPM_IMPORT_CADDYFILE", "/import/Caddyfile"), + ImportDir: getEnv("CPM_IMPORT_DIR", filepath.Join("data", "imports")), + JWTSecret: getEnv("CPM_JWT_SECRET", "change-me-in-production"), + } + + if err := os.MkdirAll(filepath.Dir(cfg.DatabasePath), 0o755); err != nil { + return Config{}, fmt.Errorf("ensure data directory: %w", err) + } + + if err := os.MkdirAll(cfg.CaddyConfigDir, 0o755); err != nil { + return Config{}, fmt.Errorf("ensure caddy config directory: %w", err) + } + + if err := os.MkdirAll(cfg.ImportDir, 0o755); err != nil { + return Config{}, fmt.Errorf("ensure import directory: %w", err) + } + + return cfg, nil +} + +func getEnv(key, fallback string) string { + if val := os.Getenv(key); val != "" { + return val + } + + return fallback +}