main.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "os"
  8. "github.com/porter-dev/porter/internal/models"
  9. "github.com/porter-dev/porter/internal/repository/gorm"
  10. "github.com/porter-dev/porter/server/api"
  11. "github.com/porter-dev/porter/internal/adapter"
  12. "github.com/porter-dev/porter/internal/config"
  13. lr "github.com/porter-dev/porter/internal/logger"
  14. "github.com/porter-dev/porter/server/router"
  15. prov "github.com/porter-dev/porter/internal/kubernetes/provisioner"
  16. ints "github.com/porter-dev/porter/internal/models/integrations"
  17. )
  18. // Version will be linked by an ldflag during build
  19. var Version string = "dev"
  20. func main() {
  21. var versionFlag bool
  22. flag.BoolVar(&versionFlag, "version", false, "print version and exit")
  23. flag.Parse()
  24. // Exit safely when version is used
  25. if versionFlag {
  26. fmt.Println(Version)
  27. os.Exit(0)
  28. }
  29. appConf := config.FromEnv()
  30. logger := lr.NewConsole(appConf.Debug)
  31. db, err := adapter.New(&appConf.Db)
  32. if err != nil {
  33. logger.Fatal().Err(err).Msg("")
  34. return
  35. }
  36. err = db.AutoMigrate(
  37. &models.Project{},
  38. &models.Role{},
  39. &models.User{},
  40. &models.Session{},
  41. &models.GitRepo{},
  42. &models.Registry{},
  43. &models.HelmRepo{},
  44. &models.Cluster{},
  45. &models.ClusterCandidate{},
  46. &models.ClusterResolver{},
  47. &models.Infra{},
  48. &models.GitActionConfig{},
  49. &models.Invite{},
  50. &models.AuthCode{},
  51. &models.DNSRecord{},
  52. &models.PWResetToken{},
  53. &ints.KubeIntegration{},
  54. &ints.BasicIntegration{},
  55. &ints.OIDCIntegration{},
  56. &ints.OAuthIntegration{},
  57. &ints.GCPIntegration{},
  58. &ints.AWSIntegration{},
  59. &ints.TokenCache{},
  60. &ints.ClusterTokenCache{},
  61. &ints.RegTokenCache{},
  62. &ints.HelmRepoTokenCache{},
  63. &ints.GithubAppInstallation{},
  64. &ints.GithubAppOAuthIntegration{},
  65. &ints.SlackIntegration{},
  66. )
  67. if err != nil {
  68. logger.Fatal().Err(err).Msg("")
  69. return
  70. }
  71. var key [32]byte
  72. for i, b := range []byte(appConf.Db.EncryptionKey) {
  73. key[i] = b
  74. }
  75. repo := gorm.NewRepository(db, &key)
  76. if appConf.Redis.Enabled {
  77. redis, err := adapter.NewRedisClient(&appConf.Redis)
  78. if err != nil {
  79. logger.Fatal().Err(err).Msg("")
  80. return
  81. }
  82. prov.InitGlobalStream(redis)
  83. errorChan := make(chan error)
  84. go prov.GlobalStreamListener(redis, *repo, errorChan)
  85. }
  86. a, err := api.New(&api.AppConfig{
  87. Logger: logger,
  88. Repository: repo,
  89. ServerConf: appConf.Server,
  90. RedisConf: &appConf.Redis,
  91. CapConf: appConf.Capabilities,
  92. DBConf: appConf.Db,
  93. })
  94. if err != nil {
  95. logger.Fatal().Err(err).Msg("")
  96. }
  97. appRouter := router.New(a)
  98. address := fmt.Sprintf(":%d", appConf.Server.Port)
  99. logger.Info().Msgf("Starting server %v", address)
  100. s := &http.Server{
  101. Addr: address,
  102. Handler: appRouter,
  103. ReadTimeout: appConf.Server.TimeoutRead,
  104. WriteTimeout: appConf.Server.TimeoutWrite,
  105. IdleTimeout: appConf.Server.TimeoutIdle,
  106. }
  107. if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  108. log.Fatal("Server startup failed", err)
  109. }
  110. }