
ioBroker Docker Container mit Redis DB verbinden
Nachdem die Redis Datenbank nun bereit ist, müssen wir dem Docker Container noch mitteilen, dass er in Zukunft seine States dort speichern soll. Die Konfiguration des ioBroker passiert dabei im besten Fall voll automatisch durch das Startup Script des ioBroker Docker Containers. Alles was wir dazu tun müssen ist dem Container die entsprechenden Informationen über die Umgebungsvariablen mitzuteilen.
Günstig ist es natürlich dies gleich beim Erstellen des Containers mit anzugeben. Läuft euer Container schon, ist es jetzt Zeit diesen zu stoppen. Über den Button „Duplicate/ Edit“ lässt sich nun der Container „bearbeiten“ (letztendlich ist dies aber auch nur das Ersetzen des Containers mit einem Neuen).
Wie dem auch sei. Wichtig ist die Angabe der folgenden Parameter in den „Advanced container settings“ im Reiter „Env“.
- IOB_STATESDB_HOST=redis - IOB_STATESDB_PORT=6379 - IOB_STATESDB_TYPE=redis
Nach dem „Deploy the container“ könnt ihr im Log des ioBroker Containers schauen ob die Parameter während des Starts auch wirklich erfolgreich gesetzt werden und der ioBroker (wieder) in Betrieb geht.
Wenn das alles geklappt hat, dann schreibt euer ioBroker ab sofort die States in die Redis DB.
Alles viel einfacher mit docker-compose aka "Portainer Stacks"
Für alle die die Vorzüge von docker-compose schätzen gibt es im Portainer die Option Container in „Stacks“ zu erstellen. Hierbei werden die Config-Daten zu einem oder mehreren Containern und ggf. Netzwerken in einer entsprechenden Config-Datei (compose file) bereitgestellt.
Das Compose File für dieses Beispiel würde dann wie folgt aussehen. Enthalten sind darin sowohl der ioBroker Container als auch der Redis Datenbank Container und das gemeinsame Bridge Netzwerk.
version: "2" services: iobroker: container_name: iobroker image: buanet/iobroker:latest-v5 hostname: iobroker restart: always networks: internal: ipv4_address: 172.18.0.2 ports: - "8081:8081" environment: - IOB_STATESDB_HOST=redis - IOB_STATESDB_PORT=6379 - IOB_STATESDB_TYPE=redis volumes: - /volume1/docker/iobroker_data:/opt/iobroker depends_on: - redis redis: container_name: redis image: redis:latest hostname: redis restart: always networks: internal: ipv4_address: 172.18.0.3 ports: - "6379:6379" volumes: - /volume1/docker/redis_data:/data networks: internal: driver: bridge ipam: config: - subnet: 172.18.0.0/16 gateway: 172.18.0.1 ip_range: 172.18.0.1/24
Achtung
Wenn ihr als Host eine Synology Disk Station nutzt und euch Portainer beim Erstellen eines Stacks mit „bla bla mem_swappiness bla bla“ anmeckert, dann fügt bitte unterhalb der Definition der volumes für den redis-container noch die folgende Definition an: mem_swappiness: -1
Das war’s dann eigentlich auch schon. Wie immer steht euch die Kommentarfunktion für Fragen oder Feedback zur Verfügung.
MfG,
André
Änderungshistorie
2020-12-27
Erste Veröffentlichung
Hi,
mit dem Wachstum meines ioBrokers wollte ich nach Deiner Anleitung nun auf Redis umsteigen.
Da ich MACVLAN nutze und das für eine Testinstallation probieren wollte, nutze ich folgendes compose file (ich habe an alle Instanzen „Staging“ angehängt).
Ich musste den redis-Port ändern, da ich für Paperless-ng bereits eine Redis Instanz laufen habe und der Port damit schon belegt war.
Hier das yaml file
version: „2“
services:
iobroker:
container_name: ioBrokerStaging
image: buanet/iobroker:v5.2.0
hostname: ioBrokerStaging
restart: always
networks:
internal:
ipv4_address: 172.18.0.2
macvlan_201to206:
ipv4_address: 192.168.178.204
ports:
– „8081:8081“
environment:
– IOB_STATESDB_HOST=redisIoBrokerStaging
– IOB_STATESDB_PORT=6380
– IOB_STATESDB_TYPE=redis
volumes:
– /volume1/docker/ioBrokerStaging:/opt/iobroker
depends_on:
– redis
redis:
container_name: redisIoBrokerStaging
image: redis:latest
hostname: redisIoBrokerStaging
restart: always
networks:
internal:
ipv4_address: 172.18.0.3
ports:
– „6380:6379“
volumes:
– /volume1/docker/RedisIoBrokerStaging:/data
networks:
internal:
driver: bridge
ipam:
config:
– subnet: 172.18.0.0/16
gateway: 172.18.0.1
ip_range: 172.18.0.1/24
macvlan_201to206:
external:
name: macvlan_201to206
Damit werden die Container korrekt erzeugt und den entsprechenden Netzwerken zugewiesen.
Leider findet ioBroker redis nicht:
2021-10-23 17:49:39.518 – error: host.ioBrokerStaging No connection to databases possible, restart
2021-10-23 17:49:39.522 – info: host.ioBrokerStaging iobroker _restart
2021-10-23 17:49:40.129 – info: host.ioBrokerStaging iobroker Starting node restart.js
2021-10-23 17:49:42.015 – info: host.ioBrokerStaging iobroker.js-controller version 3.3.18 js-controller starting
2021-10-23 17:49:42.021 – info: host.ioBrokerStaging Copyright (c) 2014-2021 bluefox, 2014 hobbyquaker
2021-10-23 17:49:42.022 – info: host.ioBrokerStaging hostname: ioBrokerStaging, node: v12.22.7
2021-10-23 17:49:42.023 – info: host.ioBrokerStaging ip addresses: 172.18.0.2 192.168.178.204
Komischer Weise funktioniert ein Ping vom ioBroker Container auf redis aber:
root@ioBrokerStaging:/opt/iobroker# ping redisIoBrokerStaging
PING redisIoBrokerStaging (172.18.0.3) 56(84) bytes of data.
64 bytes from redisIoBrokerStaging.iobrokerstaging_internal (172.18.0.3): icmp_seq=1 ttl=64 time=0.094 ms
64 bytes from redisIoBrokerStaging.iobrokerstaging_internal (172.18.0.3): icmp_seq=2 ttl=64 time=0.100 ms
64 bytes from redisIoBrokerStaging.iobrokerstaging_internal (172.18.0.3): icmp_seq=3 ttl=64 time=0.096 ms
64 bytes from redisIoBrokerStaging.iobrokerstaging_internal (172.18.0.3): icmp_seq=4 ttl=64 time=0.074 ms
64 bytes from redisIoBrokerStaging.iobrokerstaging_internal (172.18.0.3): icmp_seq=5 ttl=64 time=0.103 ms
Hast Du irgend eine Idee, was ich machen kann?
Danke
Christof
Hi,
ich habe die Lösung gefunden. Obwohl docker-üblich funktioniert das ummappen der ports 6380:6379 nicht.
Ich musst das Startkommando von redis-server nach redis-server –port 6380 ändern.
Keine Ahnung warum, aber jetzt funktioniert es.
Vielleicht kannst Du mein Beispiel mit in Deiner Doku erwähnen, da Du in den anderen Anleitungen MACVLAN vorschlägst, es hier aber fehlt.
Dabei kann man den Kommentar bezüglich Port-Änderungen auch direkt erwähnen.
Bis dann
Christof
Hallo Christof,
danke für dein Feedback. Bitte nutze aber für zukünftige support Fragen die Quellcode oder Logs enthalten nicht die Kommentarfunktion sondern z.B. das ioBroker Forum. Die Kommentare sind einfach nicht dafür gemacht Quellcode lesbar darzustellen.
Was dein Problem angeht kann ich dir leider nicht ganz folgen. Ich wüsste nicht warum ich im Redis Tutorial MACVLAN empfehlen sollte. Für Redis macht das absolut keinen Sinn, daher auch die Anbindung über das interne Bridge Netzwerk. Wenn du deinen ioBroker und den Redis wie vorgeschlagen über das interne Bridge Netzwerk verbindest, benötigst du die Portweiterleitung nur wenn du einen ioBroker Slave einbinden möchtest. Andernfalls benötigst du gar keine Portangabe. Das hier jetzt weiter zu erläutern wäre zu umfangreich. Ich kann dir anbieten dass du mal im Discord Channel vorbei schaust und wir das dort gerne mal im Voice Chat besprechen. 🙂 Melde dich einfach bei mir.
MfG,
André
Hallo André,
erstmal vielen Dank für Deine Arbeit.
Benutze Deinen Docker-Container schon lange und heute beschäftige ich mich mal mit dem Thema Redis.
Wenn ich über die Console einen „klassischen“ ioBroker setup custom mache und dort die state von file auf redis umstelle, steht im Forum, dass es mich fragt, ob ich die vorhandenen States mit übernehmen möchte.
Wie sieht es bei Dir mit den ENV-Einstellungen aus, werden dann auch aus einem vorhandenen System die Werte übernommen?
Hast Du selber nur die States oder auch die Objects (seit js-controller 2.x möglich) auch auf Reds umgestellt?
Gruß
Thomas
Hallo Thomas,
wie im Discord schon erwähnt gab es das Feature im ioBroker noch nicht als ich den Support für Redis eingebaut habe. 🙂 Alles weitere dazu dann im Github Issue.
MfG,
André
Hallo André,
abermals vielen Dank für Deine Arbeit!
Ich habe meinen ioBroker Container schon vor einiger Zeit via „iobroker setup custom“ auf redis umgestellt. Wenn ich nun die hier angegebene Environment-Einstellungen zusätzlich anwende, hängt sich das System nach „Starting ioBroker…“ auf. Entfernen der ENV-Einstellungen hilft auch nicht mehr, ich musste das System rücksichern.
Fragen zum Artikel:
1. Was ist der Unterschied zwischen den beiden Verfahren und muss ich die ENV-Variablen setzen wenn es so funktioniert?
2. Was ist bei einem Neuaufbau mit einem neuen Container-Major-Release aus einem Backup zu beachten / die richtige Reihenfolge?
Danke, Ralf
Hallo Ralf,
eigentlich gibt es keinen Unterschied bei der Einrichtung der Redis Verbindung. Genauso wie „iobroker setup custom“ schreibt auch das Startup Script die entsprechenden Werte einfach nur in die Konfigurationsdatei. Ich glaube also nicht, dass es daran gelegen hat. Ohne dein Setup zu kennen kann ich allerdings auch nicht sagen was da bei dir ggf. nicht funktioniert hat…
Was den Neuaufbau angeht, da gibt es mehrere Wege. Bei mir lief bisher das Upgrade mit Backup-Datei in einem sonst leeren Ordner als „/opt/iobroker“ immer problemlos (so wie hier beschriben). Du kannst aber natürlich auch einen neuen, jungfräulichen ioBroker Container in der neuen Version erstellen und dann über den Adapter „backitup“ oder die Kommandozeile restoren.
MfG,
André