Skip to content

Deployment

Images are published to GitHub Container Registry:

  • ghcr.io/whats-a-mattr/speedarr:latest — latest build from main
  • ghcr.io/whats-a-mattr/speedarr:<version> — release (e.g. 0.1.0)

Use these with the example compose files below, or pull and run manually:

Terminal window
docker pull ghcr.io/whats-a-mattr/speedarr:latest
docker run -d \
-p 3000:3000 \
-v speedarr-config:/config \
-e SPEEDARR_PASSWORD=your-dashboard-password \
ghcr.io/whats-a-mattr/speedarr:latest

The repo includes ready-to-use compose files in examples/:

FileUse case
examples/complete.ymlDashboard only (single container, complete mode).
examples/complete-with-nodes.ymlDashboard plus three nodes on the same host.
examples/node-only.ymlNode(s) only — no UI; register in a remote dashboard.

From the repo root:

Terminal window
# Dashboard only
docker compose -f examples/complete.yml up -d
# Dashboard + 3 nodes
docker compose -f examples/complete-with-nodes.yml up -d
# Node only (report to another dashboard)
docker compose -f examples/node-only.yml up -d

See examples/README.md for details.

Terminal window
docker build -t speedarr ./app
docker run -d \
-p 3000:3000 \
-v speedarr-config:/config \
-e SPEEDARR_PASSWORD=your-dashboard-password \
speedarr
  • UI: http://localhost:3000
  • Data: Stored in the volume speedarr-config at /config (SQLite DB and config.json).

To run one dashboard and three nodes (e.g. for testing), use the pre-built image and example file:

Terminal window
docker compose -f examples/complete-with-nodes.yml up -d

Or build from source (repo root):

Terminal window
docker compose build
docker compose up -d
  • Dashboard: http://localhost:3000 — log in with the password set in the compose file (or complete first-run in the browser if unset).

  • Nodes: Add them in the dashboard under Nodes → Add node:

    NodeBase URLAPI key
    Node 1http://speedarr-node1:3000node1-secret
    Node 2http://speedarr-node2:3000node2-secret
    Node 3http://speedarr-node3:3000node3-secret

    Use the node ID (node1, node2, node3) and API key when adding. Base URLs are only reachable from the main container over the Docker network. Nodes are auto-enrolled to report scheduled speed test results to this dashboard.

Speed tests need outbound internet from the container. To verify:

Terminal window
docker compose run --rm speedarr-main curl -sI https://www.speedtest.net

If you use the Gluetun integration:

  • Gluetun on the same host as Speedarr: In the dashboard set the address to http://host.docker.internal:8000 (replace 8000 with your Gluetun control port). The included extra_hosts: host.docker.internal:host-gateway lets the container reach the host.
  • Gluetun on a different host: Use that host’s URL (e.g. http://192.168.1.36:8000). Ensure Gluetun’s control server listens on all interfaces (e.g. HTTP_CONTROL_SERVER_ADDRESS=:8000) and the firewall on that host allows the Docker host.

Only these are read from the environment:

VariableDescriptionDefault
MODEcomplete or nodecomplete
PORTHTTP port3000
SPEEDARR_PASSWORDDashboard login password (optional; if unset, set on first-run in browser)
SPEEDARR_DATA_DIRDirectory for SQLite DB and config.json (use as volume mount).speedarr (or /config in Docker)

Mount a volume at /config (or set SPEEDARR_DATA_DIR to that path) so the database and config.json persist:

Terminal window
-v speedarr-config:/config

From the repo root:

Terminal window
cd app && npm run build
docker build -t speedarr ./app
docker buildx bake build # if using docker-bake.hcl