Ich habe Docker gerade im OpenHAB Umfeld lieben gelernt. Es hat so unglaubliche viele Vorteile! Einer davon ist, dass man sehr einfach und effektiv Backups erzeugen kann. Ein Restore der Backups ist ebenso einfach und schnell möglich. Und so geht’s:

Vorteile: Docker & OpenHAB

Bevor wir mit dem Backup starten muss ich nochmal die Vorteile von Docker erwähnen. Ich kann schlichtweg nicht anders.

  • Mehrere OpenHAB Instanzen können gleichzeitig betrieben werden (ohne besondere Konfiguration)
  • Ein Versionsupgrade bedarf nur einer Kommandozeile
  • Ein Versionsdowngrade ist möglich
  • Eine Portierung auf einen anderen Server / Raspberry ist ein Kinderspiel (= Restore)
  • Keine Abhängigkeiten zu Betriebsystem Libraries
  • Container Health-Checks, und autom. restarts möglich
  • OS restart ohne OS restart möglich
  • Die gesamte OpenHAB Konfiguration befindet sich an einer Stelle

Erwähnenswerte Nachteile sehe ich übrigens keine. Viele der Vorteile ergeben sich rein aus der Containerisierung. Wenn Bedarf an einem neuen Tutorial zum Thema OpenHAB 3 und Docker besteht, dann schreibt gerne in die Kommentare.

Die richtige Struktur macht Backups einfach

Neben OpenHAB betreibt man häufig noch weitere Dienste, wie zB MQTT, MariaDB, DynDNS, Portainer, usw. Möchte man all diese Dienste auf einen Schlag zusammen mit OpenHAB sichern (was total Sinn macht), dann braucht es einen grundsätzlichen Aufbau der Speicherorte. Ich verwende hierfür /opt.

Das heißt, für jeden Dienst habe ich unter /opt ein eigenes Verzeichnis, in dem ein sh Skript zum erstellen des Dienstes liegt und die Volumes gespeichert werden. Somit ist jeder Dienst durch ein Verzeichnis auf einem Docker-System vollständig lauffähig. Das ist der grundsätzliche Aufbau. Hier mein Script zum Aufsetzen von openHAB 3 auf Docker:

docker stop openhab3 #stoppe den container falls er läuft
docker rm openhab3 #lösche den container falls vorhanden

#neuen container aufsetzen
docker run \
	--name openhab3 \ #name, wichtig für die steuerung über docker commands
	-v /etc/localtime:/etc/localtime:ro \ #zeiteinstellung
	-v /etc/timezone:/etc/timezone:ro \
	-v /opt/openhab3-krug/conf:/openhab/conf \ #wichtig: Speicherort
	-v /opt/openhab3-krug/userdata:/openhab/userdata \  #wichtig: Speicherort
	-v /opt/openhab3-krug/addons:/openhab/addons \  #wichtig: Speicherort
	-d \ #läuft im hintergrund (deamon)
	-e USER_ID=1000 \ #security
	-e GROUP_ID=1000 \ #security
	-e LANG=de_DE.UTF-8 \ #codepage
	-e LANGUAGE=de_DE.UTF-8 \ #codepage
	-e LC_ALL=de_DE.UTF-8 \ #codepage
	-e EXTRA_JAVA_OPTS="-Xmx1024m" \ #max. Arbeitsspeicher openhab
	--restart=always \ #bei problemen neustarten
	-m 1024m \ #max. Arbeitsspeicher docker-container
	-p 38080:8080 \ #portmapping
	-p 38443:8443 \  #portmapping
	-p 38101:8101 \ #portmapping
	-p 35007:5007 \ #portmapping
	--device=/dev/ttyACM0 \ #zugriff auf z-wave usb stick 
	openhab/openhab:3.1.0.M3 #openhab version, hier 3.1.0 Milestone 3

docker start openhab3 #und los gehts, container starten

Und hier noch für MariaDB:

docker stop mariadb
docker rm mariadb
docker run --name mariadb -v /opt/mariadb/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=XXXXXXXXX-d --net=host -m 512m --restart=always jsurf/rpi-mariadb:latest 
docker start mariadb

Das Backup

