config.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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 Config struct {
  52. App AppConfig
  53. FwhApi FwhApiConfig
  54. FwhTestApi FwhApiConfig
  55. FwhMqtt FwhMqttConfig
  56. FwhTestMqtt FwhMqttConfig
  57. PlaneApi PlaneApiConfig
  58. PlaneWebApi PlaneWebApiConfig
  59. }
  60. // 需先执行LoadConfig后才能读取ENV
  61. // var APP_ENV string = "dev"
  62. // var FWH_ENERGY string = "energy.franklinwh.com"
  63. // var FWH_OSS string = "oss.franklinwh.com"
  64. // var FWH_USER string = ""
  65. // var FWH_PASSWORD string = "" // MD5 - PASSWORD
  66. // LoadConfig 读取配置文件和环境变量
  67. func LoadConfig() (*Config, error) {
  68. v := viper.New()
  69. // 默认值(避免缺省时崩溃)
  70. // APP
  71. v.SetDefault("APP_ENV", "dev")
  72. v.SetDefault("APP_PORT", "8080")
  73. v.SetDefault("REDIS_ADDR", "localhost:6379")
  74. v.SetDefault("MYSQL_DSN", "")
  75. v.SetDefault("POSTGRES_DSN", "host=localhost user=fwh_toolbox password=fwh_toolbox dbname=fwh_toolbox_db port=5432 sslmode=disable")
  76. v.SetDefault("MONGO_DSN", "mongodb://localhost:27017/FwhToolboxDbDev")
  77. v.SetDefault("MINIO_ENDPOINT", "localhost:9198")
  78. v.SetDefault("MINIO_ACCESS_KEY", "fwh-toolbox")
  79. v.SetDefault("MINIO_SECRET_KEY", "fwh-toolbox")
  80. v.SetDefault("MINIO_BUCKET_NAME", "fwh-toolbox")
  81. v.SetDefault("ASYNQMON_PORT", "8081")
  82. // FWH API
  83. v.SetDefault("FWH_ENERGY", "energy.franklinwh.com")
  84. v.SetDefault("FWH_OSS", "oss.franklinwh.com")
  85. // FWH MQTT
  86. // 多文件路径支持
  87. paths := []string{"./.env", "./config.env"}
  88. var readErr error
  89. for _, path := range paths {
  90. v.SetConfigFile(path)
  91. if err := v.ReadInConfig(); err == nil {
  92. fmt.Printf("✅ Using config file: %s\n", path)
  93. readErr = nil
  94. break
  95. } else {
  96. readErr = err
  97. }
  98. }
  99. // 环境变量覆盖文件配置
  100. v.AutomaticEnv()
  101. // 如果两个文件都没读到,也没关系,直接用默认值
  102. if readErr != nil {
  103. fmt.Println("⚠️ No config file found, using default values & environment variables")
  104. }
  105. // APP_ENV = v.GetString("APP_ENV")
  106. // FWH_ENERGY = v.GetString("FWH_ENERGY")
  107. // FWH_OSS = v.GetString("FWH_OSS")
  108. // FWH_USER = v.GetString("FWH_USER")
  109. // FWH_PASSWORD = v.GetString("FWH_PASSWORD")
  110. h := md5.New()
  111. h.Write([]byte(v.GetString("FWH_PASSWORD")))
  112. fwhApiPassword := hex.EncodeToString(h.Sum(nil))
  113. h = md5.New()
  114. h.Write([]byte(v.GetString("FWH_TEST_PASSWORD")))
  115. fwhTestApiPassword := hex.EncodeToString(h.Sum(nil))
  116. return &Config{
  117. App: AppConfig{
  118. AppEnv: v.GetString("APP_ENV"),
  119. AppPort: v.GetString("APP_PORT"),
  120. RedisAddr: v.GetString("REDIS_ADDR"),
  121. MySQLDSN: v.GetString("MYSQL_DSN"),
  122. PostgresDSN: v.GetString("POSTGRES_DSN"),
  123. MongoDSN: v.GetString("MONGO_DSN"),
  124. MinIoEndpoint: v.GetString("MINIO_ENDPOINT"),
  125. MinioAccessKey: v.GetString("MINIO_ACCESS_KEY"),
  126. MinioSecretKey: v.GetString("MINIO_SECRET_KEY"),
  127. MinioBucketName: v.GetString("MINIO_BUCKET_NAME"),
  128. AsynqmonPort: v.GetString("ASYNQMON_PORT"),
  129. },
  130. FwhApi: FwhApiConfig{
  131. FwhEnergy: v.GetString("FWH_ENERGY"),
  132. FwhOss: v.GetString("FWH_OSS"),
  133. FwhUser: v.GetString("FWH_USER"),
  134. FwhPassword: fwhApiPassword,
  135. },
  136. FwhTestApi: FwhApiConfig{
  137. FwhEnergy: v.GetString("FWH_TEST_ENERGY"),
  138. FwhOss: v.GetString("FWH_TEST_OSS"),
  139. FwhUser: v.GetString("FWH_TEST_USER"),
  140. FwhPassword: fwhTestApiPassword,
  141. },
  142. FwhMqtt: FwhMqttConfig{
  143. FwhMqttBroker: v.GetString("FWH_MQTT_BROKER"),
  144. FwhMqttCaUrl: v.GetString("FWH_MQTT_CA"),
  145. FwhMqttCertUrl: v.GetString("FWH_MQTT_CERT"),
  146. FwhMqttKeyUrl: v.GetString("FWH_MQTT_KEY"),
  147. },
  148. FwhTestMqtt: FwhMqttConfig{
  149. FwhMqttBroker: v.GetString("FWH_TEST_MQTT_BROKER"),
  150. FwhMqttCaUrl: v.GetString("FWH_TEST_MQTT_CA"),
  151. FwhMqttCertUrl: v.GetString("FWH_TEST_MQTT_CERT"),
  152. FwhMqttKeyUrl: v.GetString("FWH_TEST_MQTT_KEY"),
  153. },
  154. PlaneApi: PlaneApiConfig{
  155. Host: v.GetString("PLANE_HOST"),
  156. ApiKey: v.GetString("PLANE_API_KEY"),
  157. WorkspaceSlug: v.GetString("PLANE_WORKSPACE_SLUG"),
  158. ProjectId: v.GetString("PLANE_PROJECT_ID"),
  159. LabelBugId: v.GetString("PLANE_LABEL_BUG"),
  160. LabelFeatureId: v.GetString("PLANE_LABEL_FEATURE"),
  161. },
  162. PlaneWebApi: PlaneWebApiConfig{
  163. Host: v.GetString("PLANE_WEB_HOST"),
  164. Email: v.GetString("PLANE_WEB_EMAIL"),
  165. Password: v.GetString("PLANE_WEB_PASSWORD"),
  166. WorkspaceSlug: v.GetString("PLANE_WEB_WORKSPACE_SLUG"),
  167. ProjectId: v.GetString("PLANE_WEB_PROJECT_ID"),
  168. LabelBugId: v.GetString("PLANE_WEB_LABEL_BUG"),
  169. LabelFeatureId: v.GetString("PLANE_WEB_LABEL_FEATURE"),
  170. LabelFeedbackId: v.GetString("PLANE_WEB_LABEL_FEEDBACK"),
  171. },
  172. }, nil
  173. }