|
1 | 1 | package main |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "context" |
4 | 5 | "io" |
| 6 | + "net/http" |
5 | 7 | "os" |
| 8 | + "os/signal" |
6 | 9 | "path/filepath" |
| 10 | + "syscall" |
| 11 | + "time" |
7 | 12 |
|
8 | 13 | "github.com/envelope-zero/backend/internal/database" |
9 | 14 | "github.com/envelope-zero/backend/internal/router" |
@@ -37,7 +42,7 @@ func main() { |
37 | 42 | if gin.IsDebugging() { |
38 | 43 | zerolog.SetGlobalLevel(zerolog.DebugLevel) |
39 | 44 | } |
40 | | - log.Logger = log.Output(output).With().Timestamp().Logger() |
| 45 | + log.Logger = log.Output(output).With().Logger() |
41 | 46 |
|
42 | 47 | // Create data directory |
43 | 48 | dataDir := filepath.Join(".", "data") |
@@ -70,7 +75,39 @@ func main() { |
70 | 75 | log.Fatal().Msg(err.Error()) |
71 | 76 | } |
72 | 77 |
|
73 | | - if err := r.Run(); err != nil { |
74 | | - log.Fatal().Msg(err.Error()) |
| 78 | + // Set the port to the env variable, default to 8080 |
| 79 | + var port string |
| 80 | + if port = os.Getenv("PORT"); port == "" { |
| 81 | + port = ":8080" |
| 82 | + } |
| 83 | + |
| 84 | + // The following code is taken from https://github.com/gin-gonic/examples/blob/91fb0d925b3935d2c6e4d9336d78cf828925789d/graceful-shutdown/graceful-shutdown/notify-without-context/server.go |
| 85 | + // and has been modified to not wait for the |
| 86 | + srv := &http.Server{ |
| 87 | + Addr: port, |
| 88 | + Handler: r, |
| 89 | + } |
| 90 | + |
| 91 | + // Wait for interrupt signal to gracefully shutdown the server with a timeout of 5 seconds. |
| 92 | + quit := make(chan os.Signal, 1) |
| 93 | + signal.Notify(quit, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) |
| 94 | + |
| 95 | + go func() { |
| 96 | + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { |
| 97 | + log.Fatal().Str("event", "Error during startup").Err(err).Msg("Router") |
| 98 | + } |
| 99 | + }() |
| 100 | + log.Info().Str("event", "Startup complete").Msg("Router") |
| 101 | + |
| 102 | + <-quit |
| 103 | + log.Info().Str("event", "Received SIGINT or SIGTERM, stopping gracefully with 25 seconds timeout").Msg("Router") |
| 104 | + |
| 105 | + // Create a context with a 25 second timeout for the server to shut down in |
| 106 | + ctx, cancel := context.WithTimeout(context.Background(), 25*time.Second) |
| 107 | + defer cancel() |
| 108 | + |
| 109 | + if err := srv.Shutdown(ctx); err != nil { |
| 110 | + log.Fatal().Str("event", "Graceful shutdown failed, terminating").Err(err).Msg("Router") |
75 | 111 | } |
| 112 | + log.Info().Str("event", "Backend stopped").Msg("Router") |
76 | 113 | } |
0 commit comments