Kommen wir jetzt zum Eigentlichen – dem Backup. Dieses soll wenn es es gestartet wird folgende Schritte durchlaufen:

  1. Verbindung mit dem NAS herstellen
  2. Alle laufenden Docker Container stoppen
  3. Alle notwendigen Daten kopieren
  4. Docker Container wieder starten
  5. Backup zu TAR Archiv komprimieren und Backup-Arbeitsverzeichnis löschen

Mit dieser Reihenfolge halten wir die Downtime so gering wie möglich, bei maximaler Integrität. Das Skript dazu sieht wie folgt aus:

echo -- Verbinde mit NAS
/opt/mount_nas.sh

echo -- Stoppe Docker Container
docker stop $(docker ps -a -q)

BACKUP_DIR=/var/nas/backup_$(date +%Y%m%d)
BACKUP_FILE=/var/nas/backup_$(date +%Y%m%d).tar.gz

echo -- Erstelle Backupverzeichnis $BACKUP_DIR
mkdir $BACKUP_DIR

echo -- Kopiere Daten
echo    - /opt
cp /opt $BACKUP_DIR -R

echo    - /nginx
cp /etc/nginx $BACKUP_DIR -R

echo    - /etc/apache2
cp /etc/apache2 $BACKUP_DIR -R

echo -- Starte Docker Container
docker start $(docker ps -a -q)

echo -- Komprimiere Backup
tar -zcf $BACKUP_FILE $BACKUP_DIR

echo -- Lösche Arbeitsverzeichnis
rm $BACKUP_DIR -R

echo
echo Ferdisch!

Ein Restore im Worstcase

Was wäre der schlimmste Fall der eintreten kann? Ich würde sagen ein Hardware-Defekt, Raspberry PI und Speicher sind vollständig zerstört. Wir haben nur noch das Backup auf dem NAS. So gehen wir vor:

  1. Neue Hardware aufsetzen, mit Raspberry PI OS Lite
  2. Docker installieren: https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script
  3. Mit NAS Verbinden
  4. Backup TAR kopieren, entpacken
  5. Für jeden Dienst das sh-Skript laufen lassen, um die Container aufzusetzen und zu starten
  6. Fertig (ordentlich testen)

Ich habe diesen Prozess (leider) schon oft gemacht, und kann euch versichern: er funktioniert!

Tags:

2 Responses

  1. Hi 🙂

    Ich habe großes Interresse an einem HowTo für Openhab3 mit Docker. Welchen Pi empfiehlst du? Zur Zeit habe ich den Pi 3b.

    Danke und Grüße

    • Hi, das ist leicht. Nimm auf jeden Fall den RPi4, und wenn es dir nicht zu teuer ist, gleich die 8 GB Variante. Dazu eine portable SSD und ein spezielles RPi4 Netzteil mit außreichend Leistung. Hier findest du konkrete Empfehlungen von mir: https://getmob.de/empfehlungen/

      Bei aktuellen Modellen des RPi4 brauchst du keine SD Karte mehr.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Der Zeitraum für die reCAPTCHA-Überprüfung ist abgelaufen. Bitte laden Sie die Seite neu.

Haftungsausschluss

Die Inhalte meines Blogs dienen ausschließlich der allgemeinen Information und Unterhaltung. Sie stellen keine professionelle Beratung oder Anleitung dar und erheben keinen Anspruch auf Richtigkeit, Vollständigkeit oder Aktualität. Die Anwendung der Inhalte dieses Blogs erfolgt auf eigene Gefahr und Verantwortung des Nutzers. Ich übernehme keine Haftung für Schäden oder Verluste, die direkt oder indirekt durch die Nutzung oder Nichtnutzung der Inhalte dieses Blogs entstehen.

Produktplatzierungen

In diesem Beitrag befinden sich Produktplatzierungen. Dabei handelt es sich um Produkte, welche ich aus eigener Motivation heraus gekauft und selbstverständlich bezahlt habe. Für die Platzierung in meinen Beiträgen erhalte ich keinerlei Gegenleistung von Seiten des Herstellers. Die verlinkten Produkte sind zum überwiegenden Teil provisioniert, d.h. ich erhalte beim Verkauf eine kleine Provision. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen.

Kategorien