mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2026-01-07 12:24:26 +00:00
- Add ServersConfig and ServerInstanceConfig structs - Support configuring multiple named server instances - Add global timeout defaults with per-instance overrides - Add TLS configuration options (SSL cert/key, self-signed, AutoTLS) - Add validation for server configurations - Add helper methods for applying defaults and getting default server - Add conversion helper to avoid import cycles
194 lines
8.0 KiB
Go
194 lines
8.0 KiB
Go
package config
|
|
|
|
import "time"
|
|
|
|
// Config represents the complete application configuration
|
|
type Config struct {
|
|
Servers ServersConfig `mapstructure:"servers"`
|
|
Tracing TracingConfig `mapstructure:"tracing"`
|
|
Cache CacheConfig `mapstructure:"cache"`
|
|
Logger LoggerConfig `mapstructure:"logger"`
|
|
ErrorTracking ErrorTrackingConfig `mapstructure:"error_tracking"`
|
|
Middleware MiddlewareConfig `mapstructure:"middleware"`
|
|
CORS CORSConfig `mapstructure:"cors"`
|
|
EventBroker EventBrokerConfig `mapstructure:"event_broker"`
|
|
DBManager DBManagerConfig `mapstructure:"dbmanager"`
|
|
Paths PathsConfig `mapstructure:"paths"`
|
|
Extensions map[string]interface{} `mapstructure:"extensions"`
|
|
}
|
|
|
|
// ServersConfig contains configuration for the server manager
|
|
type ServersConfig struct {
|
|
// DefaultServer is the name of the default server to use
|
|
DefaultServer string `mapstructure:"default_server"`
|
|
|
|
// Instances is a map of server name to server configuration
|
|
Instances map[string]ServerInstanceConfig `mapstructure:"instances"`
|
|
|
|
// Global timeout defaults (can be overridden per instance)
|
|
ShutdownTimeout time.Duration `mapstructure:"shutdown_timeout"`
|
|
DrainTimeout time.Duration `mapstructure:"drain_timeout"`
|
|
ReadTimeout time.Duration `mapstructure:"read_timeout"`
|
|
WriteTimeout time.Duration `mapstructure:"write_timeout"`
|
|
IdleTimeout time.Duration `mapstructure:"idle_timeout"`
|
|
}
|
|
|
|
// ServerInstanceConfig defines configuration for a single server instance
|
|
type ServerInstanceConfig struct {
|
|
// Name is the unique name of this server instance
|
|
Name string `mapstructure:"name"`
|
|
|
|
// Host is the host to bind to (e.g., "localhost", "0.0.0.0", "")
|
|
Host string `mapstructure:"host"`
|
|
|
|
// Port is the port number to listen on
|
|
Port int `mapstructure:"port"`
|
|
|
|
// Description is a human-readable description of this server
|
|
Description string `mapstructure:"description"`
|
|
|
|
// GZIP enables GZIP compression middleware
|
|
GZIP bool `mapstructure:"gzip"`
|
|
|
|
// TLS/HTTPS configuration options (mutually exclusive)
|
|
// Option 1: Provide certificate and key files directly
|
|
SSLCert string `mapstructure:"ssl_cert"`
|
|
SSLKey string `mapstructure:"ssl_key"`
|
|
|
|
// Option 2: Use self-signed certificate (for development/testing)
|
|
SelfSignedSSL bool `mapstructure:"self_signed_ssl"`
|
|
|
|
// Option 3: Use Let's Encrypt / AutoTLS
|
|
AutoTLS bool `mapstructure:"auto_tls"`
|
|
AutoTLSDomains []string `mapstructure:"auto_tls_domains"`
|
|
AutoTLSCacheDir string `mapstructure:"auto_tls_cache_dir"`
|
|
AutoTLSEmail string `mapstructure:"auto_tls_email"`
|
|
|
|
// Timeout configurations (overrides global defaults)
|
|
ShutdownTimeout *time.Duration `mapstructure:"shutdown_timeout"`
|
|
DrainTimeout *time.Duration `mapstructure:"drain_timeout"`
|
|
ReadTimeout *time.Duration `mapstructure:"read_timeout"`
|
|
WriteTimeout *time.Duration `mapstructure:"write_timeout"`
|
|
IdleTimeout *time.Duration `mapstructure:"idle_timeout"`
|
|
|
|
// Tags for organization and filtering
|
|
Tags map[string]string `mapstructure:"tags"`
|
|
}
|
|
|
|
// TracingConfig holds OpenTelemetry tracing configuration
|
|
type TracingConfig struct {
|
|
Enabled bool `mapstructure:"enabled"`
|
|
ServiceName string `mapstructure:"service_name"`
|
|
ServiceVersion string `mapstructure:"service_version"`
|
|
Endpoint string `mapstructure:"endpoint"`
|
|
}
|
|
|
|
// CacheConfig holds cache provider configuration
|
|
type CacheConfig struct {
|
|
Provider string `mapstructure:"provider"` // memory, redis, memcache
|
|
Redis RedisConfig `mapstructure:"redis"`
|
|
Memcache MemcacheConfig `mapstructure:"memcache"`
|
|
}
|
|
|
|
// RedisConfig holds Redis-specific configuration
|
|
type RedisConfig struct {
|
|
Host string `mapstructure:"host"`
|
|
Port int `mapstructure:"port"`
|
|
Password string `mapstructure:"password"`
|
|
DB int `mapstructure:"db"`
|
|
}
|
|
|
|
// MemcacheConfig holds Memcache-specific configuration
|
|
type MemcacheConfig struct {
|
|
Servers []string `mapstructure:"servers"`
|
|
MaxIdleConns int `mapstructure:"max_idle_conns"`
|
|
Timeout time.Duration `mapstructure:"timeout"`
|
|
}
|
|
|
|
// LoggerConfig holds logger configuration
|
|
type LoggerConfig struct {
|
|
Dev bool `mapstructure:"dev"`
|
|
Path string `mapstructure:"path"`
|
|
}
|
|
|
|
// MiddlewareConfig holds middleware configuration
|
|
type MiddlewareConfig struct {
|
|
RateLimitRPS float64 `mapstructure:"rate_limit_rps"`
|
|
RateLimitBurst int `mapstructure:"rate_limit_burst"`
|
|
MaxRequestSize int64 `mapstructure:"max_request_size"`
|
|
}
|
|
|
|
// CORSConfig holds CORS configuration
|
|
type CORSConfig struct {
|
|
AllowedOrigins []string `mapstructure:"allowed_origins"`
|
|
AllowedMethods []string `mapstructure:"allowed_methods"`
|
|
AllowedHeaders []string `mapstructure:"allowed_headers"`
|
|
MaxAge int `mapstructure:"max_age"`
|
|
}
|
|
|
|
// ErrorTrackingConfig holds error tracking configuration
|
|
type ErrorTrackingConfig struct {
|
|
Enabled bool `mapstructure:"enabled"`
|
|
Provider string `mapstructure:"provider"` // sentry, noop
|
|
DSN string `mapstructure:"dsn"` // Sentry DSN
|
|
Environment string `mapstructure:"environment"` // e.g., production, staging, development
|
|
Release string `mapstructure:"release"` // Application version/release
|
|
Debug bool `mapstructure:"debug"` // Enable debug mode
|
|
SampleRate float64 `mapstructure:"sample_rate"` // Error sample rate (0.0-1.0)
|
|
TracesSampleRate float64 `mapstructure:"traces_sample_rate"` // Traces sample rate (0.0-1.0)
|
|
}
|
|
|
|
// EventBrokerConfig contains configuration for the event broker
|
|
type EventBrokerConfig struct {
|
|
Enabled bool `mapstructure:"enabled"`
|
|
Provider string `mapstructure:"provider"` // memory, redis, nats, database
|
|
Mode string `mapstructure:"mode"` // sync, async
|
|
WorkerCount int `mapstructure:"worker_count"`
|
|
BufferSize int `mapstructure:"buffer_size"`
|
|
InstanceID string `mapstructure:"instance_id"`
|
|
Redis EventBrokerRedisConfig `mapstructure:"redis"`
|
|
NATS EventBrokerNATSConfig `mapstructure:"nats"`
|
|
Database EventBrokerDatabaseConfig `mapstructure:"database"`
|
|
RetryPolicy EventBrokerRetryPolicyConfig `mapstructure:"retry_policy"`
|
|
}
|
|
|
|
// EventBrokerRedisConfig contains Redis-specific configuration
|
|
type EventBrokerRedisConfig struct {
|
|
StreamName string `mapstructure:"stream_name"`
|
|
ConsumerGroup string `mapstructure:"consumer_group"`
|
|
MaxLen int64 `mapstructure:"max_len"`
|
|
Host string `mapstructure:"host"`
|
|
Port int `mapstructure:"port"`
|
|
Password string `mapstructure:"password"`
|
|
DB int `mapstructure:"db"`
|
|
}
|
|
|
|
// EventBrokerNATSConfig contains NATS-specific configuration
|
|
type EventBrokerNATSConfig struct {
|
|
URL string `mapstructure:"url"`
|
|
StreamName string `mapstructure:"stream_name"`
|
|
Subjects []string `mapstructure:"subjects"`
|
|
Storage string `mapstructure:"storage"` // file, memory
|
|
MaxAge time.Duration `mapstructure:"max_age"`
|
|
}
|
|
|
|
// EventBrokerDatabaseConfig contains database provider configuration
|
|
type EventBrokerDatabaseConfig struct {
|
|
TableName string `mapstructure:"table_name"`
|
|
Channel string `mapstructure:"channel"` // PostgreSQL NOTIFY channel name
|
|
PollInterval time.Duration `mapstructure:"poll_interval"`
|
|
}
|
|
|
|
// EventBrokerRetryPolicyConfig contains retry policy configuration
|
|
type EventBrokerRetryPolicyConfig struct {
|
|
MaxRetries int `mapstructure:"max_retries"`
|
|
InitialDelay time.Duration `mapstructure:"initial_delay"`
|
|
MaxDelay time.Duration `mapstructure:"max_delay"`
|
|
BackoffFactor float64 `mapstructure:"backoff_factor"`
|
|
}
|
|
|
|
// PathsConfig contains configuration for named file system paths
|
|
// This is a map of path name to file system path
|
|
// Example: "data_dir": "/var/lib/myapp/data"
|
|
type PathsConfig map[string]string
|