speed-logger
Self-hosted network monitoring with a Grafana dashboard. Two measurements run side by side:
- Ping checks every 5 seconds against the local router and a pool of public DNS resolvers. The router/internet split shows whether an outage is your WiFi's fault or your ISP's.
- Speedtests every 15 minutes via the Ookla CLI, recording download, upload, latency, and jitter.
The dashboard shows live UP/DOWN status, status-page style uptime bars, ping latency, speed history, and whether your ISP delivers the speeds from its Produktinformationsblatt (thresholds are editable in the dashboard, defaults are Vodafone GigaZuhause 1000 Kabel).
A control page on port 80 lets anyone in the household turn speedtests off and on from their phone (a speedtest saturates the connection for a few seconds, which can cause lag in games or calls). The toggle takes effect at the next scheduled run, no restart needed.
Requirements
- Docker and Docker Compose
Deployment
Create a .env file in the project root:
GRAFANA_PORT=3000
GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=changeme
# Optional: host port of the control page (default 80)
#CONTROL_PORT=80
# Optional: initial speedtest state (default true). Only used until
# someone uses the toggle on the control page, which takes precedence.
#SPEEDTEST_ENABLED=false
# Optional: seconds between ping iterations (default 5)
#PING_INTERVAL=5
Start the containers:
docker compose up -d
Grafana runs at http://localhost:3000 (dashboard provisioned automatically), the control page at http://localhost.
The dashboard is viewable without login (anonymous read-only access). The admin login is only needed to edit dashboards. Grafana mounts the database read-only, so viewers cannot modify data even through the query API.
The control page opens the dashboard in kiosk mode, which shows only the data without the Grafana UI. Press Escape to get the full interface.
Results are stored in a SQLite database on a named Docker volume, so history survives container rebuilds.
Easy access without remembering IPs
Give the server a name so household members can use http://<name> instead of an IP:
- mDNS: install Avahi on the server (
avahi-daemonplusnss-mdns, preinstalled on many distros) and it is reachable ashttp://<hostname>.localfrom phones and laptops on the LAN. - Router DNS: most home routers let you name devices; a Fritz!Box for example makes the server reachable as
http://<name>.fritz.box.
Keeping the control page on port 80 means no port number is needed in the URL. The control page links to the Grafana dashboard, so one address is enough to share.
