Deployment
Pre-built image (GHCR)
Section titled “Pre-built image (GHCR)”Images are published to GitHub Container Registry:
ghcr.io/whats-a-mattr/speedarr:latest— latest build frommainghcr.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:
docker pull ghcr.io/whats-a-mattr/speedarr:latestdocker run -d \ -p 3000:3000 \ -v speedarr-config:/config \ -e SPEEDARR_PASSWORD=your-dashboard-password \ ghcr.io/whats-a-mattr/speedarr:latestExample compose files
Section titled “Example compose files”The repo includes ready-to-use compose files in examples/:
| File | Use case |
|---|---|
examples/complete.yml | Dashboard only (single container, complete mode). |
examples/complete-with-nodes.yml | Dashboard plus three nodes on the same host. |
examples/node-only.yml | Node(s) only — no UI; register in a remote dashboard. |
From the repo root:
# Dashboard onlydocker compose -f examples/complete.yml up -d
# Dashboard + 3 nodesdocker compose -f examples/complete-with-nodes.yml up -d
# Node only (report to another dashboard)docker compose -f examples/node-only.yml up -dSee examples/README.md for details.
Single container (build from source)
Section titled “Single container (build from source)”docker build -t speedarr ./appdocker 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-configat/config(SQLite DB and config.json).
Main + nodes
Section titled “Main + nodes”To run one dashboard and three nodes (e.g. for testing), use the pre-built image and example file:
docker compose -f examples/complete-with-nodes.yml up -dOr build from source (repo root):
docker compose builddocker 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:
Node Base URL API key Node 1 http://speedarr-node1:3000 node1-secret Node 2 http://speedarr-node2:3000 node2-secret Node 3 http://speedarr-node3:3000 node3-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 and connectivity
Section titled “Speed tests and connectivity”Speed tests need outbound internet from the container. To verify:
docker compose run --rm speedarr-main curl -sI https://www.speedtest.netGluetun (VPN) from Docker
Section titled “Gluetun (VPN) from Docker”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 includedextra_hosts: host.docker.internal:host-gatewaylets 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.
Environment variables
Section titled “Environment variables”Only these are read from the environment:
| Variable | Description | Default |
|---|---|---|
MODE | complete or node | complete |
PORT | HTTP port | 3000 |
SPEEDARR_PASSWORD | Dashboard login password (optional; if unset, set on first-run in browser) | — |
SPEEDARR_DATA_DIR | Directory for SQLite DB and config.json (use as volume mount) | .speedarr (or /config in Docker) |
Volumes
Section titled “Volumes”Mount a volume at /config (or set SPEEDARR_DATA_DIR to that path) so the database and config.json persist:
-v speedarr-config:/configBuild and bake
Section titled “Build and bake”From the repo root:
cd app && npm run builddocker build -t speedarr ./appdocker buildx bake build # if using docker-bake.hcl