yao/config.go
2021-09-07 11:09:17 +08:00

102 lines
4.3 KiB
Go

package main
import (
"io"
"log"
"os"
"github.com/caarlos0/env/v6"
"github.com/joho/godotenv"
"github.com/yaoapp/gou/helper"
"github.com/yaoapp/kun/exception"
)
// Config 系统配置
type Config struct {
XiangConfig
Service ServiceConfig `json:"service,omitempty"`
Database DatabaseConfig `json:"database,omitempty"`
Storage StorageConfig `json:"storage,omitempty"`
JWT JWTConfig `json:"jwt,omitempty"`
Log LogConfig `json:"log,omitempty"`
}
// XiangConfig 象传应用引擎配置
type XiangConfig struct {
Mode string `json:"mode,omitempty" env:"XIANG_MODE" envDefault:"release"` // 象传引擎模式 debug/release/test
Source string `json:"source,omitempty" env:"XIANG_SOURCE" envDefault:"fs://."` // 源码路径(用于调试时载入数据)
Root string `json:"root,omitempty" env:"XIANG_ROOT" envDefault:"."` // 应用文件目录
RootAPI string `json:"root_api,omitempty" env:"XIANG_ROOT_API"` // 应用API文件目录
RootModel string `json:"root_model,omitempty" env:"XIANG_ROOT_MODEL"` // 应用模型文件目录
RootFLow string `json:"root_flow,omitempty" env:"XIANG_ROOT_FLOW"` // 应用工作流文件目录
RootPlugin string `json:"root_plugin,omitempty" env:"XIANG_ROOT_FLOW"` // 应用插件文件目录
}
// ServiceConfig 服务配置
type ServiceConfig struct {
Debug bool `json:"debug,omitempty" env:"XIANG_SERVICE_DEBUG" envDefault:"false"` // DEBUG 开关
HTTPS bool `json:"https,omitempty" env:"XIANG_SERVICE_HTTPS" envDefault:"false"` // HTTPS 开关
Cert string `json:"cert,omitempty" env:"XIANG_SERVICE_CERT"` // HTTPS 证书
Key string `json:"key,omitempty" env:"XIANG_SERVICE_KEY"` // HTTPS 证书密钥
Allow []string `json:"allow,omitempty" env:"XIANG_SERVICE_ALLOW" envSeparator:"|"` // 跨域访问域名列表
Host string `json:"host,omitempty" env:"XIANG_SERVICE_HOST" envDefault:"127.0.0.1"` // 服务监听IP
Port int `json:"port,omitempty" env:"XIANG_SERVICE_PORT" envDefault:"5099"` // 服务监听端口
}
// DatabaseConfig 数据库配置
type DatabaseConfig struct {
Debug bool `json:"debug,omitempty" env:"XIANG_DB_DEBUG" envDefault:"false"` // DEBUG 开关
Primary []string `json:"primary,omitempty" env:"XIANG_DB_PRIMARY" envSeparator:"|"` // 主库连接DSN
Secondary []string `json:"secondary,omitempty" env:"XIANG_DB_SECONDARY" envSeparator:"|"` // 从库连接DSN
AESKey string `json:"aeskey,omitempty" env:"XIANG_DB_AESKEY"` // 加密存储KEY
}
// StorageConfig 存储配置
type StorageConfig struct {
Debug bool `json:"debug,omitempty" env:"XIANG_STOR_DEBUG" envDefault:"false"` // DEBUG 开关
Path string `json:"path,omitempty" env:"XIANG_STOR_PATH" envDefault:"fs:///data/xiang"` // 数据存储目录
}
// JWTConfig JWT配置
type JWTConfig struct {
Debug bool `json:"debug,omitempty" env:"XIANG_JWT_DEBUG" envDefault:"false"` // DEBUG 开关
Secret string `json:"secret,omitempty" env:"XIANG_JWT_SECRET"` // JWT 密钥
}
// LogConfig 日志配置
type LogConfig struct {
Access string `json:"access,omitempty" env:"XIANG_LOG_ACCESS" envDefault:"os://stdout"` // 服务访问日志
Error string `json:"error,omitempty" env:"XIANG_LOG_ERROR" envDefault:"os://stderr"` // 服务错误日志
DB string `json:"database,omitempty" env:"XIANG_LOG_DB" envDefault:"os://stdout"` // 数据库日志
Plugin string `json:"plugin,omitempty" env:"XIANG_LOG_PLUGIN" envDefault:"os://stdout"` // 插件日志
}
// NewConfig 创建配置文件
func NewConfig() Config {
filename := os.Getenv("XIANG_ENV_FILE")
if filename == "" {
filename = ".env"
}
err := godotenv.Load(filename)
if err != nil {
log.Fatalf("读取环境配置文件%s出错 %s\n", filename, err.Error())
}
cfg := Config{}
if err := env.Parse(&cfg); err != nil {
exception.New("解析配置文件出错 %s", 500, err.Error()).Throw()
}
return cfg
}
// NewConfigFrom 创建配置文件
func NewConfigFrom(input io.Reader) Config {
cfg := Config{}
err := helper.UnmarshalFile(input, &cfg)
if err != nil {
exception.New("解析配置文件出错 %s", 500, err.Error()).Throw()
}
return cfg
}