Benutzer-Werkzeuge

Webseiten-Werkzeuge


projekte:docker:start

Docker Swarm Hausautomationscluster

Ausgangslage

Ich habe zur Zeit einige Anwendungen wie einen Apache Proxy für Homematic, Pi-Hole, Iobroker und andere auf vier Raspberry PIs laufen und hatte jetzt gerade mit Rhasspy zur Spracherkennung und -steuerung für Homematic angefangen. Da es auch ein Docker Image für Rhasspy gibt kam die Idee auf erstmal einen Docker Swarm Cluster mit den noch vorhandenen zwei Raspberry Pis aufzubauen (3 Manager und 3 Worker Nodes) um flexibler zu sein und auch Updates der einzelnen Anwendungen einfacher zu machen. Desweiteren ist natürlich auch das ausprobieren neuer Anwendungen wesentich einfacher und sauberer möglich.

Dabei standen folgende Bedingungen im Vordergrund die dann auch die Konfiguration und Aufbau beeinflussten:

  • Cluster bzw. feste IP Adresse(n) damit z.B. der Pihole DNS unter immer unter der gleichen Adresse erreichbar ist.
  • Die Möglichkeit die Verteilung der Container auf einzelne Docker Nodes zu beschränken.
  • Kein extra Loadbalancer sei es Hardware oder Software.

Vor allem erste Punkt ist wichtig da man bei Docker zwar den Container dann unter dem gleichen Port auf einem de anderen Nodes erreichen kann aber wenn man, wie bei der AVM Fritzbox, nur eine DNS-Server Adresse eintragen und im Heimnetz verteilen kann braucht man das unbedingt. Auch für andere Anwendungen wie den Apache Proxy brauche ich eine IP-Adresse die ich dann ansprechen kann. Oft wird bei Docker ein Loadbalancer vorgeschaltet aber das wollte ich nicht da damit wieder zwei Raspberry PIs verloren gehen, Stichwort Redundanz.

Die Lösung die ich aufgebaut habe kombiniert keepalived, ein einfacher Daemon der eine virtuelle IP zwischen verschiedenen Servern je nach Verfügbarkeit schwenken kann und traefik, einem Loadbalancer Container, der nicht nur http/https kann sondern auch z.B. Port 53 tcp und udp für DNS.

Die Voraussetzungen dafür sind leider auch Einiges:

  • 4-6 Raspberry PIs (PI 4 Model B, mindestens 2GB besser 4/8GB)
  • Gemeinsamer Storage per NFS (bei mir eine Synology)
  • Zwei Zigbee USB-Sticks (fuer Xiaomi/aqara Devices)
  • Eventuell eigener 8-Port Switch

Das Ganze soll dann schlussendlich so aussehen:

Die etwas willkürlich erscheinende Verteilung der IP-Adressen kommt daher das ich, die zukünftigen, dockerman03 und dockerwrk02 noch in Benutzung habe und erst nachher hinzufügen werde. Ihr könnt natürlich aufsteigende IP-Adressen benutzen.

Für die die es interessiert: Ich hatte zwei Cluster aus jeweils zwei PIs in Betrieb auf denen Apache Proxy, Pihole, Grafana und Iobroker installiert waren. Diese sollten ja gerade durch die Docker-Lösung abgelöst werden.

Zu einigen Punkten habe ich im Internet keine Lösung gefunden die alle meine Anforderungen erfüllt daher veröffentliche ich meine Lösung hier da ich glaube das auch andere diese Notwendigkeiten haben.

Installation/Clusteraufbau

Docker/Anwendungsbasis:

  1. 4-n Raspberry PIs mit Betriebssystem
  2. keepalived (Daemon um eine oder mehrere Cluster-IPs zur Verfügung zustellen)
  3. docker (Der Name sagt es schon, docker eben)
  4. docker-compose (Um Konfigurationen zu Container und Stacks/Services in Textdateien zu definieren)
  5. Docker Swarm (Die Clusterumgebung/-unterstützung für docker)
  6. portainer (Der erste Container mit dem man die folgenden Container in einer Wewboberfläche verwalten kann)
  7. traefik (Container der als Loadbalancer für die Dienste arbeitet)
  8. docker-registry (Um Container und Images lokal zu halten so das alle Dockernodes darauf zugreifen koennen)
  9. docker-viz (Grafische Docker Swarm Ansicht im Browser)

Damit ist die Basis des Swarm Cluster mit fester IP Adresse (172.17.200.21-.24) fertig und kann für die eigentlichen Anwendungscontainer genutzt werden, wobei ich die 172.17.200.24 für die Anwendungen benutze.

Um nicht den Überblick über die Container und deren Ports zu verlieren habe ich mir dafür eine Tabelle erstellt. Ich brauche ja für die meissten Container einen oder mehrere exklusive Ports über die dann darauf zugegriffen werden kann.

Port Container Anmerkung
80 traefik Anwendungsproxy/Loadbalancer für http
443 traefik Anwendungsproxy/Loadbalancer für https
8000 Portainer Zugriffsport für den Edge Agent, näheres dazu in Edge Agent Dokumentation
8080 traefik Web Administrationsoberfläche
9000 Portainer Webzugriff per http
9443 Portainer Webzugriff per https

Anwendungscontainer

Allgemeine Konfiguration für docker compose/swarm:

restart: unless-stopped
deploy:
  placement:
    constraints:
      - node.labels.traefik-node == true (Nodes auf denen traefik laufen soll)
      - node.role == manager (Nur auf manager Nodes)
      - node.role == worker (Nur auf worker Nodes)
      - node.labels.ram16 == true (Nur auf Nodes mit 16GB RAM)
  1. apache2 als Proxy für die Homematic CCU und andere Infoseiten.
  2. Pihole als DNS-Server /Werbeblocker
  3. node-red zur Automatisierung von Abläufen im Smarthome
  4. influxdb zur Datenhaltung für grafana aus verschiedenen Quellen
  5. grafana Datenvisualisierung, Kurven, Blockdiagrame etc
  6. iobroker Integration von weiteren Komponenten ins Smarthome

