- Validação cross-tenant no login e rotas protegidas
- File serving via /api/files/{bucket}/{path} (eliminação DNS)
- Mensagens de erro humanizadas inline (sem pop-ups)
- Middleware tenant detection via headers customizados
- Upload de logos retorna URLs via API
- README atualizado com changelog v1.4 completo
122 lines
3.1 KiB
Go
122 lines
3.1 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
)
|
|
|
|
// Config holds all application configuration
|
|
type Config struct {
|
|
Server ServerConfig
|
|
Database DatabaseConfig
|
|
JWT JWTConfig
|
|
Security SecurityConfig
|
|
App AppConfig
|
|
Minio MinioConfig
|
|
}
|
|
|
|
// AppConfig holds application-level settings
|
|
type AppConfig struct {
|
|
Environment string // "development" or "production"
|
|
BaseDomain string // "localhost" or "aggios.app"
|
|
}
|
|
|
|
// ServerConfig holds server-specific configuration
|
|
type ServerConfig struct {
|
|
Port string
|
|
}
|
|
|
|
// DatabaseConfig holds database connection settings
|
|
type DatabaseConfig struct {
|
|
Host string
|
|
Port string
|
|
User string
|
|
Password string
|
|
Name string
|
|
}
|
|
|
|
// JWTConfig holds JWT configuration
|
|
type JWTConfig struct {
|
|
Secret string
|
|
}
|
|
|
|
// SecurityConfig holds security settings
|
|
type SecurityConfig struct {
|
|
AllowedOrigins []string
|
|
MaxAttemptsPerMin int
|
|
PasswordMinLength int
|
|
}
|
|
|
|
// MinioConfig holds MinIO configuration
|
|
type MinioConfig struct {
|
|
Endpoint string
|
|
PublicURL string // URL pública para acesso ao MinIO (para gerar links)
|
|
RootUser string
|
|
RootPassword string
|
|
UseSSL bool
|
|
BucketName string
|
|
}
|
|
|
|
// Load loads configuration from environment variables
|
|
func Load() *Config {
|
|
env := getEnvOrDefault("APP_ENV", "development")
|
|
baseDomain := "localhost"
|
|
if env == "production" {
|
|
baseDomain = "aggios.app"
|
|
}
|
|
|
|
// Rate limit: more lenient in dev, strict in prod
|
|
maxAttempts := 1000 // Aumentado drasticamente para evitar 429 durante debug
|
|
if env == "production" {
|
|
maxAttempts = 100 // Mais restritivo em produção
|
|
}
|
|
|
|
return &Config{
|
|
Server: ServerConfig{
|
|
Port: getEnvOrDefault("SERVER_PORT", "8080"),
|
|
},
|
|
Database: DatabaseConfig{
|
|
Host: getEnvOrDefault("DB_HOST", "localhost"),
|
|
Port: getEnvOrDefault("DB_PORT", "5432"),
|
|
User: getEnvOrDefault("DB_USER", "postgres"),
|
|
Password: getEnvOrDefault("DB_PASSWORD", "postgres"),
|
|
Name: getEnvOrDefault("DB_NAME", "aggios"),
|
|
},
|
|
JWT: JWTConfig{
|
|
Secret: getEnvOrDefault("JWT_SECRET", "INSECURE-fallback-secret-CHANGE-THIS"),
|
|
},
|
|
App: AppConfig{
|
|
Environment: env,
|
|
BaseDomain: baseDomain,
|
|
},
|
|
Security: SecurityConfig{
|
|
AllowedOrigins: []string{
|
|
"http://localhost",
|
|
"http://dash.localhost",
|
|
"http://aggios.local",
|
|
"http://dash.aggios.local",
|
|
"https://aggios.app",
|
|
"https://dash.aggios.app",
|
|
"https://www.aggios.app",
|
|
},
|
|
MaxAttemptsPerMin: maxAttempts,
|
|
PasswordMinLength: 8,
|
|
},
|
|
Minio: MinioConfig{
|
|
Endpoint: getEnvOrDefault("MINIO_ENDPOINT", "minio:9000"),
|
|
PublicURL: getEnvOrDefault("MINIO_PUBLIC_URL", "http://localhost:9000"),
|
|
RootUser: getEnvOrDefault("MINIO_ROOT_USER", "minioadmin"),
|
|
RootPassword: getEnvOrDefault("MINIO_ROOT_PASSWORD", "changeme"),
|
|
UseSSL: getEnvOrDefault("MINIO_USE_SSL", "false") == "true",
|
|
BucketName: getEnvOrDefault("MINIO_BUCKET_NAME", "aggios"),
|
|
},
|
|
}
|
|
}
|
|
|
|
// getEnvOrDefault returns environment variable or default value
|
|
func getEnvOrDefault(key, defaultValue string) string {
|
|
if value := os.Getenv(key); value != "" {
|
|
return value
|
|
}
|
|
return defaultValue
|
|
}
|