Skip to content

Commit 38a695a

Browse files
committed
Add graceful shutdown
1 parent 4389a25 commit 38a695a

1 file changed

Lines changed: 29 additions & 4 deletions

File tree

cmd/main.go

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@ package main
22

33
import (
44
"context"
5+
"errors"
56
"log/slog"
7+
"net/http"
68
"os"
9+
"os/signal"
10+
"syscall"
11+
"time"
712

813
"github.com/pyazo-screenshot/api/config"
914
"github.com/pyazo-screenshot/api/db"
@@ -18,7 +23,7 @@ func main() {
1823
}
1924

2025
if cfg.Env == "production" {
21-
slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil)))
26+
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, nil)))
2227
}
2328

2429
if err := db.RunMigrations(cfg.DatabaseURL()); err != nil {
@@ -35,9 +40,29 @@ func main() {
3540

3641
s := pyhttp.NewServer(pool, cfg)
3742
addr := ":" + cfg.Port
38-
slog.Info("server starting", "addr", addr)
39-
if err := s.Router.Run(addr); err != nil {
40-
slog.Error("server failed", "error", err)
43+
44+
srv := &http.Server{
45+
Addr: addr,
46+
Handler: s.Router,
47+
}
48+
49+
go func() {
50+
slog.Info("server starting", "addr", addr)
51+
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
52+
slog.Error("server failed", "error", err)
53+
os.Exit(1)
54+
}
55+
}()
56+
57+
quit := make(chan os.Signal, 1)
58+
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
59+
<-quit
60+
61+
slog.Info("shutting down server")
62+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
63+
defer cancel()
64+
if err := srv.Shutdown(ctx); err != nil {
65+
slog.Error("server forced to shutdown", "error", err)
4166
os.Exit(1)
4267
}
4368
}

0 commit comments

Comments
 (0)