Files
kefu_cloud/server/internal/config/config.go
T
yml2213 ec2f12c6ed 实现 MinIO 对象存储图片流水线(可迁移 OSS)
- 新增 S3 兼容 Storage 抽象与 MinIO 实现,compose 启动 MinIO
- 上传接口:校验 → 缩放 → WebP → 主图/缩略图入库
- 消息图片 content 改为对象 URL,拒绝 base64
- 工作台/访客端改为先上传再发消息
2026-07-15 12:21:31 +08:00

117 lines
2.7 KiB
Go

package config
import (
"os"
"strconv"
"time"
)
type Config struct {
Server ServerConfig
Database DatabaseConfig
JWT JWTConfig
Storage StorageConfig
}
type ServerConfig struct {
Port string
Mode string
}
type DatabaseConfig struct {
Host string
Port string
User string
Password string
Name string
SSLMode string
}
type JWTConfig struct {
Secret string
ExpireTime time.Duration
}
// StorageConfig S3 兼容对象存储(MinIO / OSS / COS / S3 共用字段)
type StorageConfig struct {
Endpoint string // 如 localhost:9000 或 oss-cn-hangzhou.aliyuncs.com
AccessKey string
SecretKey string
Bucket string
UseSSL bool
Region string
PublicBase string // 浏览器可访问前缀,如 http://localhost:9000/kefu
MaxUploadMB int
MaxImageEdge int // 最长边像素
WebPQuality float32
}
func Load() *Config {
return &Config{
Server: ServerConfig{
Port: getEnv("SERVER_PORT", "8080"),
Mode: getEnv("GIN_MODE", "debug"),
},
Database: DatabaseConfig{
Host: getEnv("DB_HOST", "localhost"),
Port: getEnv("DB_PORT", "5433"),
User: getEnv("DB_USER", "postgres"),
Password: getEnv("DB_PASSWORD", "postgres"),
Name: getEnv("DB_NAME", "kefu_sys"),
SSLMode: getEnv("DB_SSLMODE", "disable"),
},
JWT: JWTConfig{
Secret: getEnv("JWT_SECRET", "kefu-sys-secret-key"),
ExpireTime: 24 * time.Hour,
},
Storage: StorageConfig{
Endpoint: getEnv("STORAGE_ENDPOINT", "localhost:9000"),
AccessKey: getEnv("STORAGE_ACCESS_KEY", "minioadmin"),
SecretKey: getEnv("STORAGE_SECRET_KEY", "minioadmin"),
Bucket: getEnv("STORAGE_BUCKET", "kefu"),
UseSSL: getEnvBool("STORAGE_USE_SSL", false),
Region: getEnv("STORAGE_REGION", "us-east-1"),
PublicBase: getEnv("STORAGE_PUBLIC_BASE_URL", "http://localhost:9000/kefu"),
MaxUploadMB: getEnvInt("STORAGE_MAX_UPLOAD_MB", 10),
MaxImageEdge: getEnvInt("STORAGE_MAX_IMAGE_EDGE", 1920),
WebPQuality: float32(getEnvInt("STORAGE_WEBP_QUALITY", 80)),
},
}
}
func (d *DatabaseConfig) DSN() string {
return "host=" + d.Host + " port=" + d.Port + " user=" + d.User +
" password=" + d.Password + " dbname=" + d.Name + " sslmode=" + d.SSLMode
}
func getEnv(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}
func getEnvBool(key string, fallback bool) bool {
v := os.Getenv(key)
if v == "" {
return fallback
}
b, err := strconv.ParseBool(v)
if err != nil {
return fallback
}
return b
}
func getEnvInt(key string, fallback int) int {
v := os.Getenv(key)
if v == "" {
return fallback
}
n, err := strconv.Atoi(v)
if err != nil {
return fallback
}
return n
}