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:
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:
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.
Docker/Anwendungsbasis:
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 |
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)
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 |
Wenn durch Fehler oder weil man aufrüsten will einer der Computer im Swarm Cluster ausgetauscht werden muss so kann man folgendermassen vorgehen:
sudo apt install autofs mc (falls gewünscht) sudo systemctl restart sshd
curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh apt update; apt -y upgrade;
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
Worker: docker swarm join-token worker
Manager: docker swarm join-token manager Den daraus resultierenden Befehl dann auf dem neuen Rechner ausführen.
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
docker node update --label-add LABELNAME=WERT XXXXXX
Mit Atom Echo M5 Mikrofon/Lautsprecher