You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

init.go 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // Copyright 2016 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package routers
  5. import (
  6. "context"
  7. "fmt"
  8. "strings"
  9. "time"
  10. "code.gitea.io/gitea/models"
  11. "code.gitea.io/gitea/models/migrations"
  12. "code.gitea.io/gitea/modules/auth/sso"
  13. "code.gitea.io/gitea/modules/cache"
  14. "code.gitea.io/gitea/modules/cron"
  15. "code.gitea.io/gitea/modules/eventsource"
  16. "code.gitea.io/gitea/modules/git"
  17. "code.gitea.io/gitea/modules/highlight"
  18. code_indexer "code.gitea.io/gitea/modules/indexer/code"
  19. issue_indexer "code.gitea.io/gitea/modules/indexer/issues"
  20. stats_indexer "code.gitea.io/gitea/modules/indexer/stats"
  21. "code.gitea.io/gitea/modules/log"
  22. "code.gitea.io/gitea/modules/markup"
  23. "code.gitea.io/gitea/modules/markup/external"
  24. repo_migrations "code.gitea.io/gitea/modules/migrations"
  25. "code.gitea.io/gitea/modules/notification"
  26. "code.gitea.io/gitea/modules/setting"
  27. "code.gitea.io/gitea/modules/ssh"
  28. "code.gitea.io/gitea/modules/storage"
  29. "code.gitea.io/gitea/modules/svg"
  30. "code.gitea.io/gitea/modules/task"
  31. "code.gitea.io/gitea/modules/translation"
  32. "code.gitea.io/gitea/services/mailer"
  33. mirror_service "code.gitea.io/gitea/services/mirror"
  34. pull_service "code.gitea.io/gitea/services/pull"
  35. "code.gitea.io/gitea/services/repository"
  36. "code.gitea.io/gitea/services/webhook"
  37. "gitea.com/macaron/macaron"
  38. )
  39. func checkRunMode() {
  40. switch setting.RunMode {
  41. case "dev":
  42. git.Debug = true
  43. case "test":
  44. git.Debug = true
  45. default:
  46. macaron.Env = macaron.PROD
  47. macaron.ColorLog = false
  48. setting.ProdMode = true
  49. }
  50. log.Info("Run Mode: %s", strings.Title(macaron.Env))
  51. }
  52. // NewServices init new services
  53. func NewServices() {
  54. setting.NewServices()
  55. if err := storage.Init(); err != nil {
  56. log.Fatal("storage init failed: %v", err)
  57. }
  58. if err := repository.NewContext(); err != nil {
  59. log.Fatal("repository init failed: %v", err)
  60. }
  61. mailer.NewContext()
  62. _ = cache.NewContext()
  63. notification.NewContext()
  64. }
  65. // In case of problems connecting to DB, retry connection. Eg, PGSQL in Docker Container on Synology
  66. func initDBEngine(ctx context.Context) (err error) {
  67. log.Info("Beginning ORM engine initialization.")
  68. for i := 0; i < setting.Database.DBConnectRetries; i++ {
  69. select {
  70. case <-ctx.Done():
  71. return fmt.Errorf("Aborted due to shutdown:\nin retry ORM engine initialization")
  72. default:
  73. }
  74. log.Info("ORM engine initialization attempt #%d/%d...", i+1, setting.Database.DBConnectRetries)
  75. if err = models.NewEngine(ctx, migrations.Migrate); err == nil {
  76. break
  77. } else if i == setting.Database.DBConnectRetries-1 {
  78. return err
  79. }
  80. log.Error("ORM engine initialization attempt #%d/%d failed. Error: %v", i+1, setting.Database.DBConnectRetries, err)
  81. log.Info("Backing off for %d seconds", int64(setting.Database.DBConnectBackoff/time.Second))
  82. time.Sleep(setting.Database.DBConnectBackoff)
  83. }
  84. models.HasEngine = true
  85. return nil
  86. }
  87. // PreInstallInit preloads the configuration to check if we need to run install
  88. func PreInstallInit(ctx context.Context) bool {
  89. setting.NewContext()
  90. if !setting.InstallLock {
  91. log.Trace("AppPath: %s", setting.AppPath)
  92. log.Trace("AppWorkPath: %s", setting.AppWorkPath)
  93. log.Trace("Custom path: %s", setting.CustomPath)
  94. log.Trace("Log path: %s", setting.LogRootPath)
  95. log.Trace("Preparing to run install page")
  96. translation.InitLocales()
  97. if setting.EnableSQLite3 {
  98. log.Info("SQLite3 Supported")
  99. }
  100. setting.InitDBConfig()
  101. svg.Init()
  102. }
  103. return !setting.InstallLock
  104. }
  105. // PostInstallInit rereads the settings and starts up the database
  106. func PostInstallInit(ctx context.Context) {
  107. setting.NewContext()
  108. setting.InitDBConfig()
  109. if setting.InstallLock {
  110. if err := initDBEngine(ctx); err == nil {
  111. log.Info("ORM engine initialization successful!")
  112. } else {
  113. log.Fatal("ORM engine initialization failed: %v", err)
  114. }
  115. svg.Init()
  116. }
  117. }
  118. // GlobalInit is for global configuration reload-able.
  119. func GlobalInit(ctx context.Context) {
  120. setting.NewContext()
  121. if !setting.InstallLock {
  122. log.Fatal("Gitea is not installed")
  123. }
  124. if err := git.Init(ctx); err != nil {
  125. log.Fatal("Git module init failed: %v", err)
  126. }
  127. setting.CheckLFSVersion()
  128. log.Trace("AppPath: %s", setting.AppPath)
  129. log.Trace("AppWorkPath: %s", setting.AppWorkPath)
  130. log.Trace("Custom path: %s", setting.CustomPath)
  131. log.Trace("Log path: %s", setting.LogRootPath)
  132. // Setup i18n
  133. translation.InitLocales()
  134. NewServices()
  135. highlight.NewContext()
  136. external.RegisterParsers()
  137. markup.Init()
  138. if err := initDBEngine(ctx); err == nil {
  139. log.Info("ORM engine initialization successful!")
  140. } else {
  141. log.Fatal("ORM engine initialization failed: %v", err)
  142. }
  143. if err := models.InitOAuth2(); err != nil {
  144. log.Fatal("Failed to initialize OAuth2 support: %v", err)
  145. }
  146. models.NewRepoContext()
  147. // Booting long running goroutines.
  148. cron.NewContext()
  149. issue_indexer.InitIssueIndexer(false)
  150. code_indexer.Init()
  151. if err := stats_indexer.Init(); err != nil {
  152. log.Fatal("Failed to initialize repository stats indexer queue: %v", err)
  153. }
  154. mirror_service.InitSyncMirrors()
  155. webhook.InitDeliverHooks()
  156. if err := pull_service.Init(); err != nil {
  157. log.Fatal("Failed to initialize test pull requests queue: %v", err)
  158. }
  159. if err := task.Init(); err != nil {
  160. log.Fatal("Failed to initialize task scheduler: %v", err)
  161. }
  162. if err := repo_migrations.Init(); err != nil {
  163. log.Fatal("Failed to initialize repository migrations: %v", err)
  164. }
  165. eventsource.GetManager().Init()
  166. if setting.EnableSQLite3 {
  167. log.Info("SQLite3 Supported")
  168. }
  169. checkRunMode()
  170. if setting.SSH.StartBuiltinServer {
  171. ssh.Listen(setting.SSH.ListenHost, setting.SSH.ListenPort, setting.SSH.ServerCiphers, setting.SSH.ServerKeyExchanges, setting.SSH.ServerMACs)
  172. log.Info("SSH server started on %s:%d. Cipher list (%v), key exchange algorithms (%v), MACs (%v)", setting.SSH.ListenHost, setting.SSH.ListenPort, setting.SSH.ServerCiphers, setting.SSH.ServerKeyExchanges, setting.SSH.ServerMACs)
  173. } else {
  174. ssh.Unused()
  175. }
  176. sso.Init()
  177. svg.Init()
  178. }