Zum Inhalt

OpenSpeedTest per Docker einrichten: WLAN- und LAN-Geschwindigkeit im Heimnetz messen

Veröffentlicht am 14. Oktober 2026 · Geschätzte Lesezeit: 6 Minuten

OpenSpeedTest ist ein browserbasierter Geschwindigkeitstest, der vollständig auf deinem eigenen Server läuft. Du öffnest die Weboberfläche auf dem Handy, Notebook oder Desktop, klickst auf Start, und der Test misst die tatsächliche Übertragungsrate zwischen deinem Gerät und dem Server – ohne dass Daten über das Internet zu einem externen Speedtest-Dienst gehen.[1][3] Damit findest du heraus, ob eine langsame Verbindung am WLAN, am Kabel, am Gerät oder am Internetanschluss liegt. Die Einrichtung mit Docker dauert etwa 20 bis 35 Minuten.

Diese Anleitung folgt der offiziellen Docker-Image-Dokumentation auf GitHub und der Projektseite für selbst gehostete Speedtests.[1][3] Das Praxisvideo How to install OpenSpeedTest on Docker zeigt den Ablauf ergänzend.[6]

Voraussetzungen

  • Ein Linux-Server mit Docker und Docker Compose (Plugin)
  • Terminal-Zugriff mit sudo-Rechten
  • Ein freier TCP-Port 3000 im Heimnetz
  • Die feste LAN-IP-Adresse deines Docker-Hosts (DHCP-Reservierung oder statisch)
  • Ein zweites Gerät (Handy, Notebook) zum Testen

1. Feste LAN-IP des Docker-Hosts ermitteln

Der Speedtest-Container soll nur im vertrauenswürdigen Heimnetz erreichbar sein und nicht auf allen Netzwerkschnittstellen lauschen. Dafür brauchst du die feste LAN-Adresse deines Servers. Stelle sicher, dass dein Server eine per DHCP reservierte oder statisch konfigurierte IP hat (z. B. 192.168.1.50). Prüfe die Adresse:

hostname -I

Hat dein Server mehrere Netzwerkschnittstellen (z. B. VLAN, VPN), notiere die Adresse der physikalischen LAN-Schnittstelle (beginnt meist mit 192.168., 10. oder 172.16.). Verwende nicht die erste Adresse blind, wenn du nicht sicher bist, welche Schnittstelle ins Heimnetz zeigt.

2. Projektverzeichnis anlegen

Erstelle einen eigenen Ordner für OpenSpeedTest:

mkdir -p ~/docker/openspeedtest
cd ~/docker/openspeedtest

OpenSpeedTest speichert keine eigenen Nutzdaten – das Image enthält nur statische HTML‑, CSS- und JavaScript‑Dateien und benötigt keine persistenten Volumes.[1][3]

3. Datei .env mit der LAN-IP erstellen

Damit der Port nur auf der LAN-Schnittstelle lauscht und nicht versehentlich von außen erreichbar ist, legst du die IP in einer Umgebungsvariablen-Datei fest:[4]

nano .env

Inhalt der .env:

LAN_IP=192.168.1.50

Ersetze 192.168.1.50 durch die tatsächliche LAN-IP deines Servers aus Schritt 1. Die Datei sollte nach der Erstellung nur von dir lesbar sein – sie enthält zwar kein Passwort, aber die IP gibt einen Angriffspunkt preis:

chmod 600 .env

4. Docker-Compose-Datei erstellen

Erstelle compose.yaml im selben Verzeichnis:

services:
  openspeedtest:
    image: openspeedtest/latest
    container_name: openspeedtest
    restart: unless-stopped
    ports:
      - "${LAN_IP}:3000:3000"
Einstellung Bedeutung
image: openspeedtest/latest Offizielles Docker-Image von OpenSpeedTest; basiert auf nginxinc/nginx-unprivileged:stable-alpine[1][2]
container_name: openspeedtest Eindeutiger Containername für docker‑Befehle
restart: unless-stopped Startet den Container nach einem Neustart des Hosts automatisch wieder
ports: "${LAN_IP}:3000:3000" Bindet Port 3000 ausschließlich an die LAN-IP – kein Zugriff von außen ohne Router-Freigabe

Der Container stellt außerdem auf Port 3001 HTTPS mit einem selbstsignierten Zertifikat bereit.[2] Für die reine Diagnose im vertrauenswürdigen Heimnetz reicht HTTP auf Port 3000. Port 3001 sollte nur freigegeben werden, wenn du die Zertifikatskonfiguration verstehst – die selbstsignierte Variante führt sonst zu unnötigen Browser-Warnungen.

5. Konfiguration prüfen und Image laden

Prüfe, ob die Compose-Datei und die .env korrekt sind:

docker compose config

Zeigt die Ausgabe die expandierte IP (ports: 192.168.1.50:3000:3000), ist alles richtig. Fehlt eine Variable, liegt die .env nicht im selben Ordner oder der Schlüssel ist falsch geschrieben.

Lade das Docker-Image:

docker compose pull

Halte den Image-Digest für eine reproduzierbare Konfiguration fest:

docker image inspect openspeedtest/latest \
  --format '{{index .RepoDigests 0}}'

Notiere die ausgegebene Digest-Zeile. Wenn du später das Tag latest durch den Digest ersetzt, bleibt der Container jederzeit auf dem getesteten Stand.[1]

6. Container starten

docker compose up -d

Prüfe, ob der Container läuft:

docker compose ps
docker compose logs --tail=50 openspeedtest

Die Logs sollten eine vollständige Startmeldung ohne wiederkehrende Fehler zeigen.

7. Speedtest von einem anderen Gerät ausführen

