loader.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package loader
  2. import (
  3. "net/http"
  4. "strconv"
  5. "github.com/gorilla/websocket"
  6. "github.com/porter-dev/porter/api/server/shared/apierrors/alerter"
  7. "github.com/porter-dev/porter/api/server/shared/config"
  8. "github.com/porter-dev/porter/internal/adapter"
  9. "github.com/porter-dev/porter/internal/auth/sessionstore"
  10. "github.com/porter-dev/porter/internal/auth/token"
  11. "github.com/porter-dev/porter/internal/helm/urlcache"
  12. "github.com/porter-dev/porter/internal/notifier"
  13. "github.com/porter-dev/porter/internal/notifier/sendgrid"
  14. "github.com/porter-dev/porter/internal/oauth"
  15. "github.com/porter-dev/porter/internal/repository/gorm"
  16. lr "github.com/porter-dev/porter/internal/logger"
  17. )
  18. type EnvConfigLoader struct{}
  19. func NewEnvLoader() config.ConfigLoader {
  20. return &EnvConfigLoader{}
  21. }
  22. func (e *EnvConfigLoader) LoadConfig() (res *config.Config, err error) {
  23. envConf, err := FromEnv()
  24. if err != nil {
  25. return nil, err
  26. }
  27. sc := envConf.ServerConf
  28. res = &config.Config{
  29. Logger: lr.NewConsole(sc.Debug),
  30. ServerConf: sc,
  31. }
  32. res.Metadata = config.MetadataFromConf(envConf.ServerConf)
  33. db, err := adapter.New(envConf.DBConf)
  34. if err != nil {
  35. return nil, err
  36. }
  37. err = gorm.AutoMigrate(db)
  38. if err != nil {
  39. return nil, err
  40. }
  41. var key [32]byte
  42. for i, b := range []byte(envConf.DBConf.EncryptionKey) {
  43. key[i] = b
  44. }
  45. res.Repo = gorm.NewRepository(db, &key)
  46. // create the session store
  47. res.Store, err = sessionstore.NewStore(
  48. &sessionstore.NewStoreOpts{
  49. SessionRepository: res.Repo.Session(),
  50. CookieSecrets: envConf.ServerConf.CookieSecrets,
  51. },
  52. )
  53. if err != nil {
  54. return nil, err
  55. }
  56. res.TokenConf = &token.TokenGeneratorConf{
  57. TokenSecret: envConf.ServerConf.TokenGeneratorSecret,
  58. }
  59. res.UserNotifier = &notifier.EmptyUserNotifier{}
  60. if res.Metadata.Email {
  61. res.UserNotifier = sendgrid.NewUserNotifier(&sendgrid.Client{
  62. APIKey: envConf.ServerConf.SendgridAPIKey,
  63. PWResetTemplateID: envConf.ServerConf.SendgridPWResetTemplateID,
  64. PWGHTemplateID: envConf.ServerConf.SendgridPWGHTemplateID,
  65. VerifyEmailTemplateID: envConf.ServerConf.SendgridVerifyEmailTemplateID,
  66. ProjectInviteTemplateID: envConf.ServerConf.SendgridProjectInviteTemplateID,
  67. SenderEmail: envConf.ServerConf.SendgridSenderEmail,
  68. })
  69. }
  70. res.Alerter = alerter.NoOpAlerter{}
  71. if envConf.ServerConf.SentryDSN != "" {
  72. res.Alerter, err = alerter.NewSentryAlerter(envConf.ServerConf.SentryDSN)
  73. }
  74. if sc.DOClientID != "" && sc.DOClientSecret != "" {
  75. res.DOConf = oauth.NewDigitalOceanClient(&oauth.Config{
  76. ClientID: sc.DOClientID,
  77. ClientSecret: sc.DOClientSecret,
  78. Scopes: []string{"read", "write"},
  79. BaseURL: sc.ServerURL,
  80. })
  81. }
  82. if sc.GithubClientID != "" && sc.GithubClientSecret != "" {
  83. res.GithubConf = oauth.NewGithubClient(&oauth.Config{
  84. ClientID: sc.GithubClientID,
  85. ClientSecret: sc.GithubClientSecret,
  86. Scopes: []string{"read:user", "user:email"},
  87. BaseURL: sc.ServerURL,
  88. })
  89. }
  90. if sc.GithubAppClientID != "" &&
  91. sc.GithubAppClientSecret != "" &&
  92. sc.GithubAppName != "" &&
  93. sc.GithubAppWebhookSecret != "" &&
  94. sc.GithubAppSecretPath != "" &&
  95. sc.GithubAppID != "" {
  96. if AppID, err := strconv.ParseInt(sc.GithubAppID, 10, 64); err == nil {
  97. res.GithubAppConf = oauth.NewGithubAppClient(&oauth.Config{
  98. ClientID: sc.GithubAppClientID,
  99. ClientSecret: sc.GithubAppClientSecret,
  100. Scopes: []string{"read:user"},
  101. BaseURL: sc.ServerURL,
  102. }, sc.GithubAppName, sc.GithubAppWebhookSecret, sc.GithubAppSecretPath, AppID)
  103. }
  104. }
  105. res.WSUpgrader = &websocket.Upgrader{
  106. ReadBufferSize: 1024,
  107. WriteBufferSize: 1024,
  108. CheckOrigin: func(r *http.Request) bool {
  109. origin := r.Header.Get("Origin")
  110. return origin == sc.ServerURL
  111. },
  112. }
  113. res.URLCache = urlcache.Init(sc.DefaultApplicationHelmRepoURL, sc.DefaultAddonHelmRepoURL)
  114. return res, nil
  115. }