package config import ( "os" "strconv" ) type Config struct { Port string DataDir string StorageDir string JWTSecret string JWTExpirySecs int DBPath string ThumbnailDir string TrashDir string VersionsDir string BackupDir string MaxLoginAttempts int LockoutSeconds int OnlyOfficeJWT string OnlyOfficeHost string PublicURL string InternalAPIURL string } func Load() *Config { cfg := &Config{ Port: getEnv("PORT", "5827"), DataDir: getEnv("DATA_DIR", "/app/data"), StorageDir: getEnv("STORAGE_DIR", "/storage"), JWTSecret: getEnv("JWT_SECRET", ""), JWTExpirySecs: getEnvInt("JWT_EXPIRY_SECS", 900), // 15 minutes MaxLoginAttempts: getEnvInt("MAX_LOGIN_ATTEMPTS", 5), LockoutSeconds: getEnvInt("LOCKOUT_SECONDS", 300), // 5 minutes OnlyOfficeJWT: getEnv("ONLYOFFICE_JWT_SECRET", ""), OnlyOfficeHost: getEnv("ONLYOFFICE_HOST", "office.elijahkuntz.com"), PublicURL: getEnv("PUBLIC_URL", ""), InternalAPIURL: getEnv("INTERNAL_API_URL", "http://192.168.50.81:5827/api"), } if cfg.InternalAPIURL == "" && cfg.PublicURL != "" { cfg.InternalAPIURL = cfg.PublicURL } cfg.DBPath = cfg.DataDir + "/drive.db" cfg.ThumbnailDir = cfg.DataDir + "/thumbnails" cfg.TrashDir = cfg.StorageDir + "/.trash" cfg.VersionsDir = cfg.StorageDir + "/.versions" cfg.BackupDir = cfg.StorageDir + "/.backups" return cfg } func getEnv(key, fallback string) string { if value, ok := os.LookupEnv(key); ok { return value } return fallback } func getEnvInt(key string, fallback int) int { if value, ok := os.LookupEnv(key); ok { if intVal, err := strconv.Atoi(value); err == nil { return intVal } } return fallback }