feat(api): add unauthenticated health endpoints #45

Merged
Zayin_Admin merged 1 commits from feat/api-health-endpoints into main 2026-10-01 22:25:02 +00:00
Owner

Add GET /api/v1/health/live and GET /api/v1/health/ready per ADR 0044.

  • live returns a fixed 200 {"status":"live"} whenever the process serves.
  • ready returns 200 {"status":"ready"} only when module startup has
    completed (and shutdown has not begun) and a database ping succeeds
    within 2s; otherwise a fixed 503 {"code":"NOT_READY"}.
  • The ping runs on the shared pool as one simple-protocol message with
    a transaction-local statement_timeout, so PostgreSQL cancels a stalled
    statement; the pool discards the connection on failure.
  • At most one ping is ever unsettled: probes share its outcome and, once
    its deadline passes, answer 503 immediately until it settles.
  • Both routes set Cache-Control: no-store, accept GET only (405 with
    Allow: GET otherwise, HEAD included), never resolve a principal, and
    are mounted in app.ts beside, never inside, /api/v1/modules/.
  • createApiApp gains a required health option; startApi supplies it
    and clears module readiness when shutdown begins.

Co-Authored-By: Claude Opus 5.5 [email protected]

Add GET /api/v1/health/live and GET /api/v1/health/ready per ADR 0044. - live returns a fixed 200 {"status":"live"} whenever the process serves. - ready returns 200 {"status":"ready"} only when module startup has completed (and shutdown has not begun) and a database ping succeeds within 2s; otherwise a fixed 503 {"code":"NOT_READY"}. - The ping runs on the shared pool as one simple-protocol message with a transaction-local statement_timeout, so PostgreSQL cancels a stalled statement; the pool discards the connection on failure. - At most one ping is ever unsettled: probes share its outcome and, once its deadline passes, answer 503 immediately until it settles. - Both routes set Cache-Control: no-store, accept GET only (405 with Allow: GET otherwise, HEAD included), never resolve a principal, and are mounted in app.ts beside, never inside, /api/v1/modules/. - createApiApp gains a required `health` option; startApi supplies it and clears module readiness when shutdown begins. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Zayin_Admin added 1 commit 2026-10-01 22:12:57 +00:00
feat(api): add unauthenticated health endpoints
CI / verify (pull_request) Successful in 45s
CI / infrastructure-smoke (pull_request) Successful in 12s
CI / migration-smoke (pull_request) Successful in 1m42s
aaec9789c4
Add GET /api/v1/health/live and GET /api/v1/health/ready per ADR 0044.

- live returns a fixed 200 {"status":"live"} whenever the process serves.
- ready returns 200 {"status":"ready"} only when module startup has
  completed (and shutdown has not begun) and a database ping succeeds
  within 2s; otherwise a fixed 503 {"code":"NOT_READY"}.
- The ping runs on the shared pool as one simple-protocol message with
  a transaction-local statement_timeout, so PostgreSQL cancels a stalled
  statement; the pool discards the connection on failure.
- At most one ping is ever unsettled: probes share its outcome and, once
  its deadline passes, answer 503 immediately until it settles.
- Both routes set Cache-Control: no-store, accept GET only (405 with
  Allow: GET otherwise, HEAD included), never resolve a principal, and
  are mounted in app.ts beside, never inside, /api/v1/modules/.
- createApiApp gains a required `health` option; startApi supplies it
  and clears module readiness when shutdown begins.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Zayin_Admin merged commit 220b7b152a into main 2026-10-01 22:25:02 +00:00
Zayin_Admin deleted branch feat/api-health-endpoints 2026-10-01 22:25:02 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Zayin/Ekklesia#45