|
@@ -2,20 +2,25 @@ package main
|
|
|
|
|
|
import (
|
|
|
"crypto/tls"
|
|
|
- "errors"
|
|
|
"fmt"
|
|
|
"net/http"
|
|
|
- "time"
|
|
|
+
|
|
|
+ "context"
|
|
|
+ "net"
|
|
|
+ "os/signal"
|
|
|
+ "syscall"
|
|
|
|
|
|
"github.com/0xJacky/Nginx-UI/internal/cert"
|
|
|
"github.com/0xJacky/Nginx-UI/internal/cmd"
|
|
|
+
|
|
|
+ "code.pfad.fr/risefront"
|
|
|
"github.com/0xJacky/Nginx-UI/internal/kernel"
|
|
|
"github.com/0xJacky/Nginx-UI/internal/migrate"
|
|
|
"github.com/0xJacky/Nginx-UI/model"
|
|
|
"github.com/0xJacky/Nginx-UI/router"
|
|
|
"github.com/0xJacky/Nginx-UI/settings"
|
|
|
"github.com/gin-gonic/gin"
|
|
|
- "github.com/jpillora/overseer"
|
|
|
+ "github.com/pkg/errors"
|
|
|
"github.com/uozi-tech/cosy"
|
|
|
cKernel "github.com/uozi-tech/cosy/kernel"
|
|
|
"github.com/uozi-tech/cosy/logger"
|
|
@@ -23,9 +28,9 @@ import (
|
|
|
cSettings "github.com/uozi-tech/cosy/settings"
|
|
|
)
|
|
|
|
|
|
-//go:generate go generate ./cmd/...
|
|
|
-func Program(confPath string) func(state overseer.State) {
|
|
|
- return func(state overseer.State) {
|
|
|
+func Program(confPath string) func(l []net.Listener) error {
|
|
|
+ return func(l []net.Listener) error {
|
|
|
+ listener := l[0]
|
|
|
defer logger.Sync()
|
|
|
defer logger.Info("Server exited")
|
|
|
|
|
@@ -47,27 +52,29 @@ func Program(confPath string) func(state overseer.State) {
|
|
|
logger.Init(cSettings.ServerSettings.RunMode)
|
|
|
defer logger.Sync()
|
|
|
|
|
|
- if state.Listener == nil {
|
|
|
- return
|
|
|
- }
|
|
|
// Gin router initialization
|
|
|
cRouter.Init()
|
|
|
|
|
|
// Kernel boot
|
|
|
cKernel.Boot()
|
|
|
|
|
|
- addr := fmt.Sprintf("%s:%d", cSettings.ServerSettings.Host, cSettings.ServerSettings.Port)
|
|
|
srv := &http.Server{
|
|
|
- Addr: addr,
|
|
|
Handler: cRouter.GetEngine(),
|
|
|
}
|
|
|
+ // defer Shutdown to wait for ongoing requests to be served before returning
|
|
|
+ defer func(srv *http.Server, ctx context.Context) {
|
|
|
+ err := srv.Shutdown(ctx)
|
|
|
+ if err != nil {
|
|
|
+ logger.Fatal(err)
|
|
|
+ }
|
|
|
+ }(srv, context.Background())
|
|
|
var err error
|
|
|
if cSettings.ServerSettings.EnableHTTPS {
|
|
|
// Load TLS certificate
|
|
|
err = cert.LoadServerTLSCertificate()
|
|
|
if err != nil {
|
|
|
logger.Fatalf("Failed to load TLS certificate: %v", err)
|
|
|
- return
|
|
|
+ return err
|
|
|
}
|
|
|
|
|
|
tlsConfig := &tls.Config{
|
|
@@ -80,15 +87,16 @@ func Program(confPath string) func(state overseer.State) {
|
|
|
srv.TLSConfig = tlsConfig
|
|
|
|
|
|
logger.Info("Starting HTTPS server")
|
|
|
- tlsListener := tls.NewListener(state.Listener, tlsConfig)
|
|
|
+ tlsListener := tls.NewListener(listener, tlsConfig)
|
|
|
err = srv.Serve(tlsListener)
|
|
|
} else {
|
|
|
logger.Info("Starting HTTP server")
|
|
|
- err = srv.Serve(state.Listener)
|
|
|
+ err = srv.Serve(listener)
|
|
|
}
|
|
|
if err != nil && !errors.Is(err, http.ErrServerClosed) {
|
|
|
logger.Fatalf("listen: %s\n", err)
|
|
|
}
|
|
|
+ return nil
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -97,10 +105,24 @@ func main() {
|
|
|
|
|
|
confPath := appCmd.String("config")
|
|
|
settings.Init(confPath)
|
|
|
- overseer.Run(overseer.Config{
|
|
|
- Program: Program(confPath),
|
|
|
- Address: fmt.Sprintf("%s:%d", cSettings.ServerSettings.Host, cSettings.ServerSettings.Port),
|
|
|
- TerminateTimeout: 5 * time.Second,
|
|
|
- Debug: cSettings.ServerSettings.RunMode == gin.DebugMode,
|
|
|
+
|
|
|
+ ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
|
|
|
+ defer cancel()
|
|
|
+
|
|
|
+ err := risefront.New(ctx, risefront.Config{
|
|
|
+ Run: Program(confPath),
|
|
|
+ Name: "nginx-ui",
|
|
|
+ Addresses: []string{fmt.Sprintf("%s:%d", cSettings.ServerSettings.Host, cSettings.ServerSettings.Port)},
|
|
|
+ ErrorHandler: func(kind string, err error) {
|
|
|
+ if errors.Is(err, net.ErrClosed) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ logger.Error(kind, err)
|
|
|
+ },
|
|
|
})
|
|
|
+ if err != nil && !errors.Is(err, context.DeadlineExceeded) &&
|
|
|
+ !errors.Is(err, context.Canceled) &&
|
|
|
+ !errors.Is(err, net.ErrClosed) {
|
|
|
+ logger.Error(err)
|
|
|
+ }
|
|
|
}
|