Files
xk-hy-transit-go/internal/config/config.go

96 lines
4.1 KiB
Go
Raw Normal View History

2026-05-22 08:06:07 +08:00
// Package config 从环境变量或 .env 加载配置main 启动时 godotenv.Load
//
// 与主流程的关系:
// - XK_API_* / XkAPICallbackPath → 步骤 ①②④⑤ 调云端 xk-api
// - HY_* → 步骤 ③ 监管报文 AES 加密与 HMAC 签名
// - FORWARD_BASE_URL → 步骤 ③ 内网 xk-hy-forward-go 入口(监管 JSON + PDF 上传双通道)
// - FILE_UPLOAD_VIA_FORWARD → true 时 PDF 上传走 forward不直连政务云 28211
// - MYSQL_DSN → 本机 hy_sync_job / hy_push_* 审计表
// - CRON_EXPR / SCHEDULE_TIME → serve 子命令定时
// - ANCHOR_OFFSET_DAYS → 未传 --date 时的默认锚定日(通常=昨日)
package config
import (
"os"
"strconv"
"strings"
)
// Config 监管中转运行所需的全部配置项。
type Config struct {
XkAPIBaseURL string // 云端根地址,如 https://api.xiaokang88.com
XkAPIToken string // 对应云端 HY_TRANSIT_API_TOKENHeader: X-Hy-Transit-Token
HyAppKey string // 监管平台 AppKey加密上报
HyAppSecret string // 监管平台 Secret签名
HyAesKey string // 监管平台 AES 密钥body 加密)
ForwardBaseURL string // xk-hy-forward-go 地址,如 http://192.168.1.10:8080
2026-05-22 08:42:14 +08:00
ForwardSharedSecret string // 与 forward-go FORWARD_SHARED_SECRET 一致Header X-Forward-Token
2026-05-22 08:06:07 +08:00
FileUploadViaForward bool // truePDF 上传经 forward /mng/file/auth/upload不直连政务云
MySQLDSN string // 本机中转库 DSNhy_transit_schema.sql
AnchorOffsetDays int // 锚定日 = 今天 - N 天,默认 1
XkAPICallbackPath string // 批量回调路径,默认 /api/hy/transit/batch/callback
CronExpr string // serve 用,默认 0 22 * * *
ScheduleTime string // HH:MM仅当未设 CRON_EXPR 时转为 cron
ChromePath string // 可选Chrome/Edge 路径,未设则自动探测
FileUploadInsecureSkipVerify bool // 文件上传 HTTPS 跳过证书校验(政务网)
2026-05-22 09:17:39 +08:00
LogWebAddr string // Web 控制台监听,默认 127.0.0.1:8765
LogWebAllowTest bool // 是否允许 Web 触发测试 sync
2026-05-22 08:06:07 +08:00
}
// Load 读取环境变量;未设置时使用默认值。
func Load() Config {
return Config{
XkAPIBaseURL: env("XK_API_BASE_URL", "https://api.xiaokang88.com"),
XkAPIToken: env("XK_API_TOKEN", ""),
HyAppKey: env("HY_APP_KEY", ""),
HyAppSecret: env("HY_APP_SECRET", ""),
HyAesKey: env("HY_AES_KEY", ""),
ForwardBaseURL: strings.TrimRight(env("FORWARD_BASE_URL", "http://127.0.0.1:8080"), "/"),
2026-05-22 08:42:14 +08:00
ForwardSharedSecret: env("FORWARD_SHARED_SECRET", ""),
2026-05-22 08:06:07 +08:00
FileUploadViaForward: envBool("FILE_UPLOAD_VIA_FORWARD", true),
MySQLDSN: env("MYSQL_DSN", "root:password@tcp(127.0.0.1:3306)/xk_hy_transit?parseTime=true&charset=utf8mb4"),
AnchorOffsetDays: envInt("ANCHOR_OFFSET_DAYS", 1),
XkAPICallbackPath: env("XK_API_CALLBACK_PATH", "/api/hy/transit/batch/callback"),
CronExpr: env("CRON_EXPR", "*/2 * * * *"),
ScheduleTime: env("SCHEDULE_TIME", ""),
ChromePath: env("CHROME_PATH", ""),
FileUploadInsecureSkipVerify: envBool("FILE_UPLOAD_INSECURE_SKIP_VERIFY", true),
2026-05-22 09:17:39 +08:00
LogWebAddr: env("LOG_WEB_ADDR", "127.0.0.1:8765"),
LogWebAllowTest: envBool("LOG_WEB_ALLOW_TEST", true),
2026-05-22 08:06:07 +08:00
}
}
func envBool(key string, def bool) bool {
v := strings.TrimSpace(strings.ToLower(os.Getenv(key)))
if v == "" {
return def
}
switch v {
case "1", "true", "yes", "on":
return true
case "0", "false", "no", "off":
return false
default:
return def
}
}
func env(key, def string) string {
if v := strings.TrimSpace(os.Getenv(key)); v != "" {
return v
}
return def
}
func envInt(key string, def int) int {
v := strings.TrimSpace(os.Getenv(key))
if v == "" {
return def
}
n, err := strconv.Atoi(v)
if err != nil {
return def
}
return n
}