(Geplante) Anwendungscontainer

Anwendung Beschreibung
Apache2 Proxy für externen Zugriff auf Webanwendungen mit manuellem Certbot für Letsencrypt
Audiobookshelf Verwaltung meiner Hörbücher, Weboberfläche für den Zugriff
CCU-Historian Historie meiner Homematic CCU Werte, wird zum Export an Grafana benutzt
Changedetection Überwachung externer Webseiten auf Änderungen. Benutze das um zu sehen ob es neue Apache httpd oder Tomcat Versionen gibt
Check_MK Speziellere Überwachung von Geräten und Diensten, Alarmierung über Telegram
EcoDMS Dokumentenverwaltung: Rechnungen, Anleitungen etc
Emby Mein Mediaportal für Webbrowser, Dreambox etc. Verwaltung und Archivierung meiner Filme, TV-Serien und Dokumentationen. Automatisches Herunterladen von Infoseiten aus dem Internet zu Filmen und Serien
Grafana Langzeitgrafiken meiner Homematic CCU-Werte, Feuchte/Düngung der Balkonkästen und Gasflaschengewicht
Grocy Haushaltsverwaltung: Wiederkehrende Haushaltsaufgaben, Rezepte, Einkaufszettel
Guacamole Fernzugriff auf SSH und RDP/X11
Heimdall Portal für alle Webanwendungen auf Docker
Homeassistant Ergänzung zur Homematic CCU3
InfluxDB DB zur Speicherung der Werte der Balkonkästen und Gasflasche für Grafana
Iobroker Ergänzung zur Homematic CCU3. Tabletoberfäche per VIS, Automationen mit Node-Red
IT-Tools Diverse IT-Tools per Weboberfläche
JDownloader Downloadmanager für das Herunterladen von Dateien, Youtube Videos etc
Joplin Notiz-App. Server zu der App auf meinem Android Mobiltelefon
MariaDB Allgemeine MariaDB für alle möglichen Anwendungen
Mosquitto-MQTT MQTT Broker für Zigbee Geräte, meldet an Homeassistant
Node-Red Flowchart-Programmierung von Automationen für Iobroker/Homeassistant
Photoprism Fotoverwaltung, Archivierung und
Pihole DNS-Filter für Werbeseiten, -banner etc
Portainer Verwaltung meines Docker Swarm
Sabnzbd Downloadmanager für Usenet NZB-Dateien
Snipe-IT Geräteverwaltung für meinen Haushalt (Anschaffungsdatum, Preis, Seriennummer)
Traefik Anwendungsproxy und Loadbalancer für meine Docker Anwendungen
TVHeadend Proxy/Rekorder für Internet TV Sender
Uptime-Kuma Einfache Überwachung für Erreichbarkeit von Anwendungen per IP oder Webseite
Viz Grafische Webanzeige meines Docker Swarm Clusters
Wekan Projektverwaltung
  1. Rhasspy als echthe offline Spracherkennung für die Hausautomation
  2. Homematic zur Ablösung der CCU3

Certbot für Reverse-Proxy

Hardwaretausch

Wenn durch Fehler oder weil man aufrüsten will einer der Computer im Swarm Cluster ausgetauscht werden muss so kann man folgendermassen vorgehen:

Raspberry PI

  • Installation eines USB-Sticks mit dem rpi-imager um einen Benutzer und den Start des ssh Daemons vorzukonfigurieren.
  • ssh mit dem oben angelegten Benutzer und ändern der /etc/ssh/sshd_config. PermitRootLogin auf „yes“ setzen.
sudo apt install autofs mc (falls gewünscht)
sudo systemctl restart sshd
  • Installation der folgenden Pakete
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
apt update; apt -y upgrade;
  • Löschen des alten/defekten Nodes aus dem Swarm. Dazu auf einem Manager den Befehl (XXXXXX=Nodename):
docker inspect node XXXXXX (Notieren der Labels des Nodes, müssen am Ende wieder ergänzt werden)
docker node demote XXXXXX
docker node rm XXXXXX
  • Neuen Rechner in den Swarm integrieren. Je nach geplanter Aufgabe für den neuen Rechner (Manager oder Worker) muss einer der folgenden Befehle´ auf einem der bereits bestehenden Manager ausgeführt werden:

Worker: docker swarm join-token worker

Manager: docker swarm join-token manager
Den daraus resultierenden Befehl dann auf dem neuen Rechner ausführen.
  • Sleepmode verhindern:
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
  • Eventuelle Labels die vorher zu dem Node bestanden wieder ergänzen. Auf einem der Manager:
docker node update --label-add LABELNAME=WERT XXXXXX
  • Danach dann einen Reboot um zu kontrollieren das alles vernünftig wie gewollt startet und der Rechner wieder im Swarm ist.

Home Assistant Voice

Mit Atom Echo M5 Mikrofon/Lautsprecher

  1. MQTT Broker Container
  2. Home Assistant + Whisper + Piper Container
  3. Openwakework Container (Mehrere Ports für verschiedene Hardware/Räume)
  4. Language Files fuer Piper runterladen https://huggingface.co/rhasspy/piper-voices/tree/main
  5. NICHT den Original openwakeword Container sondern den rhasspy/wyoming.openwakeword
projekte/docker/start.txt · Zuletzt geändert: 2024/01/03 13:46 von admin