Task graph covers all Phase 1 concerns: config system, TLS termination, proxy handler, operations (rate limiting, logging, health check, admin socket, signals, shutdown, body size limit), deployment artifacts, and two review checkpoints. No circular dependencies. Critical path length of 7. Risk distribution: 3 high-risk (ACME, TLS listener setup, startup orchestration), 7 medium, 11 low, 2 trivial.
57 lines
2.0 KiB
Markdown
57 lines
2.0 KiB
Markdown
---
|
|
id: ops/health-check
|
|
name: Implement health check endpoint on separate local port and HTTPS fallback
|
|
status: pending
|
|
depends_on: [config/static-config]
|
|
scope: narrow
|
|
risk: low
|
|
impact: component
|
|
level: implementation
|
|
---
|
|
|
|
## Description
|
|
|
|
Implement the health check endpoint on a separate local port (default: 9900, bound to `127.0.0.1` only) and as a fallback on the HTTPS listener.
|
|
|
|
### Local Health Check Port
|
|
|
|
- Binds to `127.0.0.1:{health_check_port}`
|
|
- `GET /health` returns `200 OK` with empty body
|
|
- `health_check_port = 0` disables the separate listener
|
|
- Port must not conflict with any listener's `http_port` or `https_port` on `127.0.0.1` (validated in config validation)
|
|
|
|
### HTTPS Health Check Fallback
|
|
|
|
When the local health check port is enabled, `/health` is also available on the HTTPS listener(s) for TLS-level health verification. External monitoring should prefer the local health check for liveness and can use the HTTPS endpoint for TLS verification.
|
|
|
|
### What Health Check Verifies
|
|
|
|
- Process is running and tokio runtime is responsive
|
|
- TLS listener is accepting connections (HTTPS endpoint only)
|
|
- Config is loaded (StaticConfig and DynamicConfig are initialized)
|
|
|
|
It does **NOT** check upstream reachability. The health check answers "is the proxy process healthy?", not "is the upstream reachable?"
|
|
|
|
## Acceptance Criteria
|
|
|
|
- [ ] Local health check binds to `127.0.0.1:{health_check_port}` only
|
|
- [ ] `GET /health` returns `200 OK` with empty body
|
|
- [ ] `health_check_port = 0` disables the listener
|
|
- [ ] Port conflict detection in config validation
|
|
- [ ] `/health` available on HTTPS listener(s) as fallback
|
|
- [ ] Health check does not verify upstream reachability
|
|
- [ ] Integration test: local health check responds 200
|
|
- [ ] Integration test: HTTPS health check responds 200
|
|
|
|
## References
|
|
|
|
- docs/architecture/operations.md — health check section
|
|
- docs/architecture/decisions/013-health-check-port.md — separate local port rationale
|
|
|
|
## Notes
|
|
|
|
> To be filled by implementation agent
|
|
|
|
## Summary
|
|
|
|
> To be filled on completion |