feat(server): public GET /health endpoint for uptime monitors

Returns 200 with {status: ok, version, db: ok} when SQLite is reachable,
503 when the DB probe fails. Unauthenticated so external monitors can
poll without credentials.
This commit is contained in:
Carsten 2026-04-22 08:48:14 +02:00
parent 3ce2940094
commit 579d7fc6e8
3 changed files with 52 additions and 0 deletions

View file

@ -0,0 +1,35 @@
defmodule ServerWeb.HealthController do
use ServerWeb, :controller
@moduledoc """
Public health check for uptime monitors.
Returns 200 when the process is up AND SQLite is reachable, 503 otherwise.
"""
def show(conn, _params) do
case probe_db() do
:ok ->
json(conn, %{
status: "ok",
version: Application.spec(:server, :vsn) |> to_string(),
db: "ok"
})
{:error, reason} ->
conn
|> put_status(:service_unavailable)
|> json(%{status: "degraded", db: "error", reason: inspect(reason)})
end
end
defp probe_db do
try do
case Ecto.Adapters.SQL.query(Server.Repo, "SELECT 1", []) do
{:ok, _} -> :ok
{:error, e} -> {:error, e}
end
rescue
e -> {:error, e}
end
end
end