boot.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package kernal
  2. import (
  3. "github.com/0xJacky/Nginx-UI/internal/analytic"
  4. "github.com/0xJacky/Nginx-UI/internal/cert"
  5. "github.com/0xJacky/Nginx-UI/internal/cluster"
  6. "github.com/0xJacky/Nginx-UI/internal/logger"
  7. "github.com/0xJacky/Nginx-UI/internal/logrotate"
  8. "github.com/0xJacky/Nginx-UI/internal/validation"
  9. "github.com/0xJacky/Nginx-UI/model"
  10. "github.com/0xJacky/Nginx-UI/query"
  11. "github.com/0xJacky/Nginx-UI/settings"
  12. "github.com/go-co-op/gocron"
  13. "github.com/google/uuid"
  14. "mime"
  15. "runtime"
  16. "time"
  17. )
  18. func Boot() {
  19. defer recovery()
  20. async := []func(){
  21. InitJsExtensionType,
  22. InitDatabase,
  23. InitNodeSecret,
  24. validation.Init,
  25. }
  26. syncs := []func(){
  27. analytic.RecordServerAnalytic,
  28. }
  29. for _, v := range async {
  30. v()
  31. }
  32. for _, v := range syncs {
  33. go v()
  34. }
  35. }
  36. func InitAfterDatabase() {
  37. syncs := []func(){
  38. registerPredefinedUser,
  39. cert.InitRegister,
  40. InitCronJobs,
  41. cluster.RegisterPredefinedNodes,
  42. analytic.RetrieveNodesStatus,
  43. }
  44. for _, v := range syncs {
  45. go v()
  46. }
  47. }
  48. func recovery() {
  49. if err := recover(); err != nil {
  50. buf := make([]byte, 1024)
  51. runtime.Stack(buf, false)
  52. logger.Errorf("%s\n%s", err, buf)
  53. }
  54. }
  55. func InitDatabase() {
  56. // Skip install
  57. if settings.ServerSettings.SkipInstallation {
  58. skipInstall()
  59. }
  60. if "" != settings.ServerSettings.JwtSecret {
  61. db := model.Init()
  62. query.Init(db)
  63. InitAfterDatabase()
  64. }
  65. }
  66. func InitNodeSecret() {
  67. if "" == settings.ServerSettings.NodeSecret {
  68. logger.Warn("NodeSecret is empty, generating...")
  69. settings.ServerSettings.NodeSecret = uuid.New().String()
  70. err := settings.Save()
  71. if err != nil {
  72. logger.Error("Error save settings")
  73. }
  74. logger.Warn("Generated NodeSecret: ", settings.ServerSettings.NodeSecret)
  75. }
  76. }
  77. func InitJsExtensionType() {
  78. // Hack: fix wrong Content Type of .js file on some OS platforms
  79. // See https://github.com/golang/go/issues/32350
  80. _ = mime.AddExtensionType(".js", "text/javascript; charset=utf-8")
  81. }
  82. func InitCronJobs() {
  83. s := gocron.NewScheduler(time.UTC)
  84. job, err := s.Every(6).Hours().SingletonMode().Do(cert.AutoCert)
  85. if err != nil {
  86. logger.Fatalf("AutoCert Job: %v, Err: %v\n", job, err)
  87. }
  88. job, err = s.Every(settings.LogrotateSettings.Interval).Minute().SingletonMode().Do(logrotate.Exec)
  89. if err != nil {
  90. logger.Fatalf("LogRotate Job: %v, Err: %v\n", job, err)
  91. }
  92. s.StartAsync()
  93. }