Nathan Woodburn 6aaed517f6
All checks were successful
Build Docker / BuildImage (push) Successful in 3m56s
feat: Update reqs and add Dockerfile
2026-04-04 16:30:33 +11:00
2024-09-12 13:51:45 +10:00
2024-10-02 14:39:15 +10:00
2025-11-21 15:58:21 +11:00
2024-09-12 13:51:45 +10:00
2026-04-04 11:36:30 +11:00
2026-04-04 16:30:33 +11:00

HNSDoH Status

HNSDoH Status is a Flask service that discovers HNSDoH nodes from DNS A records for hnsdoh.com and continuously checks each node for:

  • DNS over UDP on port 53
  • DNS over TCP on port 53
  • DNS over HTTPS (DoH) on port 443 at /dns-query
  • DNS over TLS (DoT) on port 853

For DoH and DoT, TLS certificates are validated with hostname hnsdoh.com.

How It Works

  1. Resolve hnsdoh.com A records to discover active node IP addresses.
  2. Probe each discovered node for all four protocols.
  3. Keep current status and short in-memory history.
  4. Expose results through a web dashboard and JSON API.

Run

uv sync
uv run python main.py

The app runs on 0.0.0.0:5000 by default.

API Endpoints

  • GET /: HTML status page
  • GET /api/status: current snapshot and history
  • GET /api/health: service health (503 if stale or no checks yet)

Configuration

Environment variables:

  • HNSDOH_DOMAIN (default: hnsdoh.com)
  • HNSDOH_DOH_PATH (default: /dns-query)
  • HNSDOH_CHECK_INTERVAL_SECONDS (default: 300)
  • HNSDOH_UI_REFRESH_SECONDS (default: 30)
  • HNSDOH_HISTORY_SIZE (default: 12)
  • HNSDOH_STALE_AFTER_SECONDS (default: 900)
  • HNSDOH_DNS_TIMEOUT_SECONDS (default: 5)
  • HNSDOH_DOH_TIMEOUT_SECONDS (default: 10)
  • HNSDOH_DOT_TIMEOUT_SECONDS (default: 10)

Notes

  • Discovery uses DNS A records only.
  • DoH check uses RFC8484 DNS wireformat (application/dns-message) to each node IP while sending SNI/Host as hnsdoh.com for strict certificate hostname verification.
  • History is in-memory and resets on process restart.
Description
Status page for HNSDoH
https://status.hnsdoh.com
Readme 725 KiB
Languages
Python 67.6%
CSS 13.9%
JavaScript 9.8%
HTML 6.7%
Dockerfile 2%