CCU/RaspberryMatic: Zyklisches, automatisches Backup auf Synology NAS
Backups sind Gold wert. Umso besser, wenn das eigene System diese zyklisch selbst erzeugt und auf einen sicheren Datenspeicher ablegt. In diesem kleinen Projekt möchte ich euch zeigen, wie ihr ein automatisiertes Backup auf eurer Netzwerkfestplatte (bspw. Synology oder QNAP) erstellt.
Sofern Ihr das Projekt nachbauen wollt, benötigt ihr folgende Tools bzw. Hardware:
- Netzwerkfestplatte mit einem eigens eingerichteten Benutzer für die Homematic Backups
- SSH Zugang zu eurer Zentrale bspw. über PUTTY (Windows) oder Terminal (MacOS)
- CuxD (mit angelegtem EXEC-Gerät)
Vorbereitung NAS
Zunächst solltet ihr auf eurer Netzwerkfestplatte einen neuen Benutzer einrichten. Ich habe dieses auf meiner Synology entsprechend vorbereitet. Viele Zugriffsrechte benötigt dieser Nutzer nicht, lediglich in sein eigenes Home-Verzeichnis muss geschrieben werden können.
Bei einer Synology richtet ihr dieses bspw. über den Punkt Systemsteuerung und dann Benutzer ein. Erstellt einen Benutzer wie auf nachfolgenden Screenshot:
Vorbereitungen CCU
Auf eurer Zentrale solltet ihr zunächst den SSH Zugang aktivieren. Dieses könnt ihr unter Einstellungen -> Systemsteuerung -> Sicherheit einrichten. Wählt dabei ein beliebiges Passwort. Dieses hat nichts mit eurem Admin Kennwort zu tun, sondern ist ausschließlich für den SSH-Zugang gedacht.
Nachfolgend werden wir nun eine eigene Bash-Datei anlegen, die für das Erzeugen eines Backups verantwortlich ist. Dieses werden wir direkt auf der CCU durchführen.
Loggt euch dafür nun auf eurer Zentrale via SSH ein und wechselt in das Verzeichnis Addons. Dieses könnt ihr über den folgenden Befehl tun:
cd /usr/local/addons/
Legt nun eine neue Datei „backup.sh“ an. Dieses könnt ihr mit Hilfe des folgenden Kommandos umsetzen:
touch backup.sh
Zum Öffnen und Bearbeiten dieser Datei verwenden wir den Editor „VIM„. Er ist zugegebenermaßen sehr gewöhnungsbedürftig, dafür bearbeitet ihr die Datei direkt auf eurer CCU und es besteht keine Gefahr, dass Steuerzeichen aus irgendwelchen Textbearbeitungsprogrammen eures PCs die Ausführung unseres geplanten Backup-Programms verhindern.
Verwendet dafür den Befehl:
vim backup.sh
Es öffnet sich nun der Editor, in welchem wir zunächst einmal in den „Bearbeitungsmodus“ wechseln müssen. Dieses könnt ihr über die Taste „i“ (Insert mode) erreichen. Ihr könnt jetzt die Datei entsprechend mit Inhalt füllen:
mount -t cifs -o rw,vers=1.0,user=homematic,password=backups //192.168.178.47/home /mnt
/usr/local/addons/cuxd/extra/ccu_backup
cp /var/tmp/*.sbk /mnt
rm -rf /var/tmp/*.sbk
find /mnt -name "*.sbk" -mtime +7 -exec rm -f {} \;
umount /mnt
Kurz zum Verständnis:
- Die erste Zeile mountet euer Netzwerklaufwerk lokal auf der CCU. Die CCU hat damit also Zugriff auf das Verzeichnis „home/homematic“ auf eurer NAS. Verändert die IP-Adresse entsprechend eures NAS und wählt den Usernamen sowie das Passwort, welches ihr im Punkt Vorbereitung NAS eingerichtet habt.
- Die zweite Zeile startet das Tool ccu_backup aus dem Addon-Paket CuxD. Das Backup landet dabei im Verzeichnis /var/tmp
- Die dritte Zeile kopiert das erzeugte Backup aus /var/tmp in das zuvor in Zeile 1 gemountete Verzeichnis
- Die vierte Zeile löscht alle Backup aus dem Verzeichnis /var/tmp
- Die fünfte Zeile ist ein „Luxus“. Hierbei wird im gemounteten Verzeichnis eurer NAS nach Backups gesucht, die älter als sieben Tage sind. Diese werden dann entspechend gelöscht. Ihr habt damit immer die letzten sieben Tage als Backup zur Verfügung.
- Die sechste Zeile unmounted das Netzwerklaufwerk wieder.
Drückt nun im VIM einmal die Esc-Taste, um den Bearbeitungsmodus zu beenden. Tippt jetzt einfach Folgendes ein (inklusive des Doppelpunktes):
:wq
Hiermit werden die Änderungen in die geöffnete Datei gespeichert und VIM beendet.
Als nächstes müssen wir die Datei ausführbar machen. Dieses könnt ihr über das folgende Kommando lösen:
chmod a+x backup.sh
Prüft einmal die Ausführung der erzeugten Datei, indem ihr diese über folgendes Kommando (immer noch im gleichen Verzeichnis) ausführt:
./backup.sh
Es sollte folgendes in der Konsole erscheinen:
Ihr solltet nun auf eurer Netzwerkfestplatte im Home-Verzeichnis eures angelegten Benutzers die entsprechende Backup-Datei finden.
Zyklisches speichern
Damit eure CCU nun täglich automatisch das Anlegen eines aktuellen Backups ausführt, benötigen wir ein Zentralenprogramm auf der CCU. Dieses wird zu einem bestimmten Zeitpunkt ausgelöst und besitzt als Aktivität ein Skript mit folgendem Inhalt:
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State ("/usr/local/addons/backup.sh");
So wird nun jeden Tag um 23:00 Uhr ein aktuelles Backup eures Systems erzeugt und auf eurer Netzwerkfestplatte abgelegt.
Ich wünsche euch viel Spaß beim Nachbauen!
Bei mir existiert auf einer Original CCU3 das Verzeichnis cuxd garnicht. Darum findet er in meinem script auch nicht den Befehl zum erstellen eines Backups. Backup per GUI wird aber erzeugt.
Geht das script nur auf der RaspberryMatic?
. ./backup.sh
-sh: ./backup.sh: /usr/local/addons/cuxd/extra/ccu_backup: not found
cp: can’t stat ‚/var/tmp/*.sbk‘: No such file or directory
rm: can’t remove ‚/var/tmp/*.sbk‘: No such file or directory
Hey,
bei mir klappt es leider mit einer Synology Ds923+ und dem Skript:
mount -t cifs -o rw,vers=2.0,user=CCUBackup,password=xxxx //192.xxx.xxx.xxx/volume1/test2 /mnt
/usr/local/addons/cuxd/extra/ccu_backup
cp /var/tmp/*.sbk /mnt
rm -rf /var/tmp/*.sbk
find /mnt -name „*.sbk“ -mtime +7 -exec rm -f {} \;
umount /mnt
nicht bekomme immer die Fehlermeldung:
failed: No such file or directoryvolume1/test2 on /mnt
: not found: line 2: /usr/local/addons/cuxd/extra/ccu_backup
cp: can’t stat ‚/var/tmp/*.sbk‘: No such file or directory
find: -exec requires an argument
: No such file or directory
Weiss jemand was ich falsch mache bzw. was in der Synology ausser SMB
freigeschalet sein muss?
Hallo zusammen,
nach ewiger Probiererei hat es bei mir wie folgt funktioniert:
mount -t cifs -o rw,vers=2.0,user=homematic_backup,password=xxxxxxxx //192.178.178.28/homematic_backup /mnt
/usr/local/addons/cuxd/extra/ccu_backup
cp /var/tmp/*.sbk /mnt
rm -rf /var/tmp/*.sbk
find /mnt -name „*.sbk“ -mtime +150 -exec rm -f {} \;
umount /mnt
Ausschlag gebend war dass ich das /home nach der IP durch den wirklichen Ordnernamen ersetzt habe. Hier also IP/homematic_backup (so wie der angelegte Benutzername).
Dann habe ich die Backup-Anzahl in der vorletzten Zeile von +7 noch auf +150 erhöht. Der letzte Fehler den ich in der CCU hatte ist mir erst nach 90 Tagen aufgefallen. Da ich tägliche Backups machen möchte, kann ich so 5 Monate zurück gehen.
Grüße
Kulkom
Hallo,
ich habe Deine Lösung gerade frisch auf meinem Raspi installiert.
Starte ich das Script über putty manuell funktioniert das super und die Datei landet auf meinem NAS.
Ein automatisches Starten ist leider nicht möglich.
Ich habe leider keine Ahnung von Linux und dem Umgang mit cuxd außer eben das ich es frisch installiert habe und somit sollte es ja aktuell sein.
Meine Frage wäre jetzt wo liegt das Problem?
Gruß
Dieter
Richtig gute Anleitung vielen Dank!!!
Wer Probleme beim mounten hat, es kann an der verwendeten SMB Version liegen. Synology deaktiviert standardmäßig SMB1. Einfach in der Zeile rw,vers=1.0 ersetzen durch rw,vers=2.0
Das schaltet das Mount Target auf SMB2 um.
Gruß Denmat.
Super hat mir geholfen :-)
Das Backup funktioniert. Lach mich nicht aus, aber folgende Frage:
Ich habe nun ein tagesaktuelles Backup. Wie spiele ich das denn mal ein, wenn mir die SD Karte mal abraucht? Müsse es nicht eine Imagedatei erstellen, die ich dann auf eine neue SD Karte schreibe? Oder wird hier lediglich für die Raspberrymatic ein Backup erzeugt, welches ich einspielen kann, sobald ich raspberrymatic im crash-Fall auf eine neue sd-Karte schreibe?
Merci – Smudo
Hallo, es ist die Firmware die ein Backup ihrer Einstellungen, Programme, Variablen, etc. macht. Wenn die Karte dir abraucht musst du eine neue mit dem Image ausfestzen. So das du dann eine nackte neue CCU hast. Dort kannst du dann das Backup wider einspielen. Das Backup hier ehthält keine Software.
Prima danke!
Das Backup funktioniert. Lach mich nicht aus, aber folgende Frage:
Ich habe nun ein tagesaktuelles Backup. Wie spiele ich das denn mal ein, wenn mir die SD Karte mal abraucht? Müsse es nicht eine Imagedatei erstellen, die ich dann auf eine neue SD Karte schreibe? Oder wird hier lediglich für die Raspberrymatic ein Backup erzeugt, welches ich einspielen kann, sobald ich raspberrymatic im crash-Fall auf eine neue sd-Karte schreibe?
Merci – Smudo
Prima danke!
Das Backup funktioniert. Lach mich nicht aus, aber folgende Frage:
Ich habe nun ein tagesaktuelles Backup. Wie spiele ich das denn mal ein, wenn mir die SD Karte mal abraucht? Müsse es nicht eine Imagedatei erstellen, die ich dann auf eine neue SD Karte schreibe? Oder wird hier lediglich für die Raspberrymatic ein Backup erzeugt, welches ich einspielen kann, sobald ich raspberrymatic im crash-Fall auf eine neue sd-Karte schreibe?
Merci – Smudo
Hallo, leider funktioniert das mounten nicht bei mir es kommt die Meldung Premission denied
habe die Schreibweise geändert \ statt / dann kommt Invalid argument.
Es geht um eine Synology mit VM und einem Raspmatic Image.
Cuxd 2.6 und der neusten Raspmatic Version. Über Windwos ist das Laufwerk mit dem homematic User erreichbar
gib mal auf Synology nfs frei und ändere den mount Befehl in der backup.sh um. Also anstatt:
mount -t cifs -o rw,vers=1.0,user=homematic,password=backups //192.168.xxx.xx/home /mnt
diesen hier:
mount -t nfs -o nolock,vers=3 192.168.xxx.9xx/home /mnt
bei mir musste noch ein /volume1 zwischen der IP und dem /home. Also:
//192.168.xxx.xx/volume1/home
aber damit hat es funktioniert
Hi,
bei mir funktioniert es wenn ich es über SSH anstarte ohne Problem. Das file landet auf dem Synology
Nur der Job in der CCU funktioniert nicht.
Muss hier was geändert werden?
„dom.GetObject(„CUxD.CUX2801001:1.CMD_EXEC“).State („/usr/local/addons/backup.sh“);“
Habe die CUx 2.6
Hab ein das Backup Script einfach direkt in die crontab eingetragten (crontab -e). Besipiel für tägliche Backups um 9:10 Uhr:
10 9 * * * /usr/local/addons/backup.sh >/dev/null 2>/dev/null
Hallo
Leider bei mir auch das selbe . Das austauschen hat auch nicht geholfen .
Jemand eine Idee ?
LG
Hallo,
welche Version von cuxd nutzt ihr?
:/usr/local/addons/cuxd# ./cuxd -v
2.5.1
Hier nochmal die Stelle:
…
set ret 0
set HOSTNAME [exec hostname]
set iso8601_date [exec date -Iseconds]
regexp {^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)([+-]\d+:\d+)} $iso8601_date dummy year month day hour minute second zone
set BACKUPDIR /var/tmp
…
Welche Fehlermeldung erhaltet ihr?
Nutzt ihr die neuste RasperryMatic Version 3.57.5.20210424 ?
Gruß
Hallo Danke für deine Antwort
habe die Aktuelle Version installiert CCU= 3.57.5.2021042
Cuxd =2.5.1
Die Stelle habe ich ausgebessert.
LT mir wird das Backup nicht erstellt . Unter /var/tmp ist nix zu finden .
Kann es vil. sein da Raspberrymatic die Backups auf den USB Stick schreibt und nicht unter temp ?
Hab mal eine .sbk in den Temp geschoben leider wird diese auch nicht verschoben,
Nas ist eine USB Stick an eine Fritz
Datei wurde so erstellt
mount -t cifs -o rw,vers=1.0,user=XXXX,password=XXXX \\192.168.178.1\FRITZ.NAS\NAS\Backup /mnt
/usr/local/addons/cuxd/extra/ccu_backup
cp /var/tmp/*.sbk /mnt
rm -rf /var/tmp/*.sbk
find /mnt -name „*.sbk“ -mtime +7 -exec rm -f {} \;
umount /mnt
So eine schritt weiter Test Datei wird von var/temp/ auf mein Nas kopiert .
Was fehlt ist leider das es ein Backup erstellt auf temp
Zuständig wäre ja :/usr/local/addons/cuxd/extra/ccu_backup
Mit Code :
#!/bin/tclsh
#
# (C) ‚2014 by Uwe Langhammer
# script for creating a CCU backup file in the filesystem
#
# all parameters are optional!
#
# usage: ccu_backup [] []
#
load tclrega.so
set ret 0
set HOSTNAME [exec hostname]
set iso8601_date [exec date -Iseconds]
regexp {^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)([+-]\d+:\d+)} $iso8601_date dummy year month day hour minute second zone
set BACKUPDIR /var/tmp
set VERSION 0
set VERSION_FILE /VERSION
if {![file exists $VERSION_FILE]} {
set VERSION_FILE /boot/VERSION
}
catch { set VERSION [exec grep VERSION= $VERSION_FILE | cut -d= -f2] }
set BACKUPFILE [set HOSTNAME]-$VERSION-$year-$month-$day-$hour$minute.sbk
if { $argc > 0 } {
set BACKUPDIR [lindex $argv 0]
}
if { $argc > 1 } {
set BACKUPFILE [lindex $argv 1]
}
puts „SBK-File: [set BACKUPDIR]/[set BACKUPFILE]“
puts „“
puts -nonewline „saving DOM…“
flush stdout
exec rm -f /etc/config/homematic.regadom.err
exec rm -f /etc/config/homematic.regadom.bak
rega system.Save()
set result [exec /usr/bin/tail -1 /etc/config/homematic.regadom]
if {$result == „“} {
puts “ OK!“
} else {
puts “ XML error!“
set ret 1
}
cd /
puts „creating archive…“
exec tar czf /tmp/usr_local.tar.gz –exclude-tag=.nobackup usr/local
cd /tmp/
puts „sign configuration with current key…“
exec crypttool -s -t 1 signature
puts „store current key index…“
exec crypttool -g -t 1 >key_index
puts „copy firmware version…“
file copy -force /boot/VERSION firmware_version
puts „creating [set BACKUPDIR]/[set BACKUPFILE]“
exec tar cf [set BACKUPDIR]/[set BACKUPFILE] usr_local.tar.gz signature firmware_version key_index
puts „clean up temp files…“
exec rm -f usr_local.tar.gz signature firmware_version key_index
exec sync
exit $ret
Da muss aber irgend ein fehler drinnen sein … vil kann da wer helfen @rob
So Fehler wurde gefunden . LG
Hallo
Leider bei mir auch das selbe . Das austauschen hat auch nicht geholfen .
Jemand eine Idee ?
LG
vi /usr/local/addons/cuxd/extra/ccu_backup
Ersetzen:
regexp {^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)([+-]\d+)$} $iso8601_date dummy year month day hour minute second zone
Durch:
regexp {^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)([+-]\d+:\d+)} $iso8601_date dummy year month day hour minute second zone
Sollte gehen.
genial. :-)
Danke geht
Seit dem Update der Raspberrymatic auf 3.55.10.20210213 läuft das Skript nicht mehr. Gibt es da irgendwelche Änderungen??
Es scheint so, als hätte es Änderungen in TCL gegeben?
Auf jeden Fall gibt es Fehlermeldungen in dem TCL Script „ccu_backup“. in den Zeilen 14 und 15 soll wohl das Datum geholt und die entsprechenden Angaben in Variablen verteilt werden.
14: set iso8601_date [exec date -Iseconds]
15: regexp {^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)([+-]\d+)$} $iso8601_date dummy year month day hour minute second zone
Dies scheint aber nicht zu klappen.
in Zeile 25 wird der Name für die Backupdatei erstellt.
25: set BACKUPFILE [set HOSTNAME]-$VERSION-year-month-day-hourminute.sbk
Hierbei wird allerdings der Fehler gemeldet, dass die Variable $year nicht existiert!
Moin moin,
gibt es zu dem Problem eine Lösung?
Danke & Grüße,
Per
Leider auch bei mir seit März keine Backups mehr.
Ich habe auf cuX 2.6 aktualisiert und nun läuft es wieder .
Auf der Raspberrymatic gibt es auch noch createBackup.sh (https://github.com/jens-maus/RaspberryMatic/blob/master/buildroot-external/overlay/base-raspmatic/bin/createBackup.sh), das diese Schritte und ein paar mehr bereits beinhaltet.
Außerdem macht die RM jeden Tag um 07:00 automatisch ein Backup auf einen USB-Stick, wenn einer eingesteckt (und unter /media/usb0 gemountet ist). Man kann aber auch noch andere Parameter spezifizieren (siehe auch https://github.com/jens-maus/RaspberryMatic/blob/master/buildroot-external/overlay/base-raspmatic/bin/cronBackup.sh). cronBackup.sh benutzt auch createBackup.sh
Hallo ich erhalte bei m start des backups aus der console heraus folgende Fehler
saving DOM… OK!
creating archive…
tar: The following options were used after any non-optional arguments in archive create or update mode. These options are positional and affect only arguments that follow them. Please, rearrange them properly.
tar: –exclude-tag ‚.nobackup‘ has no effect
tar: Exiting with failure status due to previous errors
while executing
„exec tar czf /tmp/usr_local.tar.gz usr/local –exclude-tag=.nobackup“
(file „/usr/local/addons/cuxd/extra/ccu_backup“ line 48)
cp: can’t stat ‚/var/tmp/*.sbk‘: No such file or directory
Ich hatte das selbe Problem, lag an der alten CUXD Version, update drauf und schon ging es.
Hallo,
ich hab das Problem, dass sich mein Verzeichnis nicht mounten lässt. Permission Denied!
Woran kann das liegen?
Bei mir hat es auch nicht auf Anhieb geklappt. Zunächst habe ich die oben beschriebenen Punkte wie SMB Version auf 2.0 stellen befolgt. Das letzte Problem war dann, dass ich für den User „homematic“ auf der NAS keine Dienste zugelassen hatte. Mindestens den SMB-Dienst muss man aber zulassen. Jetzt läuft es.
Hallo,
ich benutze dieses Script schon etwas länger für HM auf einem Tinker. Das läuft bestens.
Mit der HM (auf der Synology als VM) funktioniert das Skript aus der HM heraus nicht. Wenn ich das in der Konsole starte geht es.
Muss da ggf. noch in CuxD etwas angepaqsst werden?
Gruß
Marc
Wie immer, vielen Dank für die sehr gute Anleitung. Was mir allerdings aufgefallen ist, warum sind die Backup Files so groß? Die manuellen sbk-Files hatten immer so um die 60MB jetzt liegen die bei 180MB.
Einfache und völlig ausreichende Lösung für ein tägliches Backup! Ich arbeite nicht mit iobroker o.ä., habe aber eine Synology als Backuplösung für andere Anwendungen im Einsatz. Funktioniert super! Mehr braucht man nicht. Vielen Dank!
Docker und iobroker der für die ccu3 einiges an Mehrwert bildet, neides läift auf ser synologyß
Im addon backupit gibt es einen menuepunkt ccu sicherung, alles über eine gui….