config.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package config
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "fmt"
  6. "github.com/spf13/viper"
  7. )
  8. type AppConfig struct {
  9. AppEnv string
  10. AppPort string
  11. RedisAddr string
  12. MySQLDSN string
  13. PostgresDSN string
  14. MongoDSN string
  15. MinIoEndpoint string
  16. MinioAccessKey string
  17. MinioSecretKey string
  18. MinioBucketName string
  19. AsynqmonPort string
  20. }
  21. type FwhApiConfig struct {
  22. FwhEnergy string
  23. FwhOss string
  24. FwhUser string
  25. FwhPassword string
  26. }
  27. type FwhMqttConfig struct {
  28. FwhMqttBroker string
  29. FwhMqttCaUrl string
  30. FwhMqttCertUrl string
  31. FwhMqttKeyUrl string
  32. }
  33. type PlaneApiConfig struct {
  34. Host string
  35. ApiKey string
  36. WorkspaceSlug string
  37. ProjectId string
  38. LabelBugId string
  39. LabelFeatureId string
  40. }
  41. type PlaneWebApiConfig struct {
  42. Host string
  43. Email string
  44. Password string
  45. WorkspaceSlug string
  46. ProjectId string
  47. LabelBugId string
  48. LabelFeatureId string
  49. LabelFeedbackId string
  50. }
  51. type KiroConfig struct {
  52. // RunAsUser 指定拉起 kiro-cli 子进程时降权到的系统用户名。
  53. // 为空时表示不降权,沿用后台服务自身的运行用户。
  54. RunAsUser string
  55. // Home 指定拉起 kiro-cli 子进程时使用的 HOME 目录(即 $HOME 环境变量)。
  56. // kiro-cli 依赖 HOME 定位其配置与凭证。为空时回退到降权用户的家目录,
  57. // 若也无法推导则使用默认值。
  58. Home string
  59. // DebugLog 为调试日志总开关(宏开关)。
  60. // 开启后,拉起 kiro-cli 子进程时注入 KIRO_LOG_LEVEL=debug,
  61. // 让 kiro-cli 输出 debug 级日志,便于问题排查。
  62. // 由环境变量 KIRO_DEBUG_LOG 控制(true/1/on 开启,默认关闭)。
  63. DebugLog bool
  64. }
  65. type Config struct {
  66. App AppConfig
  67. FwhApi FwhApiConfig
  68. FwhTestApi FwhApiConfig
  69. FwhMqtt FwhMqttConfig
  70. FwhTestMqtt FwhMqttConfig
  71. PlaneApi PlaneApiConfig
  72. PlaneWebApi PlaneWebApiConfig
  73. Kiro KiroConfig
  74. }
  75. // 需先执行LoadConfig后才能读取ENV
  76. // var APP_ENV string = "dev"
  77. // var FWH_ENERGY string = "energy.franklinwh.com"
  78. // var FWH_OSS string = "oss.franklinwh.com"
  79. // var FWH_USER string = ""
  80. // var FWH_PASSWORD string = "" // MD5 - PASSWORD
  81. // LoadConfig 读取配置文件和环境变量
  82. func LoadConfig() (*Config, error) {
  83. v := viper.New()
  84. // 默认值(避免缺省时崩溃)
  85. // APP
  86. v.SetDefault("APP_ENV", "dev")
  87. v.SetDefault("APP_PORT", "8080")
  88. v.SetDefault("REDIS_ADDR", "localhost:6379")
  89. v.SetDefault("MYSQL_DSN", "")
  90. v.SetDefault("POSTGRES_DSN", "host=localhost user=fwh_toolbox password=fwh_toolbox dbname=fwh_toolbox_db port=5432 sslmode=disable")
  91. v.SetDefault("MONGO_DSN", "mongodb://localhost:27017/FwhToolboxDbDev")
  92. v.SetDefault("MINIO_ENDPOINT", "localhost:9198")
  93. v.SetDefault("MINIO_ACCESS_KEY", "fwh-toolbox")
  94. v.SetDefault("MINIO_SECRET_KEY", "fwh-toolbox")
  95. v.SetDefault("MINIO_BUCKET_NAME", "fwh-toolbox")
  96. v.SetDefault("ASYNQMON_PORT", "8081")
  97. // FWH API
  98. v.SetDefault("FWH_ENERGY", "energy.franklinwh.com")
  99. v.SetDefault("FWH_OSS", "oss.franklinwh.com")
  100. // FWH MQTT
  101. // 多文件路径支持
  102. paths := []string{"./.env", "./config.env"}
  103. var readErr error
  104. for _, path := range paths {
  105. v.SetConfigFile(path)
  106. if err := v.ReadInConfig(); err == nil {
  107. fmt.Printf("✅ Using config file: %s\n", path)
  108. readErr = nil
  109. break
  110. } else {
  111. readErr = err
  112. }
  113. }
  114. // 环境变量覆盖文件配置
  115. v.AutomaticEnv()
  116. // 如果两个文件都没读到,也没关系,直接用默认值
  117. if readErr != nil {
  118. fmt.Println("⚠️ No config file found, using default values & environment variables")
  119. }
  120. // APP_ENV = v.GetString("APP_ENV")
  121. // FWH_ENERGY = v.GetString("FWH_ENERGY")
  122. // FWH_OSS = v.GetString("FWH_OSS")
  123. // FWH_USER = v.GetString("FWH_USER")
  124. // FWH_PASSWORD = v.GetString("FWH_PASSWORD")
  125. h := md5.New()
  126. h.Write([]byte(v.GetString("FWH_PASSWORD")))
  127. fwhApiPassword := hex.EncodeToString(h.Sum(nil))
  128. h = md5.New()
  129. h.Write([]byte(v.GetString("FWH_TEST_PASSWORD")))
  130. fwhTestApiPassword := hex.EncodeToString(h.Sum(nil))
  131. return &Config{
  132. App: AppConfig{
  133. AppEnv: v.GetString("APP_ENV"),
  134. AppPort: v.GetString("APP_PORT"),
  135. RedisAddr: v.GetString("REDIS_ADDR"),
  136. MySQLDSN: v.GetString("MYSQL_DSN"),
  137. PostgresDSN: v.GetString("POSTGRES_DSN"),
  138. MongoDSN: v.GetString("MONGO_DSN"),
  139. MinIoEndpoint: v.GetString("MINIO_ENDPOINT"),
  140. MinioAccessKey: v.GetString("MINIO_ACCESS_KEY"),
  141. MinioSecretKey: v.GetString("MINIO_SECRET_KEY"),
  142. MinioBucketName: v.GetString("MINIO_BUCKET_NAME"),
  143. AsynqmonPort: v.GetString("ASYNQMON_PORT"),
  144. },
  145. FwhApi: FwhApiConfig{
  146. FwhEnergy: v.GetString("FWH_ENERGY"),
  147. FwhOss: v.GetString("FWH_OSS"),
  148. FwhUser: v.GetString("FWH_USER"),
  149. FwhPassword: fwhApiPassword,
  150. },
  151. FwhTestApi: FwhApiConfig{
  152. FwhEnergy: v.GetString("FWH_TEST_ENERGY"),
  153. FwhOss: v.GetString("FWH_TEST_OSS"),
  154. FwhUser: v.GetString("FWH_TEST_USER"),
  155. FwhPassword: fwhTestApiPassword,
  156. },
  157. FwhMqtt: FwhMqttConfig{
  158. FwhMqttBroker: v.GetString("FWH_MQTT_BROKER"),
  159. FwhMqttCaUrl: v.GetString("FWH_MQTT_CA"),
  160. FwhMqttCertUrl: v.GetString("FWH_MQTT_CERT"),
  161. FwhMqttKeyUrl: v.GetString("FWH_MQTT_KEY"),
  162. },
  163. FwhTestMqtt: FwhMqttConfig{
  164. FwhMqttBroker: v.GetString("FWH_TEST_MQTT_BROKER"),
  165. FwhMqttCaUrl: v.GetString("FWH_TEST_MQTT_CA"),
  166. FwhMqttCertUrl: v.GetString("FWH_TEST_MQTT_CERT"),
  167. FwhMqttKeyUrl: v.GetString("FWH_TEST_MQTT_KEY"),
  168. },
  169. PlaneApi: PlaneApiConfig{
  170. Host: v.GetString("PLANE_HOST"),
  171. ApiKey: v.GetString("PLANE_API_KEY"),
  172. WorkspaceSlug: v.GetString("PLANE_WORKSPACE_SLUG"),
  173. ProjectId: v.GetString("PLANE_PROJECT_ID"),
  174. LabelBugId: v.GetString("PLANE_LABEL_BUG"),
  175. LabelFeatureId: v.GetString("PLANE_LABEL_FEATURE"),
  176. },
  177. PlaneWebApi: PlaneWebApiConfig{
  178. Host: v.GetString("PLANE_WEB_HOST"),
  179. Email: v.GetString("PLANE_WEB_EMAIL"),
  180. Password: v.GetString("PLANE_WEB_PASSWORD"),
  181. WorkspaceSlug: v.GetString("PLANE_WEB_WORKSPACE_SLUG"),
  182. ProjectId: v.GetString("PLANE_WEB_PROJECT_ID"),
  183. LabelBugId: v.GetString("PLANE_WEB_LABEL_BUG"),
  184. LabelFeatureId: v.GetString("PLANE_WEB_LABEL_FEATURE"),
  185. LabelFeedbackId: v.GetString("PLANE_WEB_LABEL_FEEDBACK"),
  186. },
  187. Kiro: KiroConfig{
  188. RunAsUser: v.GetString("KIRO_RUN_AS_USER"),
  189. Home: v.GetString("KIRO_HOME"),
  190. DebugLog: v.GetBool("KIRO_DEBUG_LOG"),
  191. },
  192. }, nil
  193. }