diff --git a/CHANGELOG.md b/CHANGELOG.md index ccd4f71..ad3bbfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,7 +30,8 @@ - Add -c option to specify config file from command line [#285](https://github.com/juanfont/headscale/issues/285) [#612](https://github.com/juanfont/headscale/pull/601) - Add configuration option to allow Tailscale clients to use a random WireGuard port. [kb/1181/firewalls](https://tailscale.com/kb/1181/firewalls) [#624](https://github.com/juanfont/headscale/pull/624) - Improve obtuse UX regarding missing configuration (`ephemeral_node_inactivity_timeout` not set) [#639](https://github.com/juanfont/headscale/pull/639) -- Fix nodes being shown as 'offline' in `tailscale status` [648](https://github.com/juanfont/headscale/pull/648) +- Fix nodes being shown as 'offline' in `tailscale status` [#648](https://github.com/juanfont/headscale/pull/648) +- Improve shutdown behaviour [#651](https://github.com/juanfont/headscale/pull/651) ## 0.15.0 (2022-03-20) diff --git a/app.go b/app.go index 917d32b..78c1ad6 100644 --- a/app.go +++ b/app.go @@ -54,12 +54,13 @@ const ( ) const ( - AuthPrefix = "Bearer " - Postgres = "postgres" - Sqlite = "sqlite3" - updateInterval = 5000 - HTTPReadTimeout = 30 * time.Second - privateKeyFileMode = 0o600 + AuthPrefix = "Bearer " + Postgres = "postgres" + Sqlite = "sqlite3" + updateInterval = 5000 + HTTPReadTimeout = 30 * time.Second + HTTPShutdownTimeout = 3 * time.Second + privateKeyFileMode = 0o600 registerCacheExpiration = time.Minute * 15 registerCacheCleanup = time.Minute * 20 @@ -668,8 +669,13 @@ func (h *Headscale) Serve() error { Msg("Received signal to stop, shutting down gracefully") // Gracefully shut down servers - promHTTPServer.Shutdown(ctx) - httpServer.Shutdown(ctx) + ctx, cancel := context.WithTimeout(context.Background(), HTTPShutdownTimeout) + if err := promHTTPServer.Shutdown(ctx); err != nil { + log.Error().Err(err).Msg("Failed to shutdown prometheus http") + } + if err := httpServer.Shutdown(ctx); err != nil { + log.Error().Err(err).Msg("Failed to shutdown http") + } grpcSocket.GracefulStop() // Close network listeners @@ -680,7 +686,21 @@ func (h *Headscale) Serve() error { // Stop listening (and unlink the socket if unix type): socketListener.Close() + // Close db connections + db, err := h.db.DB() + if err != nil { + log.Error().Err(err).Msg("Failed to get db handle") + } + err = db.Close() + if err != nil { + log.Error().Err(err).Msg("Failed to close db") + } + + log.Info(). + Msg("Headscale stopped") + // And we're done: + cancel() os.Exit(0) } }