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) + }, +}