mirror of
https://github.com/akyaiy/GoSally-mvp.git
synced 2026-01-03 20:12:25 +00:00
Some changes with http server
This commit is contained in:
51
cmd/run.go
51
cmd/run.go
@@ -94,7 +94,7 @@ var runCmd = &cobra.Command{
|
|||||||
func(cs *corestate.CoreState, x *app.AppX) {
|
func(cs *corestate.CoreState, x *app.AppX) {
|
||||||
if x.Config.Env.ParentStagePID != os.Getpid() {
|
if x.Config.Env.ParentStagePID != os.Getpid() {
|
||||||
if os.TempDir() != "/tmp" {
|
if os.TempDir() != "/tmp" {
|
||||||
x.Log.Printf("%s: %s", logs.SetYellow("warning"), "non-standard value specified for temporary directory")
|
x.Log.Printf("%s: %s", logs.PrintWarn(), "Non-standard value specified for temporary directory")
|
||||||
}
|
}
|
||||||
// still pre-init stage
|
// still pre-init stage
|
||||||
runDir, err := run_manager.Create(cs.UUID32)
|
runDir, err := run_manager.Create(cs.UUID32)
|
||||||
@@ -193,7 +193,12 @@ var runCmd = &cobra.Command{
|
|||||||
x.Log.SetPrefix(logs.SetGreen(fmt.Sprintf("(%s) ", cs.Stage)))
|
x.Log.SetPrefix(logs.SetGreen(fmt.Sprintf("(%s) ", cs.Stage)))
|
||||||
|
|
||||||
x.SLog = new(slog.Logger)
|
x.SLog = new(slog.Logger)
|
||||||
*x.SLog = *logs.SetupLogger(x.Config.Conf.Mode)
|
newSlog, err := logs.SetupLogger(x.Config.Conf.Log)
|
||||||
|
if err != nil {
|
||||||
|
_ = run_manager.Clean()
|
||||||
|
x.Log.Fatalf("Unexpected failure: %s", err.Error())
|
||||||
|
}
|
||||||
|
*x.SLog = *newSlog
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -223,7 +228,7 @@ var runCmd = &cobra.Command{
|
|||||||
})
|
})
|
||||||
|
|
||||||
s := gs.InitGeneral(&gs.GeneralServerInit{
|
s := gs.InitGeneral(&gs.GeneralServerInit{
|
||||||
Log: *x.SLog,
|
Log: x.SLog,
|
||||||
Config: x.Config.Conf,
|
Config: x.Config.Conf,
|
||||||
}, serverv1)
|
}, serverv1)
|
||||||
|
|
||||||
@@ -235,10 +240,7 @@ var runCmd = &cobra.Command{
|
|||||||
AllowCredentials: true,
|
AllowCredentials: true,
|
||||||
MaxAge: 300,
|
MaxAge: 300,
|
||||||
}))
|
}))
|
||||||
r.Route(config.ApiRoute+config.ComDirRoute, func(r chi.Router) {
|
r.HandleFunc(config.ComDirRoute, s.Handle)
|
||||||
r.Get("/", s.HandleList)
|
|
||||||
r.Get("/{cmd}", s.Handle)
|
|
||||||
})
|
|
||||||
r.Route("/favicon.ico", func(r chi.Router) {
|
r.Route("/favicon.ico", func(r chi.Router) {
|
||||||
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
|
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.WriteHeader(http.StatusNoContent)
|
w.WriteHeader(http.StatusNoContent)
|
||||||
@@ -248,33 +250,35 @@ var runCmd = &cobra.Command{
|
|||||||
srv := &http.Server{
|
srv := &http.Server{
|
||||||
Addr: x.Config.Conf.HTTPServer.Address,
|
Addr: x.Config.Conf.HTTPServer.Address,
|
||||||
Handler: r,
|
Handler: r,
|
||||||
|
ErrorLog: log.New(&logs.SlogWriter{
|
||||||
|
Logger: x.SLog,
|
||||||
|
Level: logs.GlobalLevel,
|
||||||
|
}, "", 0),
|
||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
if x.Config.Conf.TLS.TlsEnabled {
|
if x.Config.Conf.TLS.TlsEnabled {
|
||||||
x.SLog.Info("HTTPS server started with TLS", slog.String("address", x.Config.Conf.HTTPServer.Address))
|
listener, err := net.Listen("tcp", fmt.Sprintf("%s:%s", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port))
|
||||||
listener, err := net.Listen("tcp", x.Config.Conf.HTTPServer.Address)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
x.SLog.Error("Failed to start TLS listener", slog.String("error", err.Error()))
|
x.Log.Printf("%s: Failed to start TLS listener: %s", logs.PrintError(), err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
x.Log.Printf("Serving on %s port %s with TLS... (https://%s%s)", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port, fmt.Sprintf("%s:%s", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port), config.ComDirRoute)
|
||||||
limitedListener := netutil.LimitListener(listener, 100)
|
limitedListener := netutil.LimitListener(listener, 100)
|
||||||
if err := http.ServeTLS(limitedListener, r, x.Config.Conf.TLS.CertFile, x.Config.Conf.TLS.KeyFile); err != nil {
|
if err := srv.ServeTLS(limitedListener, x.Config.Conf.TLS.CertFile, x.Config.Conf.TLS.KeyFile); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||||||
x.SLog.Error("Failed to start HTTPS server", slog.String("error", err.Error()))
|
x.Log.Printf("%s: Failed to start HTTPS server: %s", logs.PrintError(), err.Error())
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
x.SLog.Info("HTTP server started", slog.String("address", x.Config.Conf.HTTPServer.Address))
|
x.Log.Printf("Serving on %s port %s... (http://%s%s)", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port, fmt.Sprintf("%s:%s", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port), config.ComDirRoute)
|
||||||
listener, err := net.Listen("tcp", x.Config.Conf.HTTPServer.Address)
|
listener, err := net.Listen("tcp", fmt.Sprintf("%s:%s", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
x.SLog.Error("Failed to start listener", slog.String("error", err.Error()))
|
x.Log.Printf("%s: Failed to start listener: %s", logs.PrintError(), err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
limitedListener := netutil.LimitListener(listener, 100)
|
limitedListener := netutil.LimitListener(listener, 100)
|
||||||
if err := http.Serve(limitedListener, r); err != nil {
|
if err := srv.Serve(limitedListener); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||||||
x.SLog.Error("Failed to start HTTP server", slog.String("error", err.Error()))
|
x.Log.Printf("%s: Failed to start HTTP server: %s", logs.PrintError(), err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ = srv.Shutdown(ctxMain)
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if x.Config.Conf.Updates.UpdatesEnabled {
|
if x.Config.Conf.Updates.UpdatesEnabled {
|
||||||
@@ -299,11 +303,16 @@ var runCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
<-ctxMain.Done()
|
<-ctxMain.Done()
|
||||||
|
if err := srv.Shutdown(ctxMain); err != nil {
|
||||||
|
x.Log.Printf("%s: Failed to stop the server gracefully: %s", logs.PrintError(), err.Error())
|
||||||
|
} else {
|
||||||
|
x.Log.Printf("Server stopped gracefully")
|
||||||
|
}
|
||||||
|
|
||||||
x.Log.Println("cleaning up...")
|
x.Log.Println("Cleaning up...")
|
||||||
|
|
||||||
if err := run_manager.Clean(); err != nil {
|
if err := run_manager.Clean(); err != nil {
|
||||||
x.Log.Printf("cleanup error: %s", err)
|
x.Log.Printf("%s: Cleanup error: %s", logs.PrintError(), err.Error())
|
||||||
}
|
}
|
||||||
x.Log.Println("bye!")
|
x.Log.Println("bye!")
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ func (c *Compositor) LoadConf(path string) error {
|
|||||||
// defaults
|
// defaults
|
||||||
v.SetDefault("mode", "dev")
|
v.SetDefault("mode", "dev")
|
||||||
v.SetDefault("com_dir", "./com/")
|
v.SetDefault("com_dir", "./com/")
|
||||||
v.SetDefault("http_server.address", "0.0.0.0:8080")
|
v.SetDefault("http_server.address", "0.0.0.0")
|
||||||
|
v.SetDefault("http_server.port", "8080")
|
||||||
v.SetDefault("http_server.timeout", "5s")
|
v.SetDefault("http_server.timeout", "5s")
|
||||||
v.SetDefault("http_server.idle_timeout", "60s")
|
v.SetDefault("http_server.idle_timeout", "60s")
|
||||||
v.SetDefault("tls.enabled", false)
|
v.SetDefault("tls.enabled", false)
|
||||||
@@ -54,6 +55,8 @@ func (c *Compositor) LoadConf(path string) error {
|
|||||||
v.SetDefault("updates.enabled", false)
|
v.SetDefault("updates.enabled", false)
|
||||||
v.SetDefault("updates.check_interval", "2h")
|
v.SetDefault("updates.check_interval", "2h")
|
||||||
v.SetDefault("updates.wanted_version", "latest-stable")
|
v.SetDefault("updates.wanted_version", "latest-stable")
|
||||||
|
v.SetDefault("log.level", "info")
|
||||||
|
v.SetDefault("log.out_path", "")
|
||||||
|
|
||||||
if err := v.ReadInConfig(); err != nil {
|
if err := v.ReadInConfig(); err != nil {
|
||||||
return fmt.Errorf("error reading config: %w", err)
|
return fmt.Errorf("error reading config: %w", err)
|
||||||
|
|||||||
@@ -23,10 +23,12 @@ type Conf struct {
|
|||||||
HTTPServer HTTPServer `mapstructure:"http_server"`
|
HTTPServer HTTPServer `mapstructure:"http_server"`
|
||||||
TLS TLS `mapstructure:"tls"`
|
TLS TLS `mapstructure:"tls"`
|
||||||
Updates Updates `mapstructure:"updates"`
|
Updates Updates `mapstructure:"updates"`
|
||||||
|
Log Log `mapstructure:"log"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type HTTPServer struct {
|
type HTTPServer struct {
|
||||||
Address string `mapstructure:"address"`
|
Address string `mapstructure:"address"`
|
||||||
|
Port string `mapstructure:"port"`
|
||||||
Timeout time.Duration `mapstructure:"timeout"`
|
Timeout time.Duration `mapstructure:"timeout"`
|
||||||
IdleTimeout time.Duration `mapstructure:"idle_timeout"`
|
IdleTimeout time.Duration `mapstructure:"idle_timeout"`
|
||||||
HTTPServer_Api HTTPServer_Api `mapstructure:"api"`
|
HTTPServer_Api HTTPServer_Api `mapstructure:"api"`
|
||||||
@@ -50,6 +52,11 @@ type Updates struct {
|
|||||||
WantedVersion string `mapstructure:"wanted_version"`
|
WantedVersion string `mapstructure:"wanted_version"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Log struct {
|
||||||
|
Level string `mapstructure:"level"`
|
||||||
|
OutPath string `mapstructure:"out_path"`
|
||||||
|
}
|
||||||
|
|
||||||
// ConfigEnv structure for environment variables
|
// ConfigEnv structure for environment variables
|
||||||
type Env struct {
|
type Env struct {
|
||||||
ConfigPath string `mapstructure:"config_path"`
|
ConfigPath string `mapstructure:"config_path"`
|
||||||
|
|||||||
Reference in New Issue
Block a user