added LibreSpeed
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
# Copy to .env and adjust. .env is git-ignored; this file is not.
|
||||
#
|
||||
# NOTE: compose.yaml currently sets these values literally in its
|
||||
# `environment:` block, so nothing here is read yet. Switch a line to
|
||||
# ${VAR} in compose.yaml to start using it -- worth doing for the two
|
||||
# marked SECRET below, which should never sit in a committed file.
|
||||
|
||||
# ─── Basics ─────────────────────────────────────────────────────────
|
||||
#TITLE=LibreSpeed
|
||||
#TAGLINE=
|
||||
# Port on the host; the container always listens on WEBPORT (8080).
|
||||
#PORT=3011
|
||||
|
||||
# ─── Telemetry: off by default ──────────────────────────────────────
|
||||
# Turn this on and results are stored -- which needs a database AND a
|
||||
# volume, neither of which compose.yaml has today. See the README.
|
||||
#TELEMETRY=false
|
||||
|
||||
# SECRET. Protects the stats page at /results/stats.php. Required once
|
||||
# telemetry is on, or anyone can read every result.
|
||||
#PASSWORD=
|
||||
|
||||
# Shown in the privacy policy as the contact for deletion requests.
|
||||
# Required for a production install with telemetry. NOTE: the old EMAIL
|
||||
# variable is deprecated -- this is the current name.
|
||||
#GDPR_EMAIL=you@example.com
|
||||
|
||||
# Telemetry logs client IPs unless you turn this on.
|
||||
#REDACT_IP_ADDRESSES=false
|
||||
#ENABLE_ID_OBFUSCATION=false
|
||||
# 2-byte hex, e.g. 0x1234abcd. Random if unset -- which means IDs change
|
||||
# every restart.
|
||||
#OBFUSCATION_SALT=
|
||||
|
||||
# ─── Database (only when TELEMETRY=true) ────────────────────────────
|
||||
# sqlite needs /database mounted or results vanish on recreate.
|
||||
#DB_TYPE=sqlite
|
||||
#DB_NAME=
|
||||
#DB_HOSTNAME=
|
||||
#DB_PORT=
|
||||
#DB_USERNAME=
|
||||
#DB_PASSWORD=
|
||||
|
||||
# ─── ISP name and distance ──────────────────────────────────────────
|
||||
# SECRET. From ipinfo.io. Without it there is no ISP name, and DISTANCE
|
||||
# does nothing.
|
||||
#IPINFO_APIKEY=
|
||||
#DISABLE_IPINFO=false
|
||||
# km, mi, or empty to hide it. Needs IPINFO_APIKEY.
|
||||
#DISTANCE=km
|
||||
@@ -0,0 +1,93 @@
|
||||
# LibreSpeed
|
||||
|
||||
A speed test you host yourself. One container, no Flash, no Java, no account —
|
||||
open the page and it measures the link between the browser and *your* server.
|
||||
|
||||
That last part is the whole point and the whole catch: this does not tell you
|
||||
how fast your internet is. It tells you how fast the path to this box is, which
|
||||
is the more useful number when you are debugging your own LAN, your VPN, or a
|
||||
neighbour's Wi-Fi — and a meaningless one if you point it through a CDN.
|
||||
|
||||
## Quick start
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Open `http://<host>:3011`. There is nothing to configure and no `.env` needed
|
||||
for the default read-only setup — see [`.env.example`](.env.example) for what
|
||||
becomes relevant once you turn telemetry on.
|
||||
|
||||
## Ports
|
||||
|
||||
| Host | Container | Purpose |
|
||||
|------|-----------|---------|
|
||||
| 3011 | 8080 | Web UI and the test endpoints |
|
||||
|
||||
The container port follows `WEBPORT`, which defaults to 8080.
|
||||
|
||||
## Why it looks like this
|
||||
|
||||
**`MODE: standalone`** means one container is both the page and the test
|
||||
endpoint. The alternatives matter only at scale: `backend` is a bare test point,
|
||||
`frontend` serves a UI that talks to a list of remote backends, and `dual` is
|
||||
both. For a single box, standalone is the whole story.
|
||||
|
||||
**No volumes, because telemetry is off.** With `TELEMETRY` unset the container
|
||||
stores nothing and is entirely disposable — `docker compose down` costs you
|
||||
nothing. The moment you enable it, that stops being true; see the gotchas.
|
||||
|
||||
**Most of the environment block is commented out on purpose.** It is upstream's
|
||||
menu of options kept close to hand, which is more useful in a file you revisit
|
||||
once a year than a link to documentation.
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **Turning on telemetry needs a volume that isn't there.** `TELEMETRY: "true"`
|
||||
stores results in sqlite by default, inside the container, at `/database`.
|
||||
With no volume mounted the results survive restarts but vanish the moment the
|
||||
container is recreated — which is to say, on the next `docker compose pull`.
|
||||
Add `- ./data:/database` before enabling it.
|
||||
- **Telemetry also wants `PASSWORD`**, which protects the stats page at
|
||||
`/results/stats.php`. Without it, anyone who finds the URL can read every
|
||||
result you've recorded, including client IPs.
|
||||
- **`EMAIL` is deprecated — the current name is `GDPR_EMAIL`.** It is the
|
||||
address shown in the privacy policy for deletion requests, and upstream
|
||||
considers it required for a production install with telemetry on. The
|
||||
commented block in `compose.yaml` still uses the old name.
|
||||
- **Results log client IP addresses by default.** `REDACT_IP_ADDRESSES: "true"`
|
||||
turns that off. Worth thinking about before you hand the URL to guests.
|
||||
- **`DISTANCE` does nothing without `IPINFO_APIKEY`**, and that key is a
|
||||
credential — it belongs in `.env` and a `${IPINFO_APIKEY}` reference, never in
|
||||
the committed compose file.
|
||||
- **A slow result may be your server, not your network.** The test works by
|
||||
generating and swallowing garbage data, so on a low-power host the CPU can cap
|
||||
the number before the link does. If you see a suspiciously round ceiling,
|
||||
check `docker stats` while a test runs — the same trap as
|
||||
[copyparty on an N100](../copyparty/README.md).
|
||||
- **`:latest` is unpinned.** Note the Docker tags drop the `v` that the git tags
|
||||
carry: the release is `v6.3.0`, the image tag is **`6.3.0`** (also `6.3`, `6`,
|
||||
and `-alpine` variants of each). Pinning `v6.3.0` fails with a manifest error
|
||||
that looks like a network problem.
|
||||
- **`restart: always` rather than `unless-stopped`**, so a deliberate stop does
|
||||
not survive a reboot. The rest of this repo uses the latter.
|
||||
|
||||
## Exposing it
|
||||
|
||||
- [Reverse proxy with Caddy](../docs/reverse-proxy.md) — works, but understand
|
||||
what you are then measuring: the path to the proxy, shaped by whatever the
|
||||
proxy does. For a LAN test, reach it directly by IP and skip the proxy.
|
||||
- [Cloudflare Tunnel](../cloudflare-tunnel/) — **no.** This is a tool whose job
|
||||
is to move as many gigabytes as it can for as long as you let it. Putting it
|
||||
behind a tunnel produces a number that measures Cloudflare, while pushing
|
||||
bulk transfer through a service not meant to carry it.
|
||||
- [Single sign-on with Authentik](../docs/authentik-sso.md) — forward auth fits
|
||||
fine; it is a browser-only app with no accounts of its own. Sensible if this
|
||||
faces the internet, though a public speed test is also a free bandwidth sink
|
||||
for whoever finds it.
|
||||
|
||||
## Links
|
||||
|
||||
- Upstream: <https://github.com/librespeed/speedtest>
|
||||
- Docker options: <https://github.com/librespeed/speedtest/blob/master/doc_docker.md>
|
||||
- Image: <https://github.com/librespeed/speedtest/pkgs/container/speedtest>
|
||||
@@ -0,0 +1,19 @@
|
||||
services:
|
||||
speedtest:
|
||||
container_name: speedtest
|
||||
image: ghcr.io/librespeed/speedtest:latest
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
MODE: standalone
|
||||
TITLE: "Gooyban's Speed Meter"
|
||||
#TELEMETRY: "false"
|
||||
#ENABLE_ID_OBFUSCATION: "false"
|
||||
#REDACT_IP_ADDRESSES: "false"
|
||||
#PASSWORD:
|
||||
#GDPR_EMAIL::
|
||||
#DISABLE_IPINFO: "false"
|
||||
#IPINFO_APIKEY: "your api key"
|
||||
#DISTANCE: "km"
|
||||
#WEBPORT: 8080
|
||||
ports:
|
||||
- "3011:8080" # webport mapping (host:container)
|
||||
Reference in New Issue
Block a user