, , , , ,

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:

  1. 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.
  2. Die zweite Zeile startet das Tool ccu_backup aus dem Addon-Paket CuxD. Das Backup landet dabei im Verzeichnis /var/tmp
  3. Die dritte Zeile kopiert das erzeugte Backup aus /var/tmp in das zuvor in Zeile 1 gemountete Verzeichnis
  4. Die vierte Zeile löscht alle Backup aus dem Verzeichnis /var/tmp
  5. 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.
  6. 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!

36 Kommentare
  1. Martin
    Martin sagte:

    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

    Antworten
  2. Bernd Petrich
    Bernd Petrich sagte:

    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?

    Antworten
    • Kulkom
      Kulkom sagte:

      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

      Antworten
  3. Dieter
    Dieter sagte:

    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

    Antworten
  4. Dennis
    Dennis sagte:

    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.

    Antworten
  5. Smudo
    Smudo sagte:

    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

    Antworten
    • Lukas
      Lukas sagte:

      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.

      Antworten
  6. Smudo
    Smudo sagte:

    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

    Antworten
  7. Smudo
    Smudo sagte:

    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

    Antworten
  8. Christian
    Christian sagte:

    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

    Antworten
    • Frank
      Frank sagte:

      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

      Antworten
  9. Peter
    Peter sagte:

    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

    Antworten
    • Stephan
      Stephan sagte:

      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

      Antworten
    • rob
      rob sagte:

      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ß

      Antworten
      • Omen
        Omen sagte:

        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

        Antworten
      • Omen
        Omen sagte:

        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

        Antworten
  10. Armin Braunhofe
    Armin Braunhofe sagte:

    Hallo

    Leider bei mir auch das selbe . Das austauschen hat auch nicht geholfen .
    Jemand eine Idee ?

    LG

    Antworten
  11. rob
    rob sagte:

    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.

    Antworten
    • Andreas
      Andreas sagte:

      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!

      Antworten
  12. Christoph Morrison
    Christoph Morrison sagte:

    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

    Antworten
  13. zinnik
    zinnik sagte:

    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

    Antworten
    • BJ
      BJ sagte:

      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.

      Antworten
  14. Marc
    Marc sagte:

    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

    Antworten
  15. Stefan
    Stefan sagte:

    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.

    Antworten
  16. Fred
    Fred sagte:

    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!

    Antworten
  17. Erik
    Erik sagte:

    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….

    Antworten

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

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