package app import ( "errors" "os" "strconv" "strings" ) func loadConfig() (Config, error) { cfg := Config{ DatabaseURL: getenv("DATABASE_URL", "postgres://postgres:postgres@localhost:5432/box?sslmode=disable"), ListenAddr: getenv("LISTEN_ADDR", ":8080"), UnixSocketPath: getenv("UNIX_SOCKET_PATH", ""), DevMode: getenvBool("DEV_MODE", true), DemoUser: getenv("DEV_DEMO_USER", "demo"), DemoEmail: getenv("DEV_DEMO_EMAIL", "demo@example.local"), AuthHeaderUser: getenv("AUTH_HEADER_USER", "X-authentik-username"), AuthHeaderEmail: getenv("AUTH_HEADER_EMAIL", "X-authentik-email"), OIDCIssuerURL: strings.TrimRight(getenv("OIDC_ISSUER_URL", ""), "/"), OIDCAudience: strings.TrimSpace(getenv("OIDC_AUDIENCE", "")), ForgejoBaseURL: strings.TrimRight(getenv("FORGEJO_BASE_URL", ""), "/"), ForgejoToken: getenv("FORGEJO_TOKEN", ""), ForgejoGitUsername: getenv("FORGEJO_GIT_USERNAME", "oauth2"), ForgejoOrg: getenv("FORGEJO_ORG", ""), DBProvisionAdminURL: getenv("DB_PROVISION_ADMIN_URL", ""), DBProvisionEnabled: getenvBool("DB_PROVISION_ENABLED", true), CaddyAdminURL: strings.TrimRight(getenv("CADDY_ADMIN_URL", "http://localhost:2019"), "/"), CaddyServerID: getenv("CADDY_SERVER_ID", "srv0"), CaddyDomainSuffix: getenv("CADDY_DOMAIN_SUFFIX", ""), CaddyRouteEnabled: getenvBool("CADDY_ROUTE_ENABLED", false), CaddyAuthEnabled: getenvBool("CADDY_AUTH_ENABLED", true), CaddyAuthUpstream: getenv("CADDY_AUTH_UPSTREAM", "localhost:9000"), CaddyAuthURI: getenv("CADDY_AUTH_URI", "/outpost.goauthentik.io/auth/caddy"), CaddyPersistConfigPath: strings.TrimSpace(getenv("CADDY_PERSIST_CONFIG_PATH", "")), CaddyFragmentPath: strings.TrimSpace(getenv("CADDY_FRAGMENT_PATH", "/etc/caddy/fragments/project-manager.caddy")), CaddyReloadCommand: strings.TrimSpace(getenv("CADDY_RELOAD_COMMAND", "sudo -n systemctl reload caddy")), CaddyAuthImportName: strings.TrimSpace(getenv("CADDY_AUTH_IMPORT_NAME", "auth")), WebhookBaseURL: strings.TrimRight(getenv("WEBHOOK_BASE_URL", ""), "/"), } if cfg.DatabaseURL == "" { return cfg, errors.New("DATABASE_URL is required") } if cfg.DBProvisionAdminURL == "" { cfg.DBProvisionAdminURL = cfg.DatabaseURL } return cfg, nil } func userHomeOrDot() string { h, err := os.UserHomeDir() if err != nil { return "." } return h } func getenv(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } func getenvBool(key string, fallback bool) bool { v := os.Getenv(key) if v == "" { return fallback } b, err := strconv.ParseBool(v) if err != nil { return fallback } return b }