main.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "net"
  7. "net/http"
  8. "os/signal"
  9. "syscall"
  10. "code.pfad.fr/risefront"
  11. "github.com/0xJacky/Nginx-UI/internal/kernel"
  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/pkg/errors"
  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. func Program(confPath string) func(l []net.Listener) error {
  24. return func(l []net.Listener) error {
  25. defer logger.Sync()
  26. defer logger.Info("Server exited")
  27. cosy.RegisterModels(model.GenerateAllModel()...)
  28. cosy.RegisterAsyncFunc(kernel.Boot, router.InitRouter)
  29. // Initialize settings package
  30. settings.Init(confPath)
  31. // Set gin mode
  32. gin.SetMode(cSettings.ServerSettings.RunMode)
  33. // Initialize logger package
  34. logger.Init(cSettings.ServerSettings.RunMode)
  35. defer logger.Sync()
  36. // Gin router initialization
  37. cRouter.Init()
  38. // Kernel boot
  39. cKernel.Boot()
  40. srv := &http.Server{
  41. Handler: cRouter.GetEngine(),
  42. }
  43. // defer Shutdown to wait for ongoing requests to be served before returning
  44. defer func(srv *http.Server, ctx context.Context) {
  45. err := srv.Shutdown(ctx)
  46. if err != nil {
  47. logger.Fatal(err)
  48. }
  49. }(srv, context.Background())
  50. return srv.Serve(l[0])
  51. }
  52. }
  53. func main() {
  54. var confPath string
  55. flag.StringVar(&confPath, "config", "app.ini", "Specify the configuration file")
  56. flag.Parse()
  57. settings.Init(confPath)
  58. ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
  59. defer cancel()
  60. err := risefront.New(ctx, risefront.Config{
  61. Run: Program(confPath),
  62. Name: "nginx-ui",
  63. Addresses: []string{fmt.Sprintf("%s:%d", cSettings.ServerSettings.Host, cSettings.ServerSettings.Port)},
  64. ErrorHandler: func(kind string, err error) {
  65. if errors.Is(err, net.ErrClosed) {
  66. return
  67. }
  68. logger.Error(kind, err)
  69. },
  70. })
  71. if err != nil && !errors.Is(err, context.DeadlineExceeded) &&
  72. !errors.Is(err, context.Canceled) &&
  73. !errors.Is(err, net.ErrClosed) {
  74. logger.Error(err)
  75. }
  76. }