====== 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: {{:projekte:docker:uebersicht.png|}} 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: - 4-n Raspberry PIs mit [[projekte:docker:raspberry:start|Betriebssystem]] - [[projekte:docker:keepalived:start|keepalived]] (Daemon um eine oder mehrere Cluster-IPs zur Verfügung zustellen) - [[projekte:docker:docker:start|docker]] (Der Name sagt es schon, docker eben) - [[projekte:docker:docker-compose:start|docker-compose]] (Um Konfigurationen zu Container und Stacks/Services in Textdateien zu definieren) - [[projekte:docker:swarm:start|Docker Swarm]] (Die Clusterumgebung/-unterstützung für docker) - [[projekte:docker:portainer:start|portainer]] (Der erste Container mit dem man die folgenden Container in einer Wewboberfläche verwalten kann) - [[projekte:docker:traefik:start|traefik]] (Container der als Loadbalancer für die Dienste arbeitet) - [[projekte:docker:docker-registry:start|docker-registry]] (Um Container und Images lokal zu halten so das alle Dockernodes darauf zugreifen koennen) - [[projekte:docker:docker-viz:start|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 [[https://downloads.portainer.io/edge_agent_guide.pdf|Edge Agent Dokumentation]] | | 8080 | traefik | Web Administrationsoberfläche | | 9000 | Portainer | Webzugriff per [[https://172.17.200.24:9000|http]] | | 9443 | Portainer | Webzugriff per [[https://172.17.200.24:9443|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) - [[projekte:docker:container:apache2:start|apache2]] als Proxy für die Homematic CCU und andere Infoseiten. - [[projekte:docker:container:pihole:start|Pihole]] als DNS-Server /Werbeblocker - [[projekte:docker:container:node-red:start|node-red]] zur Automatisierung von Abläufen im Smarthome - [[projekte:docker:container:influxdb:start|influxdb]] zur Datenhaltung für grafana aus verschiedenen Quellen - [[projekte:docker:container:grafana:start|grafana]] Datenvisualisierung, Kurven, Blockdiagrame etc - [[projekte:docker:container:iobroker:start|iobroker]] Integration von weiteren Komponenten ins Smarthome - [[projekte:docker:container::start|]] ===== (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 | - [[projekte:docker:container:rhasspy:start|Rhasspy]] als echthe offline Spracherkennung für die Hausautomation - [[projekte:docker:container:homematic:start|Homematic]] zur Ablösung der CCU3 - [[projekte:docker:container:homeassistant:start|HomeAssistant]] - [[projekte:docker:container::start|]] [[projekte:docker:certbot:start|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 - MQTT Broker Container - Home Assistant + Whisper + Piper Container - Openwakework Container (Mehrere Ports für verschiedene Hardware/Räume) - Language Files fuer Piper runterladen https://huggingface.co/rhasspy/piper-voices/tree/main - NICHT den Original openwakeword Container sondern den rhasspy/wyoming.openwakeword