Web-based uptime monitor with latency breakdown
| .claude | ||
| .forgejo/workflows | ||
| static | ||
| templates | ||
| tests | ||
| .gitignore | ||
| app.py | ||
| checker.py | ||
| CLAUDE.md | ||
| compose.yaml | ||
| config.yaml | ||
| Dockerfile | ||
| LICENSE | ||
| README.md | ||
| requirements-dev.txt | ||
| requirements.txt | ||
| storage.py | ||
| wsgi.py | ||
Health Monitor
A lightweight HTTP health-check dashboard. Polls configured URLs on a fixed interval and shows uptime, latency breakdowns (connect / TTFB / transfer), P50/P95/P99 percentiles, and a 48-bucket timeline — all in a single self-contained Python + SQLite service.
Features
- Phase-level latency breakdown (connect, TTFB, transfer)
- P50 / P95 / P99 percentiles and latency sparkline
- Time-window selector: 2 h · 24 h · 7 d · 30 d
- Error type classification: timeout, DNS, TLS, connection refused, HTTP error
- Host management UI (add / edit / disable hosts at runtime)
- Optional HTTP Basic Auth
- Single SQLite file — no external database
Quick start
pip install -r requirements.txt
# edit config.yaml to add your hosts
python app.py # dev server on :5000
Container
podman build -t healthcheck .
podman run -d -p 5000:5000 \
-v healthcheck-data:/data \
-e AUTH_USER=admin -e AUTH_PASS=secret \
healthcheck
Or with podman-compose:
podman-compose up -d
Configuration
config.yaml
interval_seconds: 60
hosts:
- name: "My Site"
url: "https://example.com"
Environment variables
| Variable | Default | Description |
|---|---|---|
CONFIG_PATH |
config.yaml |
Path to config file |
DB_PATH |
healthcheck.db |
SQLite database path |
PORT |
5000 |
HTTP port (dev server only) |
AUTH_USER |
(unset) | Basic auth username (optional) |
AUTH_PASS |
(unset) | Basic auth password (optional) |
Auth is disabled when either variable is unset.
Development
pip install -r requirements-dev.txt
pytest tests/
License
MIT