Files
docker-compose-repo/myspeed/README.md
T
2026-09-25 15:45:26 +02:00

104 lines
4.6 KiB
Markdown

# MySpeed
Speed test *history*. It runs a test on a cron schedule, keeps the results for as
long as you tell it to, and draws the graph — so you can answer "is it slow right
now, or has it been slow every evening for a fortnight?"
Pairs with [librespeed](../librespeed/) rather than competing with it: that one
is an on-demand test you open when you want a number, this one is the unattended
recorder. MySpeed can even use LibreSpeed as its measurement backend — it offers
**Ookla, LibreSpeed and Cloudflare** as test providers, so the instance next door
can be the thing it measures against.
## Quick start
```bash
cp .env.example .env # optional -- every value has a default
docker compose up -d
```
Open `http://<host>:5216`. Everything — schedule, retention, provider, alerts —
is configured in the web UI, not in this file.
## Ports
| Port | Proto | Purpose |
|------|-------|---------|
| 5216 | http | Web UI and API |
## Why it looks like this
**A bind mount instead of upstream's named volume.** The official install is
`docker run -v myspeed:/myspeed/data`, a Docker-managed volume. Here it is
`${DATA_PATH:-./data}`, so the history database sits next to the compose file
where you can see it and a backup job can find it without knowing Docker's
layout. Same reasoning as [jellyfin](../jellyfin/README.md)'s `/config`.
**MySpeed itself takes no environment configuration** — no `PUID`, no `TZ`, no
options. State and settings both live in the SQLite database in that one
directory, which makes the stack trivially portable and the backup story simple:
copy the directory. The variables in `.env.example` are therefore Compose-level
only: the image tag, the host port, and where that directory lives.
## Gotchas
- **`latest` is a build from May 2024.** The project is alive — the repository
was pushed to in September 2026 — but the last tagged release is `v1.0.9` and
Docker Hub's `latest` still points at that same image:
| Tag | Pushed | Size | Digest |
|-----|--------|------|--------|
| `development` | 2026-08-02 | 102 MB | `sha256:043c2f00…` |
| `latest` | 2024-05-21 | 59 MB | `sha256:3a3e774b…` |
| `1.0.9` | 2024-05-21 | 59 MB | `sha256:3a3e774b…` |
So `latest` here does not mean recent — it means "the newest *release*", and
there hasn't been one since May 2024. It will start moving again if upstream
tags one. Until then, "update to the newest version" means
`MYSPEED_TAG=development`, which is a choice to make knowingly rather than a
`docker compose pull` away.
- **Scheduled tests run on container time.** The whole feature is cron
expressions, and the image documents no `TZ` variable — so "run at 03:00" is
03:00 **UTC** unless you tell the container otherwise. The two clock mounts are
in `compose.yaml`, commented out; uncomment them to follow the host instead.
They are off by default because turning them on shifts every existing schedule
by your UTC offset. Same class of trap as the cron container in
[firefly](../firefly/README.md).
- **A speed test measures the path from *this box*.** If MySpeed runs on the NAS,
the graph is the NAS's connectivity — which is usually what you want, but it is
not your laptop's Wi-Fi. And a low-power host can cap the result on CPU before
the link saturates; see [librespeed](../librespeed/README.md) for the same
caveat.
- **Back up the data directory.** Months of measurements and every setting are in
there, and nothing regenerates.
## What else it does
Worth knowing about before you go looking for another tool:
- **Health checks with alerting** — email, Signal, WhatsApp or Telegram when a
test fails or the line goes down.
- **Prometheus and Grafana export**, if you would rather graph this beside
everything else.
- **Multiple servers on one instance**, so a single dashboard can watch more than
one site.
- **Configurable retention**, from a few days to forever.
## Exposing it
- [Reverse proxy with Caddy](../docs/reverse-proxy.md) — fine; the UI is just a
dashboard, and the tests run server-side regardless of how you reach it.
- [Cloudflare Tunnel](../cloudflare-tunnel/) — fine for the dashboard, unlike
[librespeed](../librespeed/README.md): the measurements do not travel through
the tunnel, only the page does.
- [Single sign-on with Authentik](../docs/authentik-sso.md) — forward auth suits
it: browser-only, no accounts of its own. MySpeed has no authentication
built in, so anyone who reaches the port can change the schedule and read the
history.
## Links
- Upstream: <https://github.com/gnmyt/MySpeed>
- Website and docs: <https://myspeed.dev> · <https://docs.myspeed.dev/setup/linux>
- Image: <https://hub.docker.com/r/germannewsmaker/myspeed>