Dieser Beitrag wurde seit einem Jahr nicht mehr aktualisiert. Im Internet ist das manchmal eine halbe Ewigkeit. Es kann daher sein, dass die Informationen und Links nicht mehr aktuell sind.
Automatisches Backup, einfache Aktualisierung und größtenteils plattformunabhängig. Mit einem Docker Setup lässt sich das smarte Zuhause individuell aufbauen und mit wenig Aufwand betreiben. Was erstmal kompliziert klingt ist nach ein wenig Einarbeitung gar nicht so schwierig und lässt sich leicht an die eigenen Bedürfnisse anpassen.
Docker und Docker-Compose
Docker ist eine Software, mit der sich Container auf fast allen Systemen ausführen lassen. Diese Container enthalten je ein Programm, wie zum Beispiel Node-RED, HomeAssistant oder einen Webserver. Dabei werden alle Abhängigkeiten im Container mitgeliefert. So ist zum Beispiel keine separate Installation von npm nötig. So können durch die Containerisierung und gekapselten Programme keine Versionskonflikte auftreten.
Im Gegensatz zu vollständigen Virtualisierungen haben die Container im Regelfall keinen großen Platzbedarf und können so auch auf kleineren Umgebungen laufen. Beispielsweise eignet sich ein Synology NAS mit Docker Unterstützung oder auch ein Rapsberry Pi als stromsparender Host für die eigene Containerlandschaft.
Zur einfacheren Verwaltung und zur Verbindung einzelner Container gibt es unter anderem Docker Compose. Über eine YAML-Datei können mehrere Container definiert und zur Zusammenarbeit konfiguriert werden.
Das Smarthome Setup im Detail
Ein smartes Zuhause lebt von seiner individuellen Ausgestaltung. So bestimmen nicht zuletzt die persönlichen Vorlieben des Hausherren die gewünschte Software. Das folgende Setup soll daher nur eine Anregung zur Gestaltung eines Softwarestacks auf Basis von Docker Containern darstellen.
Die Definition des Softwarestacks erfolgt über eine neue Datei: docker-compose.yaml
Diese wird zu Beginn mit der Versionsnummer und anschließend mit dem Key services
gefüllt:
version: "3.7"
services:
Im Anschluss lassen sich die gewünschten Container unter services
ergänzen. Oft findet man die benötigten Angaben als Beispiel in der Dokumentation des Containers unter https://hub.docker.com.
Für Node-RED kann beispielsweise die Konfiguration in der Datei wie folgt ergänzt werden:
nodered:
container_name: nodered
image: nodered/node-red
restart: unless-stopped
user: "0"
privileged: true
environment:
- TZ=Europe/Berlin
ports:
- 1880:1880
volumes:
- ./volumes/nodered/data:/data
Dienste Starten, Stoppen und Aktualisieren
Um die neu hinzugefügte Software zu administrieren, bietet Docker Compose ein Menü für die Kommandozeile an. Mit docker-compose [up|stop]
lassen sich alle Dienste starten und stoppen. Führt man docker-compose pull
aus, werden die Container aktualisiert. Im Anschluss an die Aktualisierung müssen die Container neu gestartet werden.
Damit nicht immer alle in der docker-compose.yaml
definierten Dienste angesprochen werden, kann man die Befehle auch mit Angabe des Containernamens auf einzelne Container beschränken. So startet docker-compose up nodered
nur unseren zuvor definierten Node-RED Container. docker-compose pull nodered
sorgt demzufolge für die Aktualisierung des Node-RED Containers.
Um die Container im Hintergrund laufen zu lassen, fügt man dem Startbefehl ein -d
(für „detach“) hinzu.
Verwaltung über ein User Interface
Wem die Bedienung über die Kommandozeile auf Dauer zu kompliziert oder nicht komfortabel genug ist, kann auf einen weiteren Docker Container zurückgreifen. Portainer bietet eine grafische Oberfläche zur Administration. Zusätzlich lassen sich beispielsweise auch die Logs der Container komfortabel einsehen.
portainer:
container_name: portainer
image: portainer/portainer
restart: unless-stopped
ports:
- 9000:9000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./volumes/portainer/data:/data
Mit docker-compose up -d portainer
wird das Image geladen und ausgeführt. Über https://localhost:9000 (Localhost muss durch die Adresse des Docker Servers ersetzt werden) erreicht man die GUI. Die ausführliche Dokumentation bietet einen guten Überblick über die Möglichkeiten des Tools.
Automatische Updates mit Watchtower
Smart ist es, wenn man sich um die Software im Hintergrund möglichst wenig kümmern muss. Mit Watchtower können Updates der Container vollständig automatisiert werden. So ist man stets mit der aktuellsten Version der Container unterwegs.
Dazu tragen wir folgendes in die docker-compose.yaml
ein:
watchtower:
container_name: watchtower
restart: unless-stopped
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json
Bei kritischen Prozessen sollten die Updates besser nicht vollautomatisch ablaufen. Mit der Ergänzung von command: --no-pull
in der Definition des Containers werden die Updates ausschließlich nach einem manuellen Pull (docker compose pull
) durchgeführt. Alternativ lassen sich über Labels auch einzelne Container vom Update Prozess ausschließen. Weitere Infos findet man in der Dokumentation.
Automatisches Backup mit Duplicati
Spätestens wenn alle Automationen mühsam erstellt wurden sichert man die Konfiguration und erzeugte Daten besser gegen Datenverlust ab. Auch hier macht eine Lösung Sinn, um die man sich möglichst wenig kümmern muss. Duplicati ist eine kostenfreie Backup Software, die ebenfalls Platz in unserem Softwarestack findet. In Duplicati können viele Storage Provider (z.B. Dropbox, AWS, Google Drive etc.) als Backup-Ziel angebunden werden. Um Datensicherheit zu gewährleisten, werden Backups verschlüsselt und anschließend automatisch am konfigurierten Speicherort abgelegt.
duplicati:
container_name: duplicati
image: duplicati/duplicati:linux-arm32v7-canary
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
volumes:
- ./volumes:/source
ports:
- 8200:8200
Bei Duplicati muss auf die Auswahl des richtigen Images geachtet werden. Im Beispiel oben wird das Image für einen ARM Prozessor (z.B. Raspberry Pi) verwendet. Nach Starten des Containers (docker-compose up -d duplicati
) und einem Aufruf des Webinterfaces über den Port 8200
, lässt sich das automatische Backup über die Gui konfigurieren. Dabei wird man in fünf Schritten durch den Prozess geführt. Eine nähere Beschreibung spare ich mir; die Schritte sind alle intuitiv abzuarbeiten. Wichtig ist die Auswahl des Quellverzeichnisses source
, in welches über die docker-compose.yaml
der Speicherort für die Daten der Docker Container eingebunden wurde. Die folgenden Screenshots vermitteln einen Eindruck der aufgeräumten Oberfläche.
Zusammenfassung
Sind alle Definitionen aus den Beispielen oben eingebunden, sollte die docker-compose.yaml
in etwa so aussehen:
version: "3.7"
services:
nodered:
container_name: nodered
image: nodered/node-red
restart: unless-stopped
user: "0"
privileged: true
environment:
- TZ=Europe/Berlin
ports:
- 1880:1880
volumes:
- ./volumes/nodered/data:/data
portainer:
container_name: portainer
image: portainer/portainer
restart: unless-stopped
ports:
- 9000:9000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./volumes/portainer/data:/data
watchtower:
container_name: watchtower
restart: unless-stopped
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json
duplicati:
container_name: duplicati
image: duplicati/duplicati:linux-arm32v7-canary
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
volumes:
- ./volumes:/source
ports:
- 8200:8200
Die Datei lässt sich anhand der Beispiele beliebig ergänzen. Inzwischen gibt es viele Apps im Smarthome Bereich ebenfalls als Docker-Container. Für weitere Anregungen hier eine mit Sicherheit unvollständige Liste von interessanten Images in zufälliger Reihenfolge.
- ioBroker - Eine Smarthome Zentrale
- HomeAssistant - Eine Smarthome Zentrale
- openHab - Eine Smarthome Zentrale
- MagicMirror - Smarthome Dashboard
- Zigbee2Mqtt - Zigbee-MQTT Bridge
- nextcloud - Eigene Cloud mit Kontaktverwaltung usw.
- pihole - DNS Werbeblocker
- Mosquitto - Ein MQTT Broker
- Traefik - Ein Router für eingehende Requests
Als kleinen Bonus zu dieser Anleitung habe ich ein kleines Bashscript geschrieben, welches euch auf einem Raspberry Pi die Installation von Docker und Docker-Compose abnimmt. Zusätzlich wird die oben gezeigte docker-compose.yaml
bereits als Beispiel im Benutzerverzeichnis angelegt. Für den Start der Container muss dann docker-compose up -d
ausgeführt werden.
Die Installation erfolgt mit curl -ssL https://himpler.com/smarthome-setup | sh
über die Kommandozeile des Raspberrys.
Wer Hilfe beim Aufsetzen des Raspberrys benötigt, kann auf meinen Einsteiger Guide zurückgreifen.