@@ -2,30 +2,35 @@ package main
22
33import (
44 "crypto/tls"
5- "errors"
65 "fmt"
76 "net/http"
8- "time"
7+
8+ "context"
9+ "net"
10+ "os/signal"
11+ "syscall"
912
1013 "github.com/0xJacky/Nginx-UI/internal/cert"
1114 "github.com/0xJacky/Nginx-UI/internal/cmd"
15+
16+ "code.pfad.fr/risefront"
1217 "github.com/0xJacky/Nginx-UI/internal/kernel"
1318 "github.com/0xJacky/Nginx-UI/internal/migrate"
1419 "github.com/0xJacky/Nginx-UI/model"
1520 "github.com/0xJacky/Nginx-UI/router"
1621 "github.com/0xJacky/Nginx-UI/settings"
1722 "github.com/gin-gonic/gin"
18- "github.com/jpillora/overseer "
23+ "github.com/pkg/errors "
1924 "github.com/uozi-tech/cosy"
2025 cKernel "github.com/uozi-tech/cosy/kernel"
2126 "github.com/uozi-tech/cosy/logger"
2227 cRouter "github.com/uozi-tech/cosy/router"
2328 cSettings "github.com/uozi-tech/cosy/settings"
2429)
2530
26- //go:generate go generate ./cmd/...
27- func Program ( confPath string ) func (state overseer. State ) {
28- return func ( state overseer. State ) {
31+ func Program ( confPath string ) func ( l []net. Listener ) error {
32+ return func (l []net. Listener ) error {
33+ listener := l [ 0 ]
2934 defer logger .Sync ()
3035 defer logger .Info ("Server exited" )
3136
@@ -47,27 +52,29 @@ func Program(confPath string) func(state overseer.State) {
4752 logger .Init (cSettings .ServerSettings .RunMode )
4853 defer logger .Sync ()
4954
50- if state .Listener == nil {
51- return
52- }
5355 // Gin router initialization
5456 cRouter .Init ()
5557
5658 // Kernel boot
5759 cKernel .Boot ()
5860
59- addr := fmt .Sprintf ("%s:%d" , cSettings .ServerSettings .Host , cSettings .ServerSettings .Port )
6061 srv := & http.Server {
61- Addr : addr ,
6262 Handler : cRouter .GetEngine (),
6363 }
64+ // defer Shutdown to wait for ongoing requests to be served before returning
65+ defer func (srv * http.Server , ctx context.Context ) {
66+ err := srv .Shutdown (ctx )
67+ if err != nil {
68+ logger .Fatal (err )
69+ }
70+ }(srv , context .Background ())
6471 var err error
6572 if cSettings .ServerSettings .EnableHTTPS {
6673 // Load TLS certificate
6774 err = cert .LoadServerTLSCertificate ()
6875 if err != nil {
6976 logger .Fatalf ("Failed to load TLS certificate: %v" , err )
70- return
77+ return err
7178 }
7279
7380 tlsConfig := & tls.Config {
@@ -80,15 +87,16 @@ func Program(confPath string) func(state overseer.State) {
8087 srv .TLSConfig = tlsConfig
8188
8289 logger .Info ("Starting HTTPS server" )
83- tlsListener := tls .NewListener (state . Listener , tlsConfig )
90+ tlsListener := tls .NewListener (listener , tlsConfig )
8491 err = srv .Serve (tlsListener )
8592 } else {
8693 logger .Info ("Starting HTTP server" )
87- err = srv .Serve (state . Listener )
94+ err = srv .Serve (listener )
8895 }
8996 if err != nil && ! errors .Is (err , http .ErrServerClosed ) {
9097 logger .Fatalf ("listen: %s\n " , err )
9198 }
99+ return nil
92100 }
93101}
94102
@@ -97,10 +105,24 @@ func main() {
97105
98106 confPath := appCmd .String ("config" )
99107 settings .Init (confPath )
100- overseer .Run (overseer.Config {
101- Program : Program (confPath ),
102- Address : fmt .Sprintf ("%s:%d" , cSettings .ServerSettings .Host , cSettings .ServerSettings .Port ),
103- TerminateTimeout : 5 * time .Second ,
104- Debug : cSettings .ServerSettings .RunMode == gin .DebugMode ,
108+
109+ ctx , cancel := signal .NotifyContext (context .Background (), syscall .SIGINT , syscall .SIGTERM )
110+ defer cancel ()
111+
112+ err := risefront .New (ctx , risefront.Config {
113+ Run : Program (confPath ),
114+ Name : "nginx-ui" ,
115+ Addresses : []string {fmt .Sprintf ("%s:%d" , cSettings .ServerSettings .Host , cSettings .ServerSettings .Port )},
116+ ErrorHandler : func (kind string , err error ) {
117+ if errors .Is (err , net .ErrClosed ) {
118+ return
119+ }
120+ logger .Error (kind , err )
121+ },
105122 })
123+ if err != nil && ! errors .Is (err , context .DeadlineExceeded ) &&
124+ ! errors .Is (err , context .Canceled ) &&
125+ ! errors .Is (err , net .ErrClosed ) {
126+ logger .Error (err )
127+ }
106128}
0 commit comments