Öffne auf einem zweiten Gerät (Handy, Notebook) im selben Netzwerk einen Browser und rufe auf:

http://192.168.1.50:3000

Ersetze 192.168.1.50 durch die IP deines Servers. Du siehst die OpenSpeedTest-Oberfläche mit einem Start-Button.

Der Test misst: - Download: Server → Client (Daten fließen vom Server zum Browser) - Upload: Client → Server (Daten fließen vom Browser zum Server) - Ping: Round-Trip-Latenz (Millisekunden) - Jitter: Schwankung der Latenz (Millisekunden)[5]

Führe je einen Test über WLAN (mobil) und über Ethernet (fest verkabelt) aus. Sind die Werte über Kabel deutlich höher, liegt das Problem am WLAN. Sind beide gleich niedrig, ist der Server oder das Netzwerk der Engpass.

8. Server-Name anpassen (optional)

Über die Umgebungsvariable SET_SERVER_NAME kannst du den Namen ändern, der in der Weboberfläche angezeigt wird. Ergänze die compose.yaml um den environment-Block:

services:
  openspeedtest:
    image: openspeedtest/latest
    container_name: openspeedtest
    restart: unless-stopped
    ports:
      - "${LAN_IP}:3000:3000"
    environment:
      - SET_SERVER_NAME=Heimnetz-Speedtest

Starte den Container nach der Änderung neu:

docker compose down
docker compose up -d

Backup und Rückweg

OpenSpeedTest speichert keine persistenten Nutzdaten. Zu sichern sind lediglich compose.yaml, .env und der notierte Image-Digest.

Stoppen und entfernen:

cd ~/docker/openspeedtest
docker compose down

Ein zuvor getestetes Image wiederherstellen: Trage den notierten Digest in image: ein, führe docker compose pull && docker compose up -d aus. Zum vollständigen Entfernen lösche anschließend den Projektordner.

Risiken

  • latest-Tag: openspeedtest/latest kann sich jederzeit ändern. Notiere vor Aktualisierungen den Digest und den aktuellen Funktionszustand.
  • Kein Passwortschutz: Jeder, der die IP und den Port kennt, kann einen Speedtest ausführen. Binde den Port deshalb nur an die LAN-IP und gib keine Router-Portweiterleitung frei.
  • Ressourcen-Auslastung: Speedtests erzeugen kurzzeitig hohe Netzwerklast. Führe keine unbeaufsichtigten Dauertests aus.
  • „Secure by Design“: Der Hersteller bezeichnet die Anwendung wegen der statischen Dateien als „secure by design“.[3] Das befreit nicht von regelmäßigen Updates des Containers und des Docker-Hosts.

Typische Fehler

Problem Ursache und Lösung
Browser zeigt „Verbindung abgelehnt“ Falsche LAN_IP in der .env, Container nicht gestartet, Port 3000 bereits belegt oder Firewall blockiert.
docker compose config meldet fehlende Variable .env fehlt, liegt im falschen Ordner oder LAN_IP ist falsch geschrieben.
Testwerte sind deutlich niedriger als erwartet WLAN-Signal, 2,4‑GHz‑Verbindung, Energiesparmodus am Client oder langsamer Ethernet-Port prüfen.
Werte entsprechen ungefähr dem Internet-Tempo Möglicherweise hast du einen externen Speedtest-Dienst im Browser statt des lokalen Tests aufgerufen.
Reverse Proxy bricht den Upload ab POST-Request-Limit unter 35 MB oder Proxy-Timeout unter 60 Sekunden – beides erhöhen.[3]
HTTPS-Warnung auf Port 3001 Selbstsigniertes Zertifikat – für das Heimnetz Port 3000 ohne HTTPS verwenden.

9. Funktionsprüfung (abschließend)

  1. docker compose config endet ohne Fehler.
  2. docker compose ps zeigt den Container als laufend.
  3. docker compose logs --tail=50 openspeedtest zeigt keine wiederkehrenden Startfehler.
  4. curl -I http://192.168.1.50:3000/ liefert eine erfolgreiche HTTP-Antwort (HTTP/1.1 200 oder 301).
  5. Die Oberfläche ist von mindestens einem zweiten Gerät im Heimnetz erreichbar.
  6. Ein Test über Ethernet und einer über WLAN liefern unterschiedliche, plausible Werte.
  7. Der Container startet nach docker compose restart zuverlässig neu.
  8. Von außerhalb des Heimnetzes (z. B. Mobilfunk) ist http://<deine-öffentliche-IP>:3000/ nicht erreichbar (keine Router-Portweiterleitung konfiguriert).

Fertig

Du betreibst jetzt einen lokalen Speedtest-Server, der unabhängig von Internet-Verbindung und externen Diensten arbeitet. Wiederhole die Tests in regelmäßigen Abständen und dokumentiere die Werte – so erkennst du Verschlechterungen im WLAN oder an der Verkabelung, bevor sie zum Problem werden.

Sources: [1] https://github.com/openspeedtest/Docker-Image — OpenSpeedTest Docker Image – GitHub [2] https://hub.docker.com/r/openspeedtest/latest — openspeedtest/latest – Docker Hub [3] https://openspeedtest.com/selfhosted-speedtest — OpenSpeedTest Self-Hosted SpeedTest – Offizielle Seite [4] https://docs.docker.com/engine/network/port-publishing — Docker Port Publishing – Docker Docs [5] https://selfhosting.sh/apps/openspeedtest — Self-Hosting OpenSpeedTest – Praxisguide [6] https://www.youtube.com/watch?v=VOl5hybFfnA — How to install OpenSpeedTest on Docker – YouTube (Jeremy Leik)