Dashy mit Docker installieren: Hochgradig anpassbares Homelab-Dashboard
Dashy bündelt Ihre selbstgehosteten Dienste auf einer Seite: Status-Checks, über 50 Widgets, UI-Editor und Themes, ohne Datenbank. Die Anleitung zeigt den Betrieb mit Docker Compose, getestet mit Dashy 4.9.
Mit KI erstellt – redaktionelle Prüfung ausstehend
Werbung Mit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Wer mehrere selbstgehostete Dienste betreibt, kennt das Problem: Bookmarks im Browser reichen irgendwann nicht mehr aus, und der Überblick über laufende Container geht verloren. Dashy löst das mit einem zentralen Homelab-Dashboard, das alle Dienste auf einer Seite versammelt, sie per HTTP-Ping auf Erreichbarkeit prüft und mit über 50 eingebauten Widgets (Wetter, RSS, Pi-Hole-Statistiken, Proxmox-Ressourcen, Krypto-Kurse und vieles mehr) anreichert. Dashy benötigt keine Datenbank, die gesamte Konfiguration steht in einer YAML-Datei. Diese Anleitung richtet sich an Administratoren, die Docker Compose kennen und Dashy auf einem Linux-Host, einer VM oder einem NAS betreiben möchten.
Voraussetzungen
- Linux-Host, VM oder NAS mit Docker Engine und Docker Compose v2 (Plugin oder Standalone). Falls noch nicht installiert: Docker und Docker Compose auf Linux installieren.
- Mindestens 256 MB freier RAM, 1 CPU-Kern, x86-64 oder ARM. Dashy 4.7.10 belegt im Leerlauf rund 50 MB RAM.
- Mindestens 1 GB freier Speicherplatz für das Docker-Image (rund 540 MB entpackt, Stand 4.7.10).
- Netzwerkzugriff auf den gewählten Host-Port (Standard: 4000) vom Browser aus.
- Optional: ein Reverse Proxy (Traefik, Nginx, Caddy) für HTTPS. Die Grundkonfiguration dazu ist in Traefik als Docker-Reverse-Proxy beschrieben.
- Texteditor (VS Code, Nano, Vim) für YAML-Dateien sowie
curlzur CLI-Verifikation.
Schritt 1: Projektordner und Verzeichnisstruktur anlegen
Legen Sie einen eigenen Projektordner für Dashy an und erstellen Sie darin das Verzeichnis user-data, das später als Volume in den Container gemountet wird. Das Volume muss zwingend als Verzeichnis eingebunden werden, nicht als einzelne Datei, andernfalls schlägt das Laden von Sub-Konfigurationen, Icons und Custom-CSS fehl. Ältere Anleitungen im Netz zeigen noch den veralteten Pfad /app/public/conf.yml. Der korrekte Pfad seit Version 3.x lautet /app/user-data.
$ mkdir -p /opt/dashy/user-data
$ cd /opt/dashySetzen Sie die Eigentümerschaft auf UID 1000, unter der Dashy im Container läuft. Gehört das Verzeichnis einem anderen Benutzer, kommt es beim Speichern der Konfiguration zu einem EACCES-Fehler:
$ sudo chown -R 1000:1000 /opt/dashy/user-dataDas Verzeichnis /opt/dashy/user-data muss existieren und UID/GID 1000 gehören:
$ ls -la /opt/dashy/# Erwartete Ausgabe (Auszug):
# drwxr-xr-x 2 1000 1000 4096 Jun 11 10:00 user-dataSchritt 2: .env-Datei anlegen
Alle umgebungsabhängigen Werte gehören in eine .env-Datei, damit compose.yaml portabel bleibt. Dashy benötigt keine Datenbank-Passwörter oder API-Secrets als Pflichtparameter. Der wichtigste Wert ist der externe Host-Port. Der Container läuft fest mit UID 1000, deshalb gehört user-data diesem Benutzer (Schritt 1).
# /opt/dashy/.env
# Externer Host-Port für die Dashy Web-UI (interner Container-Port ist immer 8080)
DASHY_PORT=4000Die Datei muss vorhanden und lesbar sein:
$ ls -la /opt/dashy/.env# -rw-r--r-- 1 root root ... .envSchritt 3: compose.yaml erstellen
Erstellen Sie die compose.yaml im Projektordner. Das Image lissy93/dashy:latest ist ein Multi-Arch-Manifest und unterstützt amd64, arm64 und arm/v7 (kein separates Tag für Raspberry Pi oder andere ARM-Geräte nötig). Für reproduzierbare Updates schreiben Sie eine feste Version fest, etwa :4.9.0 (Stand Oktober 2026). Als Alternative bei Docker-Hub-Rate-Limits steht ghcr.io/lissy93/dashy:latest bereit.
| Parameter | Wert | Hinweis |
|---|---|---|
| Image | lissy93/dashy:latest | Multi-Arch; alternativ ghcr.io/lissy93/dashy:latest |
| Interner Port | 8080 | Fest; nicht änderbar |
| Externer Port | 4000 (via .env) | Frei wählbar |
| Volume | ./user-data:/app/user-data | Verzeichnis, NICHT Einzeldatei |
| NODE_ENV | production | Pflicht für Produktivbetrieb |
| Healthcheck | node /app/services/healthcheck.js | Eingebaut, kein extra Tool nötig |
# /opt/dashy/compose.yaml
services:
dashy:
container_name: dashy
image: lissy93/dashy:latest
ports:
- "${DASHY_PORT:-4000}:8080"
volumes:
- ./user-data:/app/user-data
environment:
- NODE_ENV=production
restart: unless-stopped
healthcheck:
test: ['CMD', 'node', '/app/services/healthcheck.js']
interval: 1m30s
timeout: 10s
retries: 3
start_period: 30sYAML-Syntax prüfen, bevor der Container gestartet wird:
$ docker compose config# Erwartete Ausgabe: die geparste compose.yaml ohne FehlermeldungSchritt 4: Container starten
Starten Sie Dashy im Hintergrund. Beim ersten Start lädt Docker das Image. Einen Frontend-Build zur Laufzeit gibt es seit Version 4 nicht mehr, der Server steht nach wenigen Sekunden. Liegt in user-data noch keine conf.yml, meldet das Log Config file could not be found. Legen Sie die Datei dann wie in Schritt 5 an.
$ cd /opt/dashy
$ docker compose up -dDen Start live verfolgen:
$ docker compose logs -f dashyDas Dashboard ist startklar, sobald in den Logs Your new dashboard is now up and running erscheint.
$ docker compose ps# NAME IMAGE COMMAND SERVICE STATUS PORTS
# dashy lissy93/dashy:latest ... dashy Up (healthy) 0.0.0.0:4000->8080/tcp$ curl -I http://localhost:4000# HTTP/1.1 200 OKSolange der Healthcheck noch im start_period liegt, zeigt docker compose ps den Status Up (health: starting). Das ist normal und kein Fehler. Nach unter einer Minute wechselt er zu Up (healthy).
Schritt 5: Erste Konfiguration im Browser
Öffnen Sie http://<HOST-IP>:4000 im Browser. Ohne eigene conf.yml zeigt Dashy eine Standardansicht. Es gibt zwei Wege, das Dashboard anzupassen:
- Visueller UI-Editor: Klicken Sie auf das Zahnrad-Symbol oben rechts, dann auf „Edit“. Hier lassen sich Abschnitte, Links und Widgets per Formular hinzufügen, ohne YAML anfassen zu müssen. Änderungen werden direkt in
./user-data/conf.ymlgeschrieben. - Direkte YAML-Bearbeitung: Bearbeiten Sie
/opt/dashy/user-data/conf.ymlmit einem Texteditor und laden Sie die Seite neu. Validieren Sie die Datei vorher unter yamllint.com, da ein YAML-Syntaxfehler zu einer leeren Dashboard-Ansicht führt.
Eine minimale conf.yml mit zwei Dienst-Links und aktiviertem Status-Check sieht so aus:
# /opt/dashy/user-data/conf.yml
appConfig:
theme: colorful
statusCheckInterval: 30
enableFontAwesome: true
pageInfo:
title: Mein Homelab
sections:
- name: Infrastruktur
items:
- title: Portainer
url: http://192.168.1.10:9000
icon: fab fa-docker
statusCheck: true
- title: Proxmox
url: https://192.168.1.20:8006
icon: fas fa-server
statusCheck: true
statusCheckUrl: https://192.168.1.20:8006/api2/json/version
statusCheckAllowInsecure: trueVerwenden Sie für lokale Dienste nie localhost oder 127.0.0.1. Aus dem Container heraus ist damit der Container selbst gemeint, nicht der Host. Nutzen Sie stattdessen die LAN-IP des Hosts (zum Beispiel 192.168.1.10) oder host.docker.internal (nur Docker Desktop).
curl -s http://localhost:4000/conf.yml | head -5 gibt Ihre Datei aus, docker compose logs dashy zeigt nach einem Neustart Config file is valid. Laden Sie die Seite im Browser neu. Die Status-Indikatoren neben den Links sollten nach wenigen Sekunden grün aufleuchten, wenn die Dienste erreichbar sind. Bei Konfigurationsänderungen, die nicht sichtbar werden: im Inkognito-Modus testen oder den Local-Storage-Cache über das Dashy-Menü leeren.
Schritt 6: Widgets einrichten
Dashy bietet über 50 eingebaute Widgets, die direkt in conf.yml unter einem widgets-Schlüssel in einem Abschnitt konfiguriert werden. Hier ein Beispiel mit einem Wetter-Widget und einem Pi-Hole-Widget:
sections:
- name: Übersicht
widgets:
- type: weather
options:
apiKey: IHR_OPENWEATHERMAP_KEY
city: Berlin
units: metric
lang: de
- type: pi-hole-stats
options:
hostname: http://192.168.1.5
hideStatus: falseAPI-Keys für Widgets können statt direkt in conf.yml auch als Umgebungsvariablen im Container gesetzt werden. Das ist sicherer, weil die Keys dann nicht in der Konfigurationsdatei landen. Dazu die Variable in .env eintragen und unter environment in compose.yaml referenzieren.
Nach einem Browser-Reload sollte das Widget im Dashboard erscheinen und Daten laden. Falls ein Widget leer bleibt, in den Browser-Entwicklertools (F12 → Konsole) auf CORS- oder API-Fehler prüfen.
Schritt 7: Authentifizierung einrichten (optional)
Ohne Authentifizierung ist das Dashboard öffentlich zugänglich, für ein rein lokales Heimnetz oft ausreichend. Für den Zugriff über das Internet ist ein Passwortschutz Pflicht. Dashy bietet eine eingebaute Nutzerverwaltung über appConfig.auth:
appConfig:
auth:
enableGuestAccess: false
users:
- name: admin
credentials: SHA256_HASH_DES_PASSWORTS
type: adminDen SHA-256-Hash des gewünschten Passworts erzeugen:
$ echo -n "MeinPasswort123" | sha256sum# Ausgabe: a1b2c3d4... (Hash kopieren und als credentials eintragen)Die eingebaute Authentifizierung ist client-seitig und gilt daher als leichtgewichtig. Für produktive Umgebungen empfiehlt sich Keycloak oder Header-Auth über einen vorgelagerten Reverse Proxy. Beide Varianten unterstützt Dashy nativ. Eine umfassende Lösung für Single Sign-On bietet Authentik oder Authelia mit Traefik Forward-Auth.
Nach dem Neuladen der Seite erscheint ein Login-Formular. Mit dem konfigurierten Benutzernamen und Passwort sollte der Zugang zum Dashboard möglich sein.
Schritt 8: Updates und Backup
Dashy aktualisieren:
$ cd /opt/dashy
$ docker compose pull
$ docker compose up -dVersion 4.8.0 bringt Kurznamen (Aliase) für den Schnellstart von Einträgen, ein neu gebautes Pi-hole-Widget für die API von Pi-hole v6 sowie vervollständigte deutsche Übersetzungen. Das Update einer 4.7.10-Instanz mit eigener conf.yml auf 4.8.0 läuft ohne Eingriff: Der Container ist nach rund einer Minute wieder healthy, das Log meldet Using Dashy V-4.8.0, und die Konfiguration bleibt erhalten.
Version 4.9.0 bringt laut Release Notes eine neue Workspace-Ansicht, ein Theme liquid-glass und behebt eine Lücke, über die Konfigurationsdateien per kodierter URL ohne Anmeldung lesbar waren. Neue Pflichtvariablen gibt es nicht. Beim Update von 4.8.0 auf 4.9.0 mit dieser Compose-Datei ist der Container nach wenigen Sekunden healthy, das Log meldet Config file is valid, no issues found und Using Dashy V-4.9.0, und die eigene conf.yml bleibt erhalten. Beachten Sie: Mit der eingebauten Anmeldung aus Schritt 7 liefert /conf.yml weiter HTTP 200 ohne Anmeldung, denn diese Anmeldung prüft nur der Browser. Zugangsdaten und interne Adressen in der conf.yml schützt erst ein vorgeschalteter Reverse Proxy mit Anmeldung.
Das einzige Backup-relevante Verzeichnis ist ./user-data. Es enthält conf.yml, benutzerdefinierte Icons, Fonts und CSS. Eine einfache Sicherung:
$ tar -czf dashy-backup-$(date +%Y%m%d).tar.gz /opt/dashy/user-data/Für eine durchdachte automatische Backup-Strategie: 3-2-1-Backup-Strategie umsetzen mit Restic.
$ docker compose ps# NAME IMAGE COMMAND SERVICE STATUS PORTS
# dashy lissy93/dashy:latest ... dashy Up (healthy) 0.0.0.0:4000->8080/tcp$ docker compose logs --tail=20 dashy# Keine Fehlerzeilen; letzte Zeile zeigt Server-StartGrundlagen zum Betrieb finden Sie in Docker Compose absichern: Secrets, Healthchecks, Non-Root.
Troubleshooting / Typische Fehler
Error, unable to find configoder leeres DashboardDas Volume wurde als einzelne Datei statt als Verzeichnis gemountet (zum Beispiel
-v ~/conf.yml:/app/user-data/conf.yml). Fix: Volume auf./user-data:/app/user-data(Verzeichnis) ändern und Container neu erstellen.EACCESoderEROFSbeim Speichern der KonfigurationDas Host-Verzeichnis gehört nicht UID 1000. Fix:
sudo chown -R 1000:1000 ./user-dataausführen und Container neu starten.Heap Limit Allocation Failedoder SIGKILL beim ersten StartBetrifft Dashy 2.x und 3.x, die das Frontend beim Start bauten. Fix: auf Version 4 aktualisieren oder dem Container mindestens 2 GB RAM zuweisen.
- HTTP 429 beim Image-Pull
Docker-Hub-Rate-Limit erreicht. Fix:
ghcr.io/lissy93/dashy:latestals Image-Quelle verwenden oderdocker loginausführen.Error, unable to validate conf.ymlYAML-Syntaxfehler (falsche Einrückung, fehlendes Leerzeichen). Fix: Datei unter yamllint.com validieren, Fehler beheben, Browser neu laden.
- Widgets oder Status-Checks erreichen lokale Dienste nicht
localhostoder127.0.0.1als Zieladresse verwendet. Fix: LAN-IP des Hosts (zum Beispiel192.168.1.10) oderhost.docker.internal(Docker Desktop) verwenden.- Konfigurationsänderungen nicht sichtbar
Browser-Local-Storage cached die alte Konfiguration. Fix: Seite im Inkognito-Modus öffnen oder über das Dashy-Menü den Cache leeren.
- Font-Awesome-Icons fehlen
Standard ist
enableFontAwesome: false. Fix:enableFontAwesome: trueunterappConfiginconf.ymlsetzen.- SELinux blockiert Schreibzugriff (Fedora, RHEL)
Das Speichern der Konfiguration schlägt still fehl. Fix: Volume-Mount mit
:Z-Flag versehen:./user-data:/app/user-data:Z.
Häufige Fragen
Braucht Dashy eine Datenbank (PostgreSQL, MySQL, Redis)?
Nein. Dashy ist vollständig datenbanklos. Die gesamte Konfiguration liegt in einer einzigen Datei: ./user-data/conf.yml. Es gibt keine externe Datenbankabhängigkeit. Das ist einer der Hauptgründe, warum der Betrieb so unkompliziert ist.
Wie ändere ich die Konfiguration nach dem ersten Start?
Entweder direkt die Datei ./user-data/conf.yml auf dem Host bearbeiten und danach den Browser-Cache leeren, oder den eingebauten visuellen UI-Editor im Browser unter dem Zahnrad-Symbol nutzen. Änderungen über den UI-Editor werden sofort in conf.yml geschrieben, sofern Schreibrechte korrekt gesetzt sind. Ein Containerneustart ist für Konfigurationsänderungen nicht erforderlich.
Läuft Dashy auf dem Raspberry Pi?
Ja. Das :latest-Image ist ein Multi-Arch-Manifest und unterstützt nativ amd64, arm64 und arm/v7. Kein separates Image oder Tag nötig: docker compose up -d funktioniert direkt auf allen unterstützten Architekturen. Seit Version 4 genügt auch ein Raspberry Pi mit 1 GB RAM, weil der Frontend-Build zur Laufzeit entfällt.
Wie richte ich Status-Checks für meine Dienste ein?
In conf.yml unter items das Flag statusCheck: true setzen. Dann wird die url des Links als Ping-Endpunkt genutzt. Mit statusCheckUrl lässt sich eine abweichende URL prüfen (zum Beispiel ein Health-Endpoint statt der UI-URL). Das globale Prüfintervall steuert statusCheckInterval (Sekunden) unter appConfig.
Kann Dashy hinter einem Reverse Proxy laufen?
Ja, problemlos. Den externen Port auf 80/443 leiten und Dashy intern auf Port 8080 lassen. Wenn Dashy unter einem Sub-Pfad erreichbar sein soll (zum Beispiel /dashy), die Umgebungsvariable BASE_URL=/dashy in compose.yaml ergänzen, ohne abschließenden Slash.
Wie sichere ich Dashy mit einem Passwort ab?
Unter appConfig.auth.users einen Nutzer mit name, credentials (SHA-256-Hash des Passworts) und type (admin oder viewer) anlegen. Den Hash erzeugt echo -n "Passwort" | sha256sum. Für produktive Umgebungen empfiehlt sich zusätzlich ein vorgelagerter Reverse Proxy mit Header-Auth oder Keycloak/OIDC, da die eingebaute Authentifizierung client-seitig arbeitet.
Fazit
Dashy eignet sich, wenn Sie Ihre selbstgehosteten Dienste unter einer einheitlichen Oberfläche vereinen wollen. Die datenbanklose Architektur und der UI-Editor erleichtern den Einstieg, Theme-System, mehrere Seiten und Authentifizierung reichen auch für größere Setups. Seit Version 4 ist Dashy sparsam genug für kleine Heimserver. Beachten Sie, dass die eingebaute Anmeldung nur clientseitig schützt. Wer ergänzend zur Dashboard-Übersicht tiefergehende Metriken seiner Container sammeln möchte, findet mit Beszel Server Monitoring mit Docker eine passende Ergänzung.
Weiterführende Anleitungen und Quellen
- Docker und Docker Compose auf Linux installieren: die Self-Hosting-Grundlage
- Traefik als Docker-Reverse-Proxy mit automatischem HTTPS einrichten
- Beszel Server Monitoring mit Docker einrichten
- 3-2-1-Backup-Strategie umsetzen mit Restic
Offizielle Quellen: Dashy GitHub Repository | Dashy Deployment-Dokumentation | Dashy Widget-Dokumentation


