From a5cc5e3783a2bf95e336ea462a39447f14c5a153 Mon Sep 17 00:00:00 2001 From: ScribblerCoder Date: Wed, 20 Nov 2024 18:04:55 +0000 Subject: [PATCH] Add healthcheck command (#2856) Currently vikunja has a `/health` endpoint that was added in https://kolaente.dev/vikunja/vikunja/pulls/998. Docker/compose cannot utilize this feature since vikunja's docker image doesn't have curl/wget as it is pruned which is great for the image size. This PR adds a `healthcheck` command that send an http request to `/health` and exits with 0 or non-zero depending on the result. It also adds a `HEALTHCHECK` to the docker image which calls this automatically. Reviewed-on: https://kolaente.dev/vikunja/vikunja/pulls/2856 Reviewed-by: konrad Co-authored-by: ScribblerCoder Co-committed-by: ScribblerCoder --- Dockerfile | 2 ++ pkg/cmd/healthcheck.go | 64 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 pkg/cmd/healthcheck.go diff --git a/Dockerfile b/Dockerfile index 4ef7957d6..19cb8f232 100644 --- a/Dockerfile +++ b/Dockerfile @@ -53,3 +53,5 @@ ENV VIKUNJA_DATABASE_PATH=/db/vikunja.db COPY --from=apibuilder /build/vikunja-* vikunja COPY --from=apibuilder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ +HEALTHCHECK --interval=30s --timeout=30s --start-period=10s --retries=3 \ + CMD [ "/app/vikunja/vikunja", "healthcheck" ] \ No newline at end of file diff --git a/pkg/cmd/healthcheck.go b/pkg/cmd/healthcheck.go new file mode 100644 index 000000000..42f3d7eaf --- /dev/null +++ b/pkg/cmd/healthcheck.go @@ -0,0 +1,64 @@ +// Vikunja is a to-do list application to facilitate your life. +// Copyright 2018-present Vikunja and contributors. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public Licensee as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public Licensee for more details. +// +// You should have received a copy of the GNU Affero General Public Licensee +// along with this program. If not, see . + +package cmd + +import ( + "fmt" + "net/http" + "os" + "time" + + "code.vikunja.io/api/pkg/config" + "code.vikunja.io/api/pkg/initialize" + + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(healthcheckCmd) +} + +var healthcheckCmd = &cobra.Command{ + Use: "healthcheck", + Short: "Preform a healthcheck on the Vikunja api server", + PreRun: func(_ *cobra.Command, _ []string) { + initialize.LightInit() + }, + Run: func(_ *cobra.Command, _ []string) { + client := &http.Client{ + Timeout: 5 * time.Second, + } + host := config.ServiceInterface.GetString() + url := "http://%s/health" + resp, err := client.Get(fmt.Sprintf(url, host)) + if err != nil { + fmt.Printf("API server is not healthy: %v\n", err) + os.Exit(1) + return + } + defer resp.Body.Close() + + // Check the response status + if resp.StatusCode == http.StatusOK { + fmt.Println("API server is healthy") + os.Exit(0) + return + } + fmt.Printf("API server is not healthy: HTTP %d\n", resp.StatusCode) + os.Exit(1) + }, +}