automatisches Backup + Kopie auf NAS + löschen alter Backups

Begonnen von yersinia, 10 Mai 2018, 11:57:27

Vorheriges Thema - Nächstes Thema

yersinia

Hallo zusammen,
es gibt im Netz viele Anleitungen, wie man ein Backup der FHEM Config macht. Ich möchte hier mein Vorgehen vorstellen und diskutieren. Vielleicht kann man ja was besser machen. :)

Bei mir wird jeden Samstag um 3:00 ein backup erstellt. Automatisch mittels DOIF:
define DOIF_AutoBackup DOIF ([03:00:00|6]) (backup)
attr DOIF_AutoBackup do always
attr DOIF_AutoBackup stateFormat next backup: timer_01_c01

(dieses Backup wird lokal im FHEM Backup Ordner abgelegt)

Da ich eine NAS von Synology (DS211+) besitze, bin ich nach dieser Anleitung vorgegangen. Allerdings nur den Teil mit dem fhem-user auf der Synology sowie Installation und Einrichtung von autofs.

EDIT 10.03.2019
Die /etc/autofs/auto.synology sieht bei mir zB so aus:
fhem_backup -fstype=cifs,rw,vers=2.1,credentials=/home/pi/.smbcredentials,file_mode=0777,dir_mode=0777 ://diskstation/freigabe
Die Credentials liegen unter /home/pi/.smbcredentials:
username=username
password=geheim

EDIT Ende

Meine NAS fährt unter der Woche und am Wochenende Nachts runter. Die DS211+ fährt am Wochenende automatisch um 9:00 hoch. Wenn die NAS hochgefahren ist, mountet autofs die entsprechende Freigabe für den user fhem.

