Diff
1diff --git a/pkg/web/health.go b/pkg/web/health.go
2new file mode 100644
3index 0000000000000000000000000000000000000000..850e08bf9e1aa280b13cd910735e4b67ec18a67e
4--- /dev/null
5+++ b/pkg/web/health.go
6@@ -0,0 +1,34 @@
7+package web
8+
9+import (
10+ "context"
11+ "net/http"
12+
13+ "github.com/charmbracelet/log/v2"
14+ "github.com/charmbracelet/soft-serve/pkg/db"
15+ "github.com/gorilla/mux"
16+)
17+
18+// HealthController registers the health check routes for the web server.
19+func HealthController(_ context.Context, r *mux.Router) {
20+ r.HandleFunc("/livez", getLiveness)
21+ r.HandleFunc("/readyz", getReadiness)
22+}
23+
24+func getLiveness(w http.ResponseWriter, _ *http.Request) {
25+ renderStatus(http.StatusOK)(w, nil)
26+}
27+
28+func getReadiness(w http.ResponseWriter, r *http.Request) {
29+ ctx := r.Context()
30+ logger := log.FromContext(ctx)
31+ db := db.FromContext(ctx)
32+
33+ if err := db.PingContext(ctx); err != nil {
34+ logger.Error("error getting db readiness", "err", err)
35+ renderStatus(http.StatusServiceUnavailable)(w, nil)
36+ return
37+ }
38+
39+ renderStatus(http.StatusOK)(w, nil)
40+}
41diff --git a/pkg/web/server.go b/pkg/web/server.go
42index a5cb490ed4b20f54c49f93775affc640594a6970..e9d5fb5f3969f8b2722ff7cbb06108c2c7f8106a 100644
43--- a/pkg/web/server.go
44+++ b/pkg/web/server.go
45@@ -14,6 +14,9 @@ func NewRouter(ctx context.Context) http.Handler {
46 logger := log.FromContext(ctx).WithPrefix("http")
47 router := mux.NewRouter()
48
49+ // Health routes
50+ HealthController(ctx, router)
51+
52 // Git routes
53 GitController(ctx, router)
54