Sign inSign up

daltonsbaker/speed-watch

By daltonsbaker

โ€ขUpdated 5 months ago

A lightweight, self-hosted speed test tracker. Runs tests, stores results, displays in a dashboard.

Image
Networking
0

610

daltonsbaker/speed-watch repository overview

โ Speed Watch

Docker Hubโ  ยท GitHubโ 

A lightweight, self-hosted speed test tracker. Runs scheduled tests against either Ookla or Cloudflare, stores every result in SQLite, and displays the truth โ€” especially failures โ€” in a clean dashboard with charts.

No built-in authentication. Intended to run behind a reverse proxy, Cloudflare Zero Trust, Tailscale, or on a trusted LAN.

โ Features

  • Scheduled and on-demand speed tests
  • Two providers: Ookla and Cloudflare (one active at a time)
  • SQLite persistence โ€” every attempt recorded: successes, failures, timeouts, partials, and skipped runs
  • Line charts for download / upload / ping / jitter with failure markers
  • Time range filtering, run detail modal, recent runs table, and a full history page
  • Configurable via UI; settings saved to a JSON file alongside the database
  • Simple REST API for integrations

โ Quick start

โ docker run
docker run -d \
  --name speed-watch \
  --restart unless-stopped \
  -p 6100:6100 \
  -v $(pwd)/data:/data \
  daltonsbaker/speed-watch:latest

Then open http://localhost:6100โ .

โ docker compose

Create a docker-compose.yml:

services:
  speed-watch:
    image: daltonsbaker/speed-watch:latest
    container_name: speed-watch
    restart: unless-stopped
    ports:
      - "6100:6100"
    volumes:
      - ./data:/data

Then run:

docker compose up -d

โ Data volume

Everything is stored under /data inside the container:

PathDescription
/data/speedtest.dbSQLite database with run history
/data/config.jsonApplication config (created on first run)

Mount this to a persistent host directory so data survives restarts and image updates.


โ Environment variables

These are bootstrap-only settings. All normal configuration is done through the UI and saved to config.json.

VariableDefaultDescription
PORT6100HTTP port to listen on
HOST0.0.0.0Bind address
DATA_DIR/dataDirectory for db + config
DB_PATH/data/speedtest.dbOverride DB path
CONFIG_PATH/data/config.jsonOverride config path

โ First-time setup

  1. Open the app at http://<host>:6100
  2. Go to Config
  3. Choose your provider (Ookla or Cloudflare), set a cron schedule, and save

Defaults out of the box:

  • Scheduled tests enabled
  • Cron: */10 * * * * (every 10 minutes)
  • Active provider: cloudflare
  • Test timeout: 120 seconds

The scheduler reloads automatically after saving a valid config.


โ Running behind a reverse proxy

The container speaks plain HTTP on port 6100. Drop it behind Caddy, Traefik, nginx, or similar and add authentication there if needed.


โ API

MethodPathDescription
GET/api/runs/latestMost recent scheduled run
GET/api/runs/latest-successMost recent successful run
GET/api/runs?from=&to=&provider=Historical runs with optional filters
GET/api/runs/:idSingle run by ID
POST/api/runTrigger a manual speed test (not persisted)
GET/api/configCurrent configuration
PUT/api/configUpdate configuration (validated)
GET/api/statusScheduler state + active-run flag + range summary

All timestamps are Unix epoch milliseconds. JSON keys are camelCase.


โ Building from source

See DEVELOPMENT.mdโ .

Tag summary

Content type

Image

Digest

sha256:e6f77ed45โ€ฆ

Size

88.6 MB

Last updated

5 months ago

docker pull daltonsbaker/speed-watch