Mittels DOIF kopiere ich das letzte (aktuellste) Backup auf die Freigabe um 9:10.
Dies geschieht mit dem Befehl
cp $(ls -dtr1 /opt/fhem/backup/* | tail -1) /mnt/syno/fhem_backup

Um 9.30 prüfe ich, ob ich ältere Backups (= älter 8 Wochen = 56 Tage) löschen lassen kann.
find /opt/fhem/backup -type f -mtime +56 -delete
(acht Wochen um ggf. fehlerhafte Uploads (aus welchem Grund auch immer) auffangen zu können)

Das ganze DOIF sieht wie folgt aus:
define DOIF_BackupUpload DOIF ([09:10:00|6])\
("cp $(ls -dtr1 /opt/fhem/backup/* | tail -1) /mnt/syno/fhem_backup")\
DOELSEIF ([09:30:00|6])\
("find /opt/fhem/backup -type f -mtime +56 -delete")
attr DOIF_BackupUpload do always
attr DOIF_BackupUpload stateFormat next upload: timer_01_c01


Läuft bei mir seit einigen Monaten ohne Probleme.

Für weitere Anregungen, andere Ideen und Vorgehensweisen bin ich Dankbar. :)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Wernieman

Weil DU nach Meinungen gefragt hast:

- Warum DOIF und nicht ein AT?
  Ist (meiner Meinung nach) etwas Oversized

- Wenn keine neuen Backups erstellt werden (warum auch immer), werden trotzdem nach 56 Tagen alle Backups gelöscht
-> Besser "Anzahl" backups aufbewahren

- Was passiert, wenn das Backup nicht O.K.?
-> Besser noch Prüfungen einbauen und nur kopieren, wenn ..... (oder wenigstens warnen)

- Warum verschiedene Blöcke?
-> Mann kann doch kopieren /löschen in einem Block .... spart man sich den 2. Block


Aber wie bei Unix ist es bei FHEM: viele Wege führen zum Ziel
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

yersinia

Hi Werniemann,

vielen Dank für das Feedback. :)
Zitat von: Wernieman am 22 Mai 2018, 12:12:44
- Warum DOIF und nicht ein AT?
  Ist (meiner Meinung nach) etwas Oversized
Das ist relativ einfach: ich habe keine Erfahrung mit AT (ich nutze das gar nicht) - dafür aber mit DOIF. Und es funktioniert. Die Frage ist (für mich), welche Vorteile hätte AT gegenüber DOIF hier (bzw. welche Nachteile das DOIF gegenüber AT)?

Zitat von: Wernieman am 22 Mai 2018, 12:12:44
- Wenn keine neuen Backups erstellt werden (warum auch immer), werden trotzdem nach 56 Tagen alle Backups gelöscht
-> Besser "Anzahl" backups aufbewahren
Ja, das ist korrekt. Die lokalen Backups werden gelöscht, aber nicht die auf dem NAS.
Wenn dann für 56 Tage weder lokale Backups noch Kopien auf das NAS (sofern Backup erfolgreich) waren, dann ist die problematisch, das stimmt.
Die Frage ist, wie man das anders machen könnte - aber ein guter Denkanstoß da mal nachzuforschen...

Zitat von: Wernieman am 22 Mai 2018, 12:12:44
- Was passiert, wenn das Backup nicht O.K.?
-> Besser noch Prüfungen einbauen und nur kopieren, wenn ..... (oder wenigstens warnen)
s.u.a.o. :)
Ich habe bisher auch nur Backups erstellt, ich habe noch nicht getestet, wie man ein Backup wieder einspielt. Dazu fehlt mir allerdings auch eine vernünftige Testumgebung. -.- Und im produktiven FHEM ein Backup wieder einspielen...mmmh..da trau' ich mich nicht ran.

Zitat von: Wernieman am 22 Mai 2018, 12:12:44
- Warum verschiedene Blöcke?
-> Mann kann doch kopieren /löschen in einem Block .... spart man sich den 2. Block
Das stimmt. Zumal man das mit wait auch zeitlich trennen kann. Vielleicht kann man das optimieren...:)

Zitat von: Wernieman am 22 Mai 2018, 12:12:44
Aber wie bei Unix ist es bei FHEM: viele Wege führen zum Ziel
Das stimmt. Danke nochmals für das Feedback. :)
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Wernieman

Bezüglich DOIF:
Mir ist DOIF einfach eine zu große "Eirlegendewollmilchsau" (Persönliche Meinung)

Mann weis einfach zu wenig, was im Hintergrund läuft, weshalb ich lieber auf andere Module als auf DOIF setze. Zusätzlich wird zu viel (auch im Anfängerbereich) bei jeder Fragestellung auf DOIF verwiesen ... ... aber s.o., meine persöhnliche individuelle Meinung

Bezüglich Testen:
Ein Backup, welches noch nie getestet wurde ist nicht .... optimal (und kein Backup). Allerdings reicht es erstmal zu Testen, ob die Dateien überhaupt "integer" sind, d.h. mal das TAR entpacken und nachprüfen...

Bezüglich Fehlermeldung:
Du könntest den Fehlercode, den z.B. cp übergibt (Stichwort $?) auswerten und z.B: einen Dummy in FHEM setzen (lassen)

Bezüglich Versionen:
Einfach Anstatt Zeit auf Anzahl setzen, d.h. die letzten 56/7 Versionen aufbewahren. Sind dann beim Wöchentlichen Backup genau 56 Tage ;o)

Und Wegen Feedback .. gerne geschehen.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

yersinia

Ja, das TAR Archiv habe ich schon öfters entpackt - von daher scheint das Backup mMn integer zu sein.

Bezüglich Aufräumen und Versionieren kann man so vorgehen - ich muss bei Gelegenheit mal schauen, ob und wie man das verändern kann. Allerdings habe ich keinen Bedarf (sprich: Lust) ein Script zu schreiben, welches die letzten Backups zählt...möglicherweise könnte sowas schon reichen:
ls -1t | tail -n +8 | xargs rm -f
von: https://www.ostechnix.com/find-delete-oldest-file-x-files-directory/
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Dirk070

Der Thread ist nun ein gutes Jahr alt, aber vielleicht ist ja die folgende Lösung mit einem DOIF von Nutzen:

UPDATE: Ergänzung der Abfrage, ob es überhaupt zu löschende Backups gibt if ($BackupsDelete > 0)

([00:10:00|1])
( {
## Backup Montag
fhem("backup");;

my $BackupDir = AttrVal("global", "backupdir", undef);;
my $BackupsCurrent = qx(ls -A "$BackupDir" | grep -c ".tar.gz");;
## Menge der vorzuhaltenden Backup-Files
my $BackupsMax = 12;;
my $BackupsDelete = $BackupsCurrent - $BackupsMax;;

Log 1, "<<<<<<<<<< Backup CleanUp START >>>>>>>>>>";;

Log 1, "Backup Directory: $BackupDir";;
Log 1, "Aktuelle Backups: $BackupsCurrent";;
Log 1, "Zu löschende Backups: $BackupsDelete";;
Log 1, "Liste der zu löschenden Backup-Files:";;

## Ausgabe der zu löschenden Files
if ($BackupsDelete > 0)
{
my $FilesDel = qx(ls -d "$BackupDir/"* | grep ".tar.gz" | head -$BackupsDelete);;
Log 1, $FilesDel;;
## Files löschen
my $BackupDelete = qx(ls -d "$BackupDir/"* | grep ".tar.gz" | head -$BackupsDelete | xargs rm);;
}
Log 1, "<<<<<<<<<< Backup CleanUp ENDE >>>>>>>>>>";;
} )

oli_bru

Hi, cool - danke für die Ergänzung!

Funzt bei mir  8)

Kurze Ergänzung noch von meiner Seite: Es muss natürlich in der Definition von global das Verzeichnis mit "attr global ./backup" hinterlegt worden sein.
FHEM auf PI 2, Homematic Wired IO Board auf Hutschiene, Div. Homematic Komponenten, Froggit Wetterstation HP1000

Mihca

Prima Script! Danke. Nachdem es erst bei mir nicht funktionierte, da ich über Global kein "backupdir" definiert habe, habe ich in Zeile 6 anstatt "undefined" das Standad Backup-Verzeichnis "/opt/fhem/backup" ergänzt:

([00:10:00|1])
( {
## Backup Montag
fhem("backup");;

my $BackupDir = AttrVal("global", "backupdir", "/opt/fhem/backup");;
my $BackupsCurrent = qx(ls -A "$BackupDir" | grep -c ".tar.gz");;
## Menge der vorzuhaltenden Backup-Files
my $BackupsMax = 12;;
my $BackupsDelete = $BackupsCurrent - $BackupsMax;;

Log 1, "<<<<<<<<<< Backup CleanUp START >>>>>>>>>>";;

Log 1, "Backup Directory: $BackupDir";;
Log 1, "Aktuelle Backups: $BackupsCurrent";;
Log 1, "Zu löschende Backups: $BackupsDelete";;
Log 1, "Liste der zu löschenden Backup-Files:";;

## Ausgabe der zu löschenden Files
if ($BackupsDelete > 0)
{
my $FilesDel = qx(ls -d "$BackupDir/"* | grep ".tar.gz" | head -$BackupsDelete);;
Log 1, $FilesDel;;
## Files löschen
my $BackupDelete = qx(ls -d "$BackupDir/"* | grep ".tar.gz" | head -$BackupsDelete | xargs rm);;
}
Log 1, "<<<<<<<<<< Backup CleanUp ENDE >>>>>>>>>>";;
} )
Viele Grüße
Achim
__________
Kein Fehler ist so dumm, dass man ihn nicht machen könnte.
Raspi Ubuntu 22.04 Perl 5.34, Rollo-, Sonnen-, Licht-, Heizungs-, Poolsteuerung, Energiebilanzen -- HomeMatic, FS20, ESP/Tasmota/ESPEasy, CUL868v3 USB, MAX! Cube LAN mit CUL-Firmware HomeMatic

Eistee

Mal eine blöde Frage. Warum nutzt Ihr nicht die Versionsverwaltung des Synology NAS? Ich sichere einfach mein komplette Filesystem mit rsync immer an den gleichen Ort. Heißt dort liegt der letzte stand. Und bei bedarf kann ich auch auf ältere Stände über die Versionsverwaltung zugreifen. Rsync hat außerdem den vorteil das nur geänderte Dateien neu übertragen werden müssen. Den rsync Befehl startet der PI einfach über cron. Da muss noch nicht mal FHEM zu laufen.
0 0 * * * /usr/bin/rsync -avz --delete --exclude="tmp" --exclude="sys" --exclude="lost+found" --exclude="mnt" --exclude="proc" --exclude="dev" --exclude="media" / rsync://admin@diskstation/Backup-Eistee/fhem --password-file ~/rsync.pwd

Wernieman

das ist aber nicht "Versionsverwaltung" der Synology, sondern von rsync ...

Gibt übrigens mehrere Software, die genau auf so etwas aufbauen: dirvish, rsnapshot ..... (und mehrere, die ich vergessen habe). Hier mache ich es mit dirvish.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Eistee

Das sichern mache ich mit rsync.

Das Versionsbackup macht die Versionsverwaltung auf dem NAS.


Das eine hat mit dem anderen nichts zu tun. Aktualisiert rsync eine Datei dann stehen bei mir bis zu 8 ältere Versionen der Datei bereit die ich bei bedarf Wiederherstellen kann.

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Mihca

#12
Zitat von: Eistee am 14 September 2020, 11:51:13
Mal eine blöde Frage. Warum nutzt Ihr nicht ...

Ich betreibe 3 Fhem-Systeme, davon eins bei mir zuhause auf einem NUC, der backups wöchentlich lokal und täglich auf einem Synology sichert  https://www.meintechblog.de/2015/05/fhem-howto-automatisches-backup-auf-externem-nas/. Für diesen gilt für die lokalen wöchentlichen backups die Aussage, dass das Attribut "backupdir" nicht gesetzt ist.

Die 2 anderen Fhem-Systeme sind stand-alone Raspberries in entfernten Immobilien, die Fhem-backups auf einer per USB angeschlossenen SSD speichern. Wenn mal wieder die SD-Card mit dem Raspbian den Geist aufgibt (ist schon eine Heavy Duty Card), wird diese durch eine vorhandene Kopie ersetzt und das letzte Fhem-backup zurückgespielt. Das ist für diesen Anwendungsfall mE die einfachste Lösung.
Viele Grüße
Achim
__________
Kein Fehler ist so dumm, dass man ihn nicht machen könnte.
Raspi Ubuntu 22.04 Perl 5.34, Rollo-, Sonnen-, Licht-, Heizungs-, Poolsteuerung, Energiebilanzen -- HomeMatic, FS20, ESP/Tasmota/ESPEasy, CUL868v3 USB, MAX! Cube LAN mit CUL-Firmware HomeMatic

Otto123

#13
Ich habe den Code aus #7 mal noch etwas gerafft und vor allem den Filter für die Backups an eine Stelle am Anfang gepackt und etwas "schärfer" gemacht da bei mir auch ein paar Backups dort landen die nur nach der Installation entstehen und nie gelöscht werden sollen:
{
my $BackupDir = AttrVal("global", "backupdir", "backup");;
$BackupDir.="/FHEM-*.tar.gz";;
my $BackupsMax = 12;;
my $BackupsCurrent = qx(ls -A $BackupDir | wc -l);;
my $BackupsDelete = $BackupsCurrent - $BackupsMax;;
if ($BackupsDelete > 0)
  {
    my $FilesDel = join "|",split "\n",qx(ls -d $BackupDir | head -$BackupsDelete);;
    my $BackupDelete = qx(ls -d $BackupDir | head -$BackupsDelete | xargs rm);;
    if ($BackupDelete eq "") {Log 1, "Es wurden $BackupsDelete alte Backupfiles gelöscht: $FilesDel"} else {Log 1, "Es trat ein Fehler auf $BackupDelete"};;
  }
}

Edit: Die LogAusgabe ist noch unsauber, da muss ich noch nachbessern :) done

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

cmonty14

Zitat von: Otto123 am 17 September 2020, 12:15:58
Ich habe den Code aus #7 mal noch etwas gerafft und vor allem den Filter für die Backups an eine Stelle am Anfang gepackt und etwas "schärfer" gemacht da bei mir auch ein paar Backups dort landen die nur
Edit: Die LogAusgabe ist noch unsauber, da muss ich noch nachbessern :) done

Gruß Otto

Hallo Otto,
könntest du bitte erläutern, was in FHEM angelegt werden muss um diesen Code für Backup-Cleanup auszuführen?

Danke.