NEWS
docker, Multihost auf MacOS
-
Hallo Zusammen!
Ich musste eine Weile probieren, bis ich einen Slave ioBroker-Container unter Docker auf meinem MacStudio als Docker-Host in mein ioBroker Setup einbinden konnte. Daher habe ich hier ein paar Anmerkungen aufgeschrieben, falls das noch einmal jemand versucht.
Zunächst einmal ist wichtig, daß man den Slave im Container NICHT mittels "iobroker multihost connect" in den existierenden Master/Slave-Verbund einhängen kann, denn 'iobroker multihost connect' findet den Master nicht!
Die Konfiguration als Slave muss unbedingt über Environment-Variablen zum Startzeitpunkt des Containers erfolgen. Gleiches gilt, wenn der Container seine States und Objects aus einer bestehenden Redis-(Sentinel) DB oder über einen anderen der möglichen Datenbanktypen erhalten soll. Auch hier funktioniert "iobroker setup custom" zunächst nicht.
Ich habe mir eine Datei mit den Environment Settings auf meinem Mac in einem lokalen Verzeichnis angelegt. Meine Konfiguration ist für ein Redis Sentinel mit 3 Nodes ausgelegt. Wer nur Redis oder etwas anderes nutzt, muss das entsprechend auf (s)eine IP und den Port 6379 usw. anpassen.
ioBroker-env/vars.env:
IOB_MULTIHOST=slave
IOB_OBJECTSDB_TYPE=redis
IOB_OBJECTSDB_HOST=192.168.178.xx1,192.168.178.xx2,192.168.178.xx3
IOB_OBJECTSDB_PORT=26379
IOB_STATESDB_TYPE=redis
IOB_STATESDB_HOST=192.168.178.xx1,192.168.178.xx2,192.168.178.xx3
IOB_STATESDB_PORT=26379Um besser an den ioBroker Log-Output des Containers zu kommen, habe ich das Verzeichnis /opt/iobroker mittels '-v' noch auf ein lokales Verzeichnis auf dem Mac-Host gemounted. Achtung: das Verzeichnis muss vor dem ersten Start des Containers unbedingt leer sein, sonst glaubt ioBroker, es handelt sich um eine bereits fertige Installation und kommt aus dem Tritt mit der initialen Installation!
Zusätzlich habe ich einige wichtige Ports expilzit aus dem Container nach aussen geführt. 'docker --net=host' ist unter MacOS nämlich mit Vorsicht zu genießen, denn es exponiert nur alle Ports auf der IP der Docker-Mac internen Virtualisierungsschicht.
Mein Docker-Aufruf lautet dann so (kann man natürlich auch noch in ein Dockerfile oder einen Compose-Aufruf packen), wobei ich halt den Container als Slave mit Hostnamen iobroker8 verwende. Der Hostname wird ja über den Parameter '-h' im Docker-Aufruf festgelegt, müsst ihr also nach Bedarf anpassen:
docker container create --restart always --name iobroker8 --env-file ioBroker-env/vars.env -v /PATH_TO_LOCAL_DIR/ioBroker:/opt/iobroker -p 1880:1880 -p 2001:2001 -p 8081:8081 -p 8082:8082 -p 8088:8088 -p 8284:8284 -p 9000:9000 -p 9001:9001 -h iobroker8 buanet/iobroker
So weit, so gut. Startet, updated sich, konfiguriert sich - Host wird im ioBroker-Verbund aber nicht als aktiv gezeigt. Und kommt dann in eine Restart-Loop wegen 'error: host.iobroker8 No connection to databases possible, restart'. 'iobroker status' meldet ebenfalls 'no connection to databases possible'.
Abhilfe ist hier dann doch der Aufruf von 'iobroker setup custom' in einer Shell des Containers. Anscheinend kennt ioBroker die IPs eines Redis oder eines Sentinels zwar aus der Environment-Konfiguration, muss aber trotzdem noch einmal auf dem neuen Slave 'iobroker setup custom' durchlaufen, ehe er den Sentinel Cluster findet und dann dem ioBroker-Verbund als neuer Slave beitritt. Vielleicht ein Bug?
Vielleicht hilft es ja dem ein oder anderen hier weiter!
Viele Grüße
Dirk -
@higginsd Danke! Ich hatte schon fast augegeben.
Habe übrigens festgestellt, dass ein leeres gemountetes /opt/iobroker bei mir zum Dauerneustart des Containers führt. Nur wenn ich es vorher lösche eird es angelegt und der Container erstellt.
Bei mir sind iob-master und redis zum Test auf dem Mac angelegt.
Der Slave soll auf einem Raspi laufen. Jetzt muss ich noch rausbekommen, wie ich redis im docker beibringen kann, Anfragen vom iob-slave akzeptiren soll.Wie hast du das bei dir gemacht?
Gruß
Reiner -
Hast Du beide Redis Ports 6379 und 26379 im Redis-Container exponiert?
Bei mir ging das eigentlich easy, ich habe auch eine Redis Instanz und eine Sentinel Instanz in docker laufen.
-
@higginsd Nein, nur 6379. 26379 kannte ich noch gar nicht.
iob-Master/redis werden mit docker-compose und default network auf dem Mac gestartet.
Der container-verbund hat dann ja eine eigen Network-ip. Innerhalb des Verbandes gibt es da ohnehin kein Problem. Die expose Ports können ja über die HOST-IP erreicht werden und innerhalb des Verbandes reicht ja der name.
Bei redis habe ich aber irgendwo mal gelesen, dass da im Standard nur Anfragen von 127.0.0.1 also in dem Fall default-network akzeptiert werden.
Der slave auf dem Raspi erreicht zwar den Host/port, kommt dann ja aber nicht mehr von 127.0.0.1.
Scheint so, als ob man das auch mit Sentinel machen könnte (habs nur ganz kurz überflogen).
Aber bei nur einem zusätzlichen Client(iob-Slave) ist das vlt. gar nicht nötig, wenn es über die config gehen sollte. -
@higginsd Ok, Kommando zurück. Läuft! Musste nur etwas warten bis der Host angezeigt wurde.
Meine Konfiguration ist etwas naja, ungewöhnlich.
Master im Verbund mit Redis und mqtt-broker auf Mac(Testsystem).
Slave als native Installation auf einem raspi 1. Hier läuft buanet/docker nicht, weil das Image kein ARMv6 unterstützt.
Native Installation out of the box geht auch nicht, weil nodejs offiziell auch kein ARMv6 mehr unterstützt. Hier habe ich aber noch irgendwo ein nodev16 paket gefunden, das ich manuell installieren konnte.
Was redis anbelangt habe ich die config zwar in den host gemappt um sie anpassen zu können, lief aber mit den Default-Werten (bind 127.0.0.1 -::1).
Warum auch immer. Bin da nicht der redis-Experte.
Dachte eigentlich, dass ich bind um die Adresse vom Host des Masters erweitern muss. War aber nicht nötig.In jedem Fall hast du sehr geholfen. Konnte mir die Installations-Schleife des iob-Containers überhaupt nicht erklären.
Da das Ganze im Moment noch ein Testsystem ist, werde ich das mal genauer untersuchen.
Die Installation lief bisher nur sauber durch, wenn ich entweder gar kein iobroker-Verzeichnis hatte, das wird dann bei der Installation angelegt.
Oder wenn ich nur die STATESDB in die redis geschickt habe:IOB_MULTIHOST=master IOB_STATESDB_TYPE=redis IOB_STATESDB_HOST=redis IOB_STATESDB_PORT=6379
Sobald ich
IOB_OBJECTSDB_TYPE=redis IOB_OBJECTSDB_HOST=redis IOB_OBJECTSDB_PORT=6379
dazugenommen habe, gab es die Installationsschleife.
Aber bei so vielen Tests(was ja zum Glück unter Docker fixgeht) kann ich nicht ausschließen, dass der Fehler irgend wo anders her kam.Danke nochmal
Reiner -
@rewenode sagte in docker, Multihost auf MacOS:
Native Installation out of the box geht auch nicht, weil nodejs offiziell auch kein ARMv6 mehr unterstützt.
Das ist der beschriebene *** SONDERFALL ***:
https://forum.iobroker.net/topic/35090/howto-nodejs-installation-und-upgrades-unter-debian
-
@thomas-braun sagte in docker, Multihost auf MacOS:
Das ist der beschriebene *** SONDERFALL ***:
Ja, und der vollständigkeit halber was ich gemacht habe:
#wie immer: sudo apt-get update sudo apt-get upgrade #Now install Node itself #alte löschen sudo apt-get --purge remove nodejs sudo apt-get autoremove sudo reboot # installieren sudo wget https://unofficial-builds.nodejs.org/download/release/v16.17.0/node-v16.17.0-linux-armv6l.tar.gz sudo tar -xvf node-v16.17.0-linux-armv6l.tar.gz cd node-v16.17.0-linux-armv6l sudo cp -R * /usr/local/ sudo ln -s /usr/local/bin/node /usr/bin/nodejs
Erst danach ioB Standardinstallation.
Der Master-Admin tut sich aber sehr schwer, den Rpi1-Host auf der Übersichtsseite anzuzeigen.