Add health check for Docker image

This commit is contained in:
eikendev 2020-08-06 20:42:35 +02:00
parent 3bdadd6029
commit da1aa3c3b8
No known key found for this signature in database
GPG key ID: A1BDB1B28C8EF694
5 changed files with 37 additions and 0 deletions

View file

@ -17,6 +17,8 @@ RUN set -ex \
FROM alpine
ENV PUSHBITS_HTTP_PORT="8080"
EXPOSE 8080
WORKDIR /app
@ -31,4 +33,6 @@ RUN set -ex \
USER 1000
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s CMD curl --fail http://localhost:$PUSHBITS_HTTP_PORT/health || exit 1
ENTRYPOINT ["./run"]

22
api/health.go Normal file
View file

@ -0,0 +1,22 @@
package api
import (
"net/http"
"github.com/gin-gonic/gin"
)
// HealthHandler holds information for processing requests about the server's health.
type HealthHandler struct {
DB Database
}
// Health returns the health status of the server.
func (h *HealthHandler) Health(ctx *gin.Context) {
if err := h.DB.Health(); err != nil {
ctx.AbortWithError(http.StatusInternalServerError, err)
return
}
ctx.JSON(http.StatusOK, gin.H{})
}

View file

@ -6,6 +6,8 @@ import (
// The Database interface for encapsulating database access.
type Database interface {
Health() error
CreateApplication(application *model.Application) error
DeleteApplication(application *model.Application) error
GetApplicationByID(ID uint) (*model.Application, error)

6
database/health.go Normal file
View file

@ -0,0 +1,6 @@
package database
// Health reports the status of the database connection.
func (d *Database) Health() error {
return d.sqldb.Ping()
}

View file

@ -24,6 +24,7 @@ func Create(debug bool, cm *credentials.Manager, db *database.Database, dp *disp
auth := authentication.Authenticator{DB: db}
applicationHandler := api.ApplicationHandler{DB: db, DP: dp}
healthHandler := api.HealthHandler{DB: db}
notificationHandler := api.NotificationHandler{DB: db, DP: dp}
userHandler := api.UserHandler{AH: &applicationHandler, CM: cm, DB: db, DP: dp}
@ -42,6 +43,8 @@ func Create(debug bool, cm *credentials.Manager, db *database.Database, dp *disp
applicationGroup.PUT("/:id", api.RequireIDInURI(), applicationHandler.UpdateApplication)
}
r.GET("/health", healthHandler.Health)
r.POST("/message", auth.RequireApplicationToken(), notificationHandler.CreateNotification)
userGroup := r.Group("/user")