package config import ( "os" "strconv" ) type Config struct { Host string Port int TempDir string MaxUploadMB int64 MaxFiles int DefaultWorkers int MaxWorkers int DefaultTimeoutS int MaxTimeoutS int RetentionMinutes int MaxZipTotalMB int64 MaxZipFileMB int64 DebugDelayMS int } func Default() Config { return Config{ Host: "0.0.0.0", Port: 8001, TempDir: "/tmp/qr-scanner", MaxUploadMB: 100, MaxFiles: 10000, DefaultWorkers: 4, MaxWorkers: 32, DefaultTimeoutS: 30, MaxTimeoutS: 60, RetentionMinutes: 30, MaxZipTotalMB: 1024, MaxZipFileMB: 50, DebugDelayMS: 0, } } func (c Config) WithEnv() Config { /* 环境变量说明(用于本地开发/部署时覆盖默认配置): - QR_SCANNER_PORT:服务监听端口 - QR_SCANNER_TEMP_DIR:任务临时目录根路径(任务结束后按保留期清理) - QR_SCANNER_RETENTION_MINUTES:终态任务保留分钟数(completed/canceled/failed) - QR_SCANNER_DEFAULT_WORKERS:默认并发数(scan 请求未传 concurrency 时使用) - QR_SCANNER_DEFAULT_TIMEOUT_S:默认单张图片超时秒数(scan 请求未传 timeout 时使用) - QR_SCANNER_DEBUG_DELAY_MS:调试延时(每处理完一张图片额外 sleep,用于观察进度条/SSE) */ c.Port = envInt("QR_SCANNER_PORT", c.Port) c.TempDir = envString("QR_SCANNER_TEMP_DIR", c.TempDir) c.RetentionMinutes = envInt("QR_SCANNER_RETENTION_MINUTES", c.RetentionMinutes) c.DefaultWorkers = envInt("QR_SCANNER_DEFAULT_WORKERS", c.DefaultWorkers) c.DefaultTimeoutS = envInt("QR_SCANNER_DEFAULT_TIMEOUT_S", c.DefaultTimeoutS) c.DebugDelayMS = envInt("QR_SCANNER_DEBUG_DELAY_MS", c.DebugDelayMS) return c } func envString(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } func envInt(key string, fallback int) int { if v := os.Getenv(key); v != "" { if n, err := strconv.Atoi(v); err == nil { return n } } return fallback }