himpler.com himpler.com

Smart Home Setup mit Docker

6 Min.

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.

Konfiguration einer neuen Sicherung

Konfiguration einer neuen Sicherung

Das Source Verzeichnis wird als Backup Quelle definiert

Das Source Verzeichnis wird als Backup Quelle definiert

Fertiges Backup

Fertiges Backup

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.

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.

Das könnte dir auch gefallen