diff --git a/backend/config.yaml b/backend/config.yaml index 0aafbf6..f31a9cb 100644 --- a/backend/config.yaml +++ b/backend/config.yaml @@ -60,6 +60,21 @@ auth: access_ttl: 120 # Access Token 过期时间(分钟) refresh_ttl: 10080 # Refresh Token 过期时间(分钟),7 天 +ratelimit: + enabled: false # 是否启用限流 + # WebSocket query 消息限流(核心,控制 AI 成本) + query: + capacity: 10 # 突发容量:允许连续发 10 个 query + rate: 0.2 # 填充速率:每 5 秒补充 1 个令牌 + # REST API 登录限流(防暴力破解) + login: + capacity: 5 # 突发容量:允许连续 5 次登录尝试 + rate: 0.1 # 填充速率:每 10 秒补充 1 次 + # REST API 注册限流 + register: + capacity: 3 # 突发容量:允许连续 3 次注册 + rate: 0.05 # 填充速率:每 20 秒补充 1 次 + log: level: info # debug / info / warn / error format: console # console / json diff --git a/backend/internal/config/config.go b/backend/internal/config/config.go index 2d67907..dd62719 100644 --- a/backend/internal/config/config.go +++ b/backend/internal/config/config.go @@ -10,14 +10,15 @@ import ( // Config 应用配置。 type Config struct { - App AppConfig `mapstructure:"app"` - Server ServerConfig `mapstructure:"server"` - Session SessionConfig `mapstructure:"session"` - Redis RedisConfig `mapstructure:"redis"` - AI AIConfig `mapstructure:"ai"` - Storage StorageConfig `mapstructure:"storage"` - Log LogConfig `mapstructure:"log"` - Auth AuthConfig `mapstructure:"auth"` + App AppConfig `mapstructure:"app"` + Server ServerConfig `mapstructure:"server"` + Session SessionConfig `mapstructure:"session"` + Redis RedisConfig `mapstructure:"redis"` + AI AIConfig `mapstructure:"ai"` + Storage StorageConfig `mapstructure:"storage"` + Log LogConfig `mapstructure:"log"` + Auth AuthConfig `mapstructure:"auth"` + RateLimit RateLimitConfig `mapstructure:"ratelimit"` } // SessionConfig 会话管理配置。 @@ -120,6 +121,20 @@ type AuthConfig struct { RefreshTTL int `mapstructure:"refresh_ttl"` // Refresh Token 过期时间(分钟),默认 10080(7天) } +// RateLimitConfig 限流配置。 +type RateLimitConfig struct { + Enabled bool `mapstructure:"enabled"` + Query BucketConfig `mapstructure:"query"` + Login BucketConfig `mapstructure:"login"` + Register BucketConfig `mapstructure:"register"` +} + +// BucketConfig 令牌桶配置。 +type BucketConfig struct { + Capacity int `mapstructure:"capacity"` // 桶容量(突发上限) + Rate float64 `mapstructure:"rate"` // 每秒填充令牌数 +} + // Load 加载配置。优先级:环境变量 > config.{env}.yaml > config.yaml > 默认值。 // workDir 为项目根目录或 backend 目录,用于定位 .env 和 config.yaml。 func Load(workDir string) (*Config, error) { @@ -218,6 +233,15 @@ func setDefaults(v *viper.Viper) { // log v.SetDefault("log.level", "info") v.SetDefault("log.format", "console") + + // ratelimit + v.SetDefault("ratelimit.enabled", false) + v.SetDefault("ratelimit.query.capacity", 10) + v.SetDefault("ratelimit.query.rate", 0.2) + v.SetDefault("ratelimit.login.capacity", 5) + v.SetDefault("ratelimit.login.rate", 0.1) + v.SetDefault("ratelimit.register.capacity", 3) + v.SetDefault("ratelimit.register.rate", 0.05) } // bindEnvVars 显式绑定敏感信息环境变量。