main.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package main
  2. import (
  3. "crypto/tls"
  4. "errors"
  5. "fmt"
  6. "net/http"
  7. "time"
  8. "github.com/0xJacky/Nginx-UI/internal/cert"
  9. "github.com/0xJacky/Nginx-UI/internal/cmd"
  10. "github.com/0xJacky/Nginx-UI/internal/kernel"
  11. "github.com/0xJacky/Nginx-UI/internal/migrate"
  12. "github.com/0xJacky/Nginx-UI/model"
  13. "github.com/0xJacky/Nginx-UI/router"
  14. "github.com/0xJacky/Nginx-UI/settings"
  15. "github.com/gin-gonic/gin"
  16. "github.com/jpillora/overseer"
  17. "github.com/uozi-tech/cosy"
  18. cKernel "github.com/uozi-tech/cosy/kernel"
  19. "github.com/uozi-tech/cosy/logger"
  20. cRouter "github.com/uozi-tech/cosy/router"
  21. cSettings "github.com/uozi-tech/cosy/settings"
  22. )
  23. //go:generate go generate ./cmd/...
  24. func Program(confPath string) func(state overseer.State) {
  25. return func(state overseer.State) {
  26. defer logger.Sync()
  27. defer logger.Info("Server exited")
  28. cosy.RegisterMigrationsBeforeAutoMigrate(migrate.BeforeAutoMigrate)
  29. cosy.RegisterModels(model.GenerateAllModel()...)
  30. cosy.RegisterMigration(migrate.Migrations)
  31. cosy.RegisterInitFunc(kernel.Boot, router.InitRouter)
  32. // Initialize settings package
  33. settings.Init(confPath)
  34. // Set gin mode
  35. gin.SetMode(cSettings.ServerSettings.RunMode)
  36. // Initialize logger package
  37. logger.Init(cSettings.ServerSettings.RunMode)
  38. defer logger.Sync()
  39. if state.Listener == nil {
  40. return
  41. }
  42. // Gin router initialization
  43. cRouter.Init()
  44. // Kernel boot
  45. cKernel.Boot()
  46. addr := fmt.Sprintf("%s:%d", cSettings.ServerSettings.Host, cSettings.ServerSettings.Port)
  47. srv := &http.Server{
  48. Addr: addr,
  49. Handler: cRouter.GetEngine(),
  50. }
  51. var err error
  52. if cSettings.ServerSettings.EnableHTTPS {
  53. // Load TLS certificate
  54. err = cert.LoadServerTLSCertificate()
  55. if err != nil {
  56. logger.Fatalf("Failed to load TLS certificate: %v", err)
  57. return
  58. }
  59. tlsConfig := &tls.Config{
  60. GetCertificate: func(clientHello *tls.ClientHelloInfo) (*tls.Certificate, error) {
  61. return cert.GetServerTLSCertificate()
  62. },
  63. MinVersion: tls.VersionTLS12,
  64. }
  65. srv.TLSConfig = tlsConfig
  66. logger.Info("Starting HTTPS server")
  67. tlsListener := tls.NewListener(state.Listener, tlsConfig)
  68. err = srv.Serve(tlsListener)
  69. } else {
  70. logger.Info("Starting HTTP server")
  71. err = srv.Serve(state.Listener)
  72. }
  73. if err != nil && !errors.Is(err, http.ErrServerClosed) {
  74. logger.Fatalf("listen: %s\n", err)
  75. }
  76. }
  77. }
  78. func main() {
  79. appCmd := cmd.NewAppCmd()
  80. confPath := appCmd.String("config")
  81. settings.Init(confPath)
  82. overseer.Run(overseer.Config{
  83. Program: Program(confPath),
  84. Address: fmt.Sprintf("%s:%d", cSettings.ServerSettings.Host, cSettings.ServerSettings.Port),
  85. TerminateTimeout: 5 * time.Second,
  86. Debug: cSettings.ServerSettings.RunMode == gin.DebugMode,
  87. })
  88. }