2025-02-25 14:48:50 +08:00
|
|
|
|
package env
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"fmt"
|
2025-05-13 18:48:17 +08:00
|
|
|
|
"log/slog"
|
2025-05-23 18:59:53 +08:00
|
|
|
|
"net"
|
2025-02-25 14:48:50 +08:00
|
|
|
|
"os"
|
|
|
|
|
|
"strconv"
|
2025-05-23 18:59:53 +08:00
|
|
|
|
"strings"
|
2025-05-13 18:48:17 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/joho/godotenv"
|
2025-02-25 14:48:50 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var (
|
2025-05-22 14:52:31 +08:00
|
|
|
|
RunMode = "dev" // 运行模式,dev: 开发模式,prod: 生产模式
|
|
|
|
|
|
|
2025-05-16 15:13:16 +08:00
|
|
|
|
AppCtrlPort uint16 = 18080
|
|
|
|
|
|
AppDataPort uint16 = 18081
|
|
|
|
|
|
AppWebPort uint16 = 8848
|
|
|
|
|
|
AppLogMode = "dev"
|
|
|
|
|
|
AppExitTimeout = 5 // 等待服务停止的超时时间
|
|
|
|
|
|
AppDataTimeout = 10 // 等待数据通道连接的超时时间
|
|
|
|
|
|
AppUserTimeout = 10 // 等待用户发送数据的超时时间(端口复用需要分析协议,如果用户长期不发送数据,将会阻塞分析协程)
|
2025-05-13 18:48:17 +08:00
|
|
|
|
|
2025-05-23 18:59:53 +08:00
|
|
|
|
AuthWhitelist []net.IP // 全局白名单,可以将白名单 IP 视为一个可信任代理
|
|
|
|
|
|
|
2025-05-13 18:48:17 +08:00
|
|
|
|
ClientId string
|
|
|
|
|
|
ClientSecret string
|
2025-02-25 14:48:50 +08:00
|
|
|
|
|
2025-05-15 15:56:20 +08:00
|
|
|
|
RedisHost = "localhost"
|
|
|
|
|
|
RedisPort = "6379"
|
|
|
|
|
|
RedisDb = 0
|
|
|
|
|
|
RedisPass = ""
|
2025-05-13 18:48:17 +08:00
|
|
|
|
|
2025-05-14 15:13:44 +08:00
|
|
|
|
EndpointOnline string
|
|
|
|
|
|
EndpointOffline string
|
|
|
|
|
|
EndpointAssigned string
|
2025-02-25 14:48:50 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func Init() {
|
2025-05-13 18:48:17 +08:00
|
|
|
|
var err = godotenv.Load()
|
2025-02-25 14:48:50 +08:00
|
|
|
|
if err != nil {
|
2025-05-13 18:48:17 +08:00
|
|
|
|
slog.Debug("没有本地环境变量文件")
|
2025-02-25 14:48:50 +08:00
|
|
|
|
}
|
2025-05-13 18:48:17 +08:00
|
|
|
|
var value string
|
2025-02-25 14:48:50 +08:00
|
|
|
|
|
2025-05-22 14:52:31 +08:00
|
|
|
|
value = os.Getenv("RUN_MODE")
|
|
|
|
|
|
switch value {
|
|
|
|
|
|
case "dev", "prod":
|
|
|
|
|
|
RunMode = value
|
|
|
|
|
|
case "":
|
|
|
|
|
|
default:
|
|
|
|
|
|
panic(fmt.Sprintf("环境变量 RUN_MODE 格式错误: %s", value))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-13 18:48:17 +08:00
|
|
|
|
value = os.Getenv("APP_CTRL_PORT")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
appCtrlPort, err := strconv.Atoi(value)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(fmt.Sprintf("环境变量 APP_CTRL_PORT 格式错误: %v", err))
|
|
|
|
|
|
}
|
|
|
|
|
|
AppCtrlPort = uint16(appCtrlPort)
|
2025-02-25 14:48:50 +08:00
|
|
|
|
}
|
2025-05-13 18:48:17 +08:00
|
|
|
|
|
|
|
|
|
|
value = os.Getenv("APP_DATA_PORT")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
appDataPort, err := strconv.Atoi(value)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(fmt.Sprintf("环境变量 APP_DATA_PORT 格式错误: %v", err))
|
|
|
|
|
|
}
|
|
|
|
|
|
AppDataPort = uint16(appDataPort)
|
2025-02-25 14:48:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-13 18:48:17 +08:00
|
|
|
|
value = os.Getenv("APP_WEB_PORT")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
appWebPort, err := strconv.Atoi(value)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(fmt.Sprintf("环境变量 APP_WEB_PORT 格式错误: %v", err))
|
|
|
|
|
|
}
|
|
|
|
|
|
AppWebPort = uint16(appWebPort)
|
2025-03-08 10:59:31 +08:00
|
|
|
|
}
|
2025-05-13 18:48:17 +08:00
|
|
|
|
|
|
|
|
|
|
value = os.Getenv("APP_LOG_MODE")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
AppLogMode = value
|
2025-03-08 10:59:31 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-16 15:13:16 +08:00
|
|
|
|
value = os.Getenv("APP_EXIT_TIMEOUT")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
appExitTimeout, err := strconv.Atoi(value)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(fmt.Sprintf("环境变量 APP_EXIT_TIMEOUT 格式错误: %v", err))
|
|
|
|
|
|
}
|
|
|
|
|
|
AppExitTimeout = appExitTimeout
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
value = os.Getenv("APP_DATA_TIMEOUT")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
appDataTimeout, err := strconv.Atoi(value)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(fmt.Sprintf("环境变量 APP_DATA_TIMEOUT 格式错误: %v", err))
|
|
|
|
|
|
}
|
|
|
|
|
|
AppDataTimeout = appDataTimeout
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-23 18:59:53 +08:00
|
|
|
|
value = os.Getenv("APP_USER_TIMEOUT")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
appUserTimeout, err := strconv.Atoi(value)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(fmt.Sprintf("环境变量 APP_USER_TIMEOUT 格式错误: %v", err))
|
|
|
|
|
|
}
|
|
|
|
|
|
AppUserTimeout = appUserTimeout
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
value = os.Getenv("AUTH_WHITELIST")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
ips := strings.Split(value, ",")
|
|
|
|
|
|
for _, ip := range ips {
|
|
|
|
|
|
ip = strings.TrimSpace(ip)
|
|
|
|
|
|
if ip == "" {
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
parsedIP := net.ParseIP(ip)
|
|
|
|
|
|
if parsedIP == nil {
|
|
|
|
|
|
panic(fmt.Sprintf("环境变量 AUTH_WHITELIST 格式错误: %s", ip))
|
|
|
|
|
|
}
|
|
|
|
|
|
AuthWhitelist = append(AuthWhitelist, parsedIP)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-13 18:48:17 +08:00
|
|
|
|
value = os.Getenv("CLIENT_ID")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
ClientId = value
|
|
|
|
|
|
} else {
|
|
|
|
|
|
panic("环境变量 CLIENT_ID 未设置")
|
2025-03-05 10:20:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-13 18:48:17 +08:00
|
|
|
|
value = os.Getenv("CLIENT_SECRET")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
ClientSecret = value
|
|
|
|
|
|
} else {
|
|
|
|
|
|
panic("环境变量 CLIENT_SECRET 未设置")
|
2025-02-25 14:48:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-15 15:56:20 +08:00
|
|
|
|
value = os.Getenv("REDIS_HOST")
|
2025-05-13 18:48:17 +08:00
|
|
|
|
if value != "" {
|
2025-05-15 15:56:20 +08:00
|
|
|
|
RedisHost = value
|
2025-02-25 14:48:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-15 15:56:20 +08:00
|
|
|
|
value = os.Getenv("REDIS_PORT")
|
2025-05-13 18:48:17 +08:00
|
|
|
|
if value != "" {
|
2025-05-15 15:56:20 +08:00
|
|
|
|
RedisPort = value
|
2025-02-25 14:48:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-15 15:56:20 +08:00
|
|
|
|
value = os.Getenv("REDIS_DB")
|
2025-05-13 18:48:17 +08:00
|
|
|
|
if value != "" {
|
2025-05-15 15:56:20 +08:00
|
|
|
|
redisDb, err := strconv.Atoi(value)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
panic(fmt.Sprintf("环境变量 REDIS_DB 格式错误: %v", err))
|
|
|
|
|
|
}
|
|
|
|
|
|
RedisDb = redisDb
|
2025-02-25 14:48:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-15 15:56:20 +08:00
|
|
|
|
value = os.Getenv("REDIS_PASS")
|
2025-05-13 18:48:17 +08:00
|
|
|
|
if value != "" {
|
2025-05-15 15:56:20 +08:00
|
|
|
|
RedisPass = value
|
2025-05-13 18:48:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
value = os.Getenv("ENDPOINT_ONLINE")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
EndpointOnline = value
|
|
|
|
|
|
} else {
|
|
|
|
|
|
panic("环境变量 ENDPOINT_ONLINE 未设置")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
value = os.Getenv("ENDPOINT_OFFLINE")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
EndpointOffline = value
|
|
|
|
|
|
} else {
|
|
|
|
|
|
panic("环境变量 ENDPOINT_OFFLINE 未设置")
|
2025-02-25 14:48:50 +08:00
|
|
|
|
}
|
2025-05-14 15:13:44 +08:00
|
|
|
|
value = os.Getenv("ENDPOINT_ASSIGNED")
|
|
|
|
|
|
if value != "" {
|
|
|
|
|
|
EndpointAssigned = value
|
|
|
|
|
|
} else {
|
|
|
|
|
|
panic("环境变量 ENDPOINT_ASSIGNED 未设置")
|
|
|
|
|
|
}
|
2025-02-25 14:48:50 +08:00
|
|
|
|
}
|