NEWS
[Vorlage] Script für automatisches Backup steuerbar durch VIS
-
<size size="150">Edit
Neue Version hier:</size>
Hi Leute,
ich habe lange nach einer Lösung gesucht wie ich automatisch Backups meiner IoBroker Installation durchführen und die Ausführzeit schnell und einfach in Vis ändern kann. Da ich leider nichts finden konnte das dem nahe kommt was ich mir vorstellte, hab ich mir da selber was zusammen gestellt.
Vielleicht hat der Ein oder Andere dafür Verwendung deshalb stelle ich es euch hier mal ein. Die Basis ist ein Javascript das ein Shell-Script aufruft.
Das Shell-Script habe ich von Kuddel aus diesem Beitrag nur ein bisschen modifiziert:
http://forum.iobroker.net/viewtopic.php?f=21&t=9861
Es gibt zwei verschiedene Backup-Typen:
-
- Minimal -> entspricht dem ganz normalen IoBroker - Backup welches man durch ./iobroker backup ausführen kann.
- Komplett -> entspricht einer Sicherung des ganzen IoBroker Verzeichnisses (Die Dateigröße sollte man dabei bedenken sind bei mir ca. 200 MB)
So könnt ihr es verwenden / testen
-
- das Shell-Script müsst ihr in das IoBroker-Verzeichis als backup.sh speichern (/opt/iobroker/backup.sh)
- das Java-Backup-Script müsst ihr einmal mit "BackupStellen();"(Zeile 96) ausführen um die Objekte für Vis zu erzeugen, dass hier das erstemal Warnigs kommen liegt daran dass die Objekte noch nicht erzeugt sind. - Dann noch die View importieren und ihr soltet es EIGENTLICH verwenden können. *NEU* - Um die FTP-Funktion nutzen zu können müsst Ihr in der Konsole unter Debian: sudo apt-get install lftp" ausführen - Freigaben auf dem Nas bzw. Ftp-Server einrichten (Hatte ich vergessen und hab ewig den Fehler gesucht :lol: ) - eXTreMe hat mich darauf hingewiesen, dass wenn man einen Javascriptadaper mit einer Version höher 3.4.0 verwendet es notwendig ist in den Einstellungen das exec Komando zu aktivieren sonst funktioniert es nicht.
Mögliche Backupeinstellungen:
-
- Optionaler Namenszusatz, für Leute die eine bspw. eine Master/Slave Umsetzung haben und diese benennen wollen.
- Optionales Löschen alter Backups nach X-Tagen, seperat für "Minimale" und "Komplette" Backups NEU - Optionaler Upload des Backups auf einen FTP-Server (getestet mit einer Synology Diskstation)
Die Wiederherstellung des kompletten Backups funktioniert wie folgt:
-
- Iobroker stoppen
- Erstelltes Backup in den Root-Ordner kopieren - Befehl:" tar -xzvf Backupname.tar.gz -C / " über die Konsole ausführen. - Warten - Während der Wiederherstellung wird euch angezeigt was gerade gemacht wird. - Wenn alles fertig ist Iobroker starten (Danke an olifall der mir den richtigen Befehl/Ablauf mitgeteilt hat.)
olifall hatte das Problem dass nach dem Restore das Webinterface nicht erreichbar war, hier hat er ebenfalls eine Lösung gefunden:
-
- sudo iobroker status
- Meldung = "No connection to states 127.0.0.0:6379[redis]" - sudo apt-get install redis-server
*TODO
Habe heute gelesen dass wenn man Raspberrymatic nutzt, man auch ein Backup über die Console anstoßen kann.
Ich werde versuchen das ebenfalls mit einzubinden, so wäre es dann eine All in One Lösung
*Edit
Bei mir ist Debian Stretch 8
So genug geschrieben, hier das Javascript für IoBroker:
! ````
// *******************************************************************************************************
//
// Backup Script
//
//
// Funktionen: 1. Typisches Backup wie es der Befehl ./iobroker backup erstellt
// 2. Großes Backup das den ganzen IoBroker Ordner inkl. aller Unterordner/Dateien Sichert
//
//
// V1.0 - 22.12.2017 Automatisches Backupscript
// V1.0.1 - 12.01.2018 Uploadmöglichkeit auf einen FTP-Server eingebaut
// Hier wird die lftp-Funktion benutzt somit muss diese auch in Debian vorhanden sein!
// lftp kann mit dem Befehl: apt-get install lftp installiert werden.
// v1.0.2 - 12.02.2018 Datenpunkt für letzten Backupdurchlauf eingepflegt.
//
// *******************************************************************************************************
! // -----------------------------------------------------------------------------
// allgemeine Variablen
// -----------------------------------------------------------------------------
var logging = true; // Logging on/off
var instanz = 'javascript.0'; instanz = instanz + '.'; //
//
var pfad0 = 'System.Iobroker.Backup.'; // Pfad innerhalb der Instanz - Status allgemien
! var bash_script = 'bash /opt/iobroker/backup.sh '; // Pfad zu backup.sh Datei
! // Wichtig! Es dürfen keine Leerzeichen in dem Backup-Array sein wenn kein Eintrag benötigt wird
// nur '' verwenden!
! var Backup = []; // Array für die Definition der Backuptypen und deren Details
Backup[0] = [];
Backup[0][0] = 'minimal'; // Backup Typ (nicht verändern)
Backup[0][1] = ''; // Names Zusatz, wird an den Dateinamen angehängt bspw. Master/Slave (falls gewünscht, ansonsten leer lassen)
Backup[0][2] = '10'; // Alte Backups löschen nach X Tagen (falls gewünscht, ansonsten leer lassen)
Backup[0][3] = '192.168.1.2'; // FTP-Host
Backup[0][4] = 'Backup/SmartHome/ioBroker/'; // genaue Verzeichnissangabe bspw. /volume1/Backup/ auf FTP-Server (falls gewünscht, ansonsten leer lassen)
Backup[0][5] = 'username'; // Username für FTP - Verbindung
Backup[0][6] = 'passwort'; // Passwort für FTP - VerbindungBackup[1] = []; Backup[1][0] = 'komplett'; // Backup Typ (nicht verändern) Backup[1][1] = ''; // Names Zusatz, wird an den Dateinamen angehängt bspw. Master/Slave (falls gewünscht, ansonsten leer lassen) Backup[1][2] = '10'; // Alte Backups löschen nach X Tagen (falls gewünscht, ansonsten leer lassen) Backup[1][3] = '192.168.1.2'; // FTP-Host Backup[1][4] = 'Backup/SmartHome/ioBroker'; // genaue Verzeichnissangabe bspw. /volume1/Backup/ auf FTP-Server (falls gewünscht, ansonsten leer lassen) Backup[1][5] = 'username'; // Username für FTP - Verbindung Backup[1][6] = 'passwort'; // Passwort für FTP - Verbindung
! var Wochentage = ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag']; // Wochentage für die Backupeistellungen angelegt werden
// (Mit Sonntag beginnen wegen Schedule)
var BkpZeit_Schedule = [];
// =============================================================================
// Objekte
// =============================================================================
// Objekt für Zufalls-Farbwechsel an oder aus
createState(instanz + pfad0 + 'Auto_Backup', {def: 'false',type: 'boolean',name: 'Automatisches Backup'});
createState(instanz + pfad0 +'Backupeinstellungen_sichtbar', {def: 'false',type: 'boolean',name: 'Backup Einstellungen '}); //Datenpunkt für Vis - Einstellungen sichtbar Ja/Nein
createState(instanz + pfad0 + 'letztes_Backup', {def: 'Noch kein Backup', type: 'string', name: 'Letztes Backup'});
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! // #############################################################################
// # #
// # Funktion zum anlegen eines Schedules für Backupzeit #
// # #
// #############################################################################
! function BackupStellen() {
setState(instanz + pfad0 +'Auto_Backup', false);
Backup.forEach(function(Bkp) {Wochentage.forEach(function(Wochentag){ // ----------------------------------------------------------------------------- // Objekte in Abhänigkeit der Backups // ----------------------------------------------------------------------------- // Objekte für AutoBackup Ein/Aus createState(instanz + pfad0 + Bkp[0] +'.BackupState_'+Wochentag, {def: 'false',type: 'boolean',name: 'Backup aktiviert '+Wochentag}); // Objekte für BackupZeit createState(instanz + pfad0 + Bkp[0] +'.BackupZeit_'+Wochentag, {def: '02:00',type: 'string',name: 'Backup Zeit am '+Wochentag}); if(getState(instanz + pfad0 + Bkp[0] + '.BackupZeit_'+Wochentag).val){ var BkpZeit = getState(instanz + pfad0 + Bkp[0] + '.BackupZeit_'+Wochentag).val.split(':'); //log(WKZeit[1] + ' ' + WKZeit[0] + ' * * 1'); log(getState(instanz + pfad0 + Bkp[0]+ '.BackupState_'+Wochentag).val); if(getState(instanz + pfad0 + Bkp[0]+ '.BackupState_'+Wochentag).val === true){ setState(instanz + pfad0 +'Auto_Backup', true); clearSchedule(BkpZeit_Schedule[Bkp[0]+'.'+Wochentag]); BkpZeit_Schedule[Bkp[0]+'.'+Wochentag] = schedule(BkpZeit[1] + ' ' + BkpZeit[0] + ' * * '+ Wochentage.indexOf(Wochentag), function (){backup_erstellen(Bkp[0], Bkp[1], Bkp[2], Bkp[3], Bkp[4], Bkp[5], Bkp[6])}); if(logging) log('Automatisches Backup für '+Bkp[0]+' am '+Wochentag+' wurde auf '+BkpZeit[0]+': '+BkpZeit[1]+' Uhr aktiviert'); } else{ clearSchedule(BkpZeit_Schedule[Bkp[0]+'.'+Wochentag]); if(logging) log('Automatisches Backup für '+Bkp[0]+' am '+Wochentag+' wurde deaktiviert'); } } }); });
}
! //BackupStellen();
//backup_erstellen('minimal', '', '', 'IP', 'Backup/', 'ftpUser', 'ftpPass');
! function backup_erstellen(typ, name, zeit, host, pfad, user, passwd) {
// exec(([bash_script ,typ, name, zeit, pfad].join('')), function(err, stdout, stderr) {
exec((bash_script+' "'+typ+'|'+name+'|'+zeit+'|'+host+'|'+pfad+'|'+user+'|'+passwd+'"'), function(err, stdout, stderr) {
if(logging){
if(err) log(stderr, 'error');
else log('exec: ' + stdout);
}
setState(instanz + pfad0 + 'letztes_Backup', formatDate(new Date(), 'DD.MM.YYYY') +' um '+ formatDate(new Date(), 'hh:mm:ss'));
});if(logging) log("exec: " + ((bash_script+' '+typ+' '+zeit+' '+pfad)));
}
! // #############################################################################
// # #
// # Beobachten aller Backupeinstellungen #
// # #
// #############################################################################
! on([instanz + pfad0 + "komplett.BackupState_Montag",
instanz + pfad0 + "komplett.BackupState_Dienstag",
instanz + pfad0 + "komplett.BackupState_Mittwoch",
instanz + pfad0 + "komplett.BackupState_Donnerstag",
instanz + pfad0 + "komplett.BackupState_Freitag",
instanz + pfad0 + "komplett.BackupState_Samstag",
instanz + pfad0 + "komplett.BackupState_Sonntag",
instanz + pfad0 + "komplett.BackupZeit_Montag",
instanz + pfad0 + "komplett.BackupZeit_Dienstag",
instanz + pfad0 + "komplett.BackupZeit_Mittwoch",
instanz + pfad0 + "komplett.BackupZeit_Donnerstag",
instanz + pfad0 + "komplett.BackupZeit_Freitag",
instanz + pfad0 + "komplett.BackupZeit_Samstag",
instanz + pfad0 + "komplett.BackupZeit_Sonntag",
instanz + pfad0 + "minimal.BackupState_Montag",
instanz + pfad0 + "minimal.BackupState_Dienstag",
instanz + pfad0 + "minimal.BackupState_Mittwoch",
instanz + pfad0 + "minimal.BackupState_Donnerstag",
instanz + pfad0 + "minimal.BackupState_Freitag",
instanz + pfad0 + "minimal.BackupState_Samstag",
instanz + pfad0 + "minimal.BackupState_Sonntag",
instanz + pfad0 + "minimal.BackupZeit_Montag",
instanz + pfad0 + "minimal.BackupZeit_Dienstag",
instanz + pfad0 + "minimal.BackupZeit_Mittwoch",
instanz + pfad0 + "minimal.BackupZeit_Donnerstag",
instanz + pfad0 + "minimal.BackupZeit_Freitag",
instanz + pfad0 + "minimal.BackupZeit_Samstag",
instanz + pfad0 + "minimal.BackupZeit_Sonntag"], function (dp) {BackupStellen();
! });
! ````Hier das Shell-Script:
Hier der Widgetexport:
Und so schauts aus:
So ich hoffe es funktioniert nicht nur bei mir :lol:
Wenn Probleme, Fragen oder Anregungen auftauchen werde ich versuchen bestmöglichst zu helfen.
In diesem Sinn viel Spaß beim "Probieren"
-
-
Cool, werde ich bei Gelegenheit testen. Aktuell sichere ich noch durch Entnahme der sdcard und Sicherung dieser am PC
Gesendet von meinem HUAWEI RIO-L01 mit Tapatalk
-
Hallo,
erstmal vielen Dank für die Scripte, ich hab alles wie beschrieben durchgeführt, erhalte jedoch diese Fehler:
backup.sh: Zeile 2: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 17: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 18: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 19: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 20: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 21: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 22: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 24: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 25: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 32: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 33: /t>\r': Kommando nicht gefunden.
backup.sh: Zeile 49: Syntaxfehler beim unerwarteten Wort `elif'
'ackup.sh: Zeile 49: `elif [ $BKP_TYP == "komplett" ]; then
Woran kann das liegen?
Grüße
-
Woran kann das liegen? `
Hi,
also das Script hast du ja bestimmt in den Ordner /opt/iobroker/ kopiert und backup.sh benannt. Dateirechte habe ich auf 0777 gesetzt.
Wenn dem so ist versuch doch mal ob das Script über Putty ausführbar ist:
-
dazu gehst du ebenfalls in das Verzeichnis /opt/iobroker/
-
Im Anschluss tippst du folgendes ein: bash backup.sh "minimal||10|" (dabei ist wichtig die | und Anführungszeichen genau wie es da steht aus zu führen)
So finden wir raus ob das Script selbst oder der Aufruf nicht funktioniert
Gruß
Steffen
-
-
Hallo Steffen, auch bei mir kommt dieser Fehler wenn ich das Script im Terminal ausführe
3933_script.jpeg -
Hallo Steffen, auch bei mir kommt dieser Fehler wenn ich das Script im Terminal ausführe `
Hi,
könnte einer von euch den befehl mal mit bash ./backup.sh "minimal||10|" ausführen. Kann den Fehler bei mir nicht nachstellen deswegen bin ich da ein bisschen auf euch angewiesen.
*EDIT
Ich habe mir gerade iobroker auf einem pi3 installiert und es dort versucht, aber selbst hier kann ich es nicht nachstellen
Danke
Steffen
-
Hallo Steffen, auch bei mir kommt dieser Fehler wenn ich das Script im Terminal ausführe `
Hi,
könnte einer von euch den befehl mal mit bash ./backup.sh "minimal||10|" ausführen. Kann den Fehler bei mir nicht nachstellen deswegen bin ich da ein bisschen auf euch angewiesen.
*EDIT
Ich habe mir gerade iobroker auf einem pi3 installiert und es dort versucht, aber selbst hier kann ich es nicht nachstellen
Danke
Steffen `
Hier das Ergebnis
3933_script.jpeg -
So,
ein neuer Lösungsversuch, ich habe im Homematic-Forum folgendes gefunden:
"..Schuld ist der Zeichensatz von DOS und Unix. Es wird beim kopieren über Putty in Nano ein paar unsichtbaren Zeichen mit kopiert die Pi sieht.
Kannst du mal im /opt/iobroker Verzeichniss mit dem Befehl nano backup.sh nachsehen ob du da auch irgendwelche "unsichtbaren" Zeichen hast?
Alternativ habe ich im ersten Post meine Backup.sh nochmal gezippt hinterlegt so dass du diese versuchen könntest.
Gruß
Steffen
-
hab dir mal einen screenshot angehängt. Leider weis ich nicht wies mit unsichtbaren aussieht. Zip teste ich nachher mal
3933_script.jpeg -
Steffen, DANKE !
das scheint es gewesen zu sein.
Es wurde eine Datei "backupiobroker_minimal…..." erstellt.
Anbei ein Bild.
Hat es irgendwo Auswirkungen, das ioBroker vor dem Backup nicht gestoppt wird ?
Guten Rutsch ins neue Jahr !
Grüße Ingo.
1519_2017-12-31__5_.png -
nach dem einsetzen der backup.sh wurde das Backup erstellt. Jetzt funktioniert es.
-
nach dem einsetzen der backup.sh wurde das Backup erstellt. Jetzt funktioniert es.
`
Das ist eine gute Frage :lol: , also beim kleinen Backup dürfte es nichts machen da dies ja das gleiche ist was du mit ./iobroker backup ausführst. Beim großen konnte ich bei mir nichts feststellen wenn dir jedoch etwas auffällt sag Bescheid, dann packe ich den Stop noch mit rein.
nach dem einsetzen der backup.sh wurde das Backup erstellt. Jetzt funktioniert es.
`
Das Freut mich! Hatte schon die Befürchtung dass das nur bei mir funktioniert
Euch auch nen guten Rutsch
Gruß
Steffen
-
Hallo
Gestern mal installiert und scheint zu laufen. Jedenfalls manuell, automatisch zeigt die zeit.
-
Habe das widget im vis auf einer extra seite importiert, aber wozu ist der schliessen button unten?
-
wenn ich 10 tage alte Dateien löschen lassen will muss ich “ja“ in der backup.sh eintragen oder im script?
-
bekommt man es irgendwie hin per ftp die Dateien zu verschieben oder ist es einfacher dafür einen alten usbstick an den raspi zu stecken und die daten dort zu sichern?
Sorry für die Fragen aber raspi und linux sind für mich neuland
Gruss Danyel
-
-
Hi Danyel,
zu deinen Fragen:
-
Schließen Button, ich verwende das "View in Widget" um die Backup-View einzublenden und über den Schließen-Button blende ich Sie wieder aus.
-
Wenn du die 10 Tage alten Backups löschen möchtest musst du hier:````
......
Backup[0][2] = '10'; // Alte Backups löschen nach X Tagen (falls gewünscht, ansonsten leer lassen)
oder hier:```` ...... Backup[1][2] = '10'; // Alte Backups löschen nach X Tagen (falls gewünscht, ansonsten leer lassen) .......
die 10 oder bspw. 15 … Eintragen. Die Zahl gibt wie alt ein Backup sein muss dass es gelöscht wird. Wenn du das nicht möchtest einfach die Zahl zwischen den Anführungszeichen löschen.
- verschieben kannst du die Dateien indem du im jeweiligen Backup-Typen unter (Verzeichnis für Sicherungskopie) das Verzeichnis einträgst.
Link des ersten Posts ist das original Script hier kannst du dir die Syntax anschauen die du verwenden musst, ich selber nutze das jedoch nicht habe es nur eins zu eins übernommen ohne es zu testen. Werde bei Gelegenheit mal eine Share-Freigabe auf meinem Nas einrichten und es versuchen.
Wenn noch Fragen oder Probleme auftauchen melde dich einfach dann versuch ich weiter zu Helfen.
Gruß
Steffen
-
-
So!
Im ersten Post gibt es nun die neue Version des Update-Scripts.
Neu ist hier die Möglichkeit das lokal erstellte Backup auf einen Ftp-Server zu kopieren.
Ich nutze für den Ftp-Upload die Funktion "lftp" wer diese nicht in seinem Debian installiert hat muss das nachholen um den Ftp-Upload nutzen zu können!
(In der Konsole einfach "sudo apt-get install lftp" eingeben).
Ihr müsst auch die neue Version des Javascripts verwenden, hier könnt ihr im Kopf eure FTP-Daten einpflegen.
Dann noch die neue Version der Backup.sh in euer Verzeichnis kopieren und fertig.
Wer testen möchte ob die Backup.sh funktioniert bzw. zur Fehlersuche so wird über die Konsole aufgerufen:
backup.sh "BackupTyp|NamensZusatz|LöschenNachTagen|FTP-Host|FTP-DIR|UserName|Passwort"
Und hier ein Aufruf mit Beispieldaten:
bash backup.sh "minimal|Auto|10|192.168.1.2|Backup/ioBroker/|TestUser|TestPasswort"
Sollten Fragen oder Probleme auftauchen, versuche ich gerne zu helfen
Gruß
Steffen
-
So wie es aussieht läuft es.
Hatte erst probleme beim manuellen aufrufen "inkorect login" oder so aber das lag wohl an meinem ftp.
Heute Nacht um 2 Uhr wurde ordnungsgemäß aufn ftp und die sd-card gesichert.
Schauen wir mal was die nächsten Tage passiert.
Aber erstmal DANKE
-
- Schließen Button, ich verwende das "View in Widget" um die Backup-View einzublenden und über den Schließen-Button blende ich Sie wieder aus. `
Wie machst du das? Steh gerade aufm schlauch mit dem "View in Widget" und dem Schließen-Button
-
@ringdingringding:Wie machst du das? Steh gerade aufm schlauch mit dem "View in Widget" und dem Schließen-Button `
Ganz einfach, ich habe dir hier zwei View-Exporte mit reingepackt der eine heißt test und der andere test2.
Test wäre die View in der du das ganze ein und ausblenden willst, deshalb hier das Widget. Ein und ausblenden geht über die Sichtbarkeit welche du mit dem durch das Script erstellten Datenpunkt "Backupeinstellungen_sichtbar (true/false)" steuerst.
Test2 ist die eigentliche Konfigurationsview.
Hier der Export von Test:
Und hier der Export von Test2:
Importier die mal und schau mal ob das verständlich ist
Gruß
Steffen
-
Top.
Verstanden und läuft
Danke dir.
Werde jetzt mal gucken was die tage dann passiert.
-
waehre es nicht interessant diese logic als einem adapter mit VIS widget satz zu definieren ?
Ich finde die loesung wirklich super !