70 lines
2.1 KiB
Go
70 lines
2.1 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
// Config 保存进程运行所需的全部配置。
|
|
type Config struct {
|
|
Addr string // HTTP 监听地址
|
|
DBDriver string // 数据库驱动:sqlite(默认)/ mysql / postgres
|
|
DBDSN string // mysql / postgres 的连接串;sqlite 不使用
|
|
DBPath string // SQLite 文件路径
|
|
DataKey string // 敏感字段加密主密钥
|
|
JWTSecret string // JWT 签名密钥
|
|
AdminUsername string // 初始管理员用户名
|
|
AdminPassword string // 初始管理员密码,仅在该用户不存在时用于创建
|
|
PublicURL string // 面板公网基址(如 https://demo.example.com),日志回传引导创建用
|
|
}
|
|
|
|
// Load 从环境变量读取配置;DATA_KEY、JWT_SECRET 无默认值,缺失即失败。
|
|
func Load() (*Config, error) {
|
|
dataKey := os.Getenv("DATA_KEY")
|
|
if dataKey == "" {
|
|
return nil, fmt.Errorf("load config: DATA_KEY is required")
|
|
}
|
|
jwtSecret := os.Getenv("JWT_SECRET")
|
|
if jwtSecret == "" {
|
|
return nil, fmt.Errorf("load config: JWT_SECRET is required")
|
|
}
|
|
driver, dsn, err := dbFromEnv()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Config{
|
|
Addr: envOr("ADDR", ":8080"),
|
|
DBDriver: driver,
|
|
DBDSN: dsn,
|
|
DBPath: envOr("DB_PATH", "oci-portal.db"),
|
|
DataKey: dataKey,
|
|
JWTSecret: jwtSecret,
|
|
AdminUsername: envOr("ADMIN_USERNAME", "admin"),
|
|
AdminPassword: os.Getenv("ADMIN_PASSWORD"),
|
|
PublicURL: os.Getenv("PUBLIC_URL"),
|
|
}, nil
|
|
}
|
|
|
|
// dbFromEnv 读取并校验数据库驱动配置;外部库缺 DSN 视为配置错误,启动即失败。
|
|
func dbFromEnv() (driver, dsn string, err error) {
|
|
driver = envOr("DB_DRIVER", "sqlite")
|
|
dsn = os.Getenv("DB_DSN")
|
|
switch driver {
|
|
case "sqlite":
|
|
case "mysql", "postgres":
|
|
if dsn == "" {
|
|
return "", "", fmt.Errorf("load config: DB_DSN is required when DB_DRIVER=%s", driver)
|
|
}
|
|
default:
|
|
return "", "", fmt.Errorf("load config: unsupported DB_DRIVER %q (sqlite/mysql/postgres)", driver)
|
|
}
|
|
return driver, dsn, nil
|
|
}
|
|
|
|
func envOr(name, def string) string {
|
|
if v := os.Getenv(name); v != "" {
|
|
return v
|
|
}
|
|
return def
|
|
}
|