diff --git a/cmd/alienist/main.go b/cmd/alienist/main.go index d7eaef9..ab0234c 100644 --- a/cmd/alienist/main.go +++ b/cmd/alienist/main.go @@ -16,10 +16,12 @@ import ( "net" "net/http" "os" + "os/signal" "path/filepath" "sort" "strings" "sync" + "syscall" "time" ) @@ -146,7 +148,24 @@ func main() { IdleTimeout: 60 * time.Second, } log.Printf("alienist listening on %s (text=%s image=%s demo=%v)", server.Addr, a.textModel, a.imageModel, a.token == "") - log.Fatal(server.ListenAndServe()) + errCh := make(chan error, 1) + go func() { errCh <- server.ListenAndServe() }() + + shutdownSignal, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + defer stop() + select { + case err := <-errCh: + if !errors.Is(err, http.ErrServerClosed) { + log.Fatal(err) + } + case <-shutdownSignal.Done(): + log.Print("alienist shutting down") + shutdownCtx, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + if err := server.Shutdown(shutdownCtx); err != nil { + log.Printf("graceful shutdown: %v", err) + } + } } func (a *app) home(w http.ResponseWriter, r *http.Request) {