Howto - Backup per lftp Script

treki

Benutzer
Mitglied seit
04. Apr 2013
Beiträge
107
Punkte für Reaktionen
9
Punkte
24
Da es sich nur um ein Zweitbackup handelt (falls das NAS mit seiner USB Backup-HDD bei einem Hausbrand abbrennt), wird dieses per Richtstrahlantennen zu einem entfernten Haus auf ein FritzNAS übertragen. Habe das jetzt mit einem lftp Script gelöst.
Dazu muss auf der Fritzbox FTP aktiviert sein. In diesem Beispiel ist das Verzeichnis backup auf dem FritzNAS angelegt.

Auswahl_001.png

Da es sich um ein internes Netzwerk handelt, hab ich auf SSL verzichtet.
Das will ich euch nicht vorenthalten.
Hier das Script, welches im Auftragsplaner (Benutzerdefiniertes Script - Benutzer/Besitzer = admin) per
bash /volume1/NetBackup/ftpbackup.sh > /volume1/NetBackup/backup_fritznas.log (Pfade ggf anpassen)
1x pro Woche gestartet wird.

ftpbackup.sh
Code:
user="ds216se"         # Backup-User auf FritzNAS
pass="xxxxxxxxxx"
addr="192.168.1.yyy"   # IP der Fritzbox im internen Netzwerk

# Die User unter homes sind anzupassen!

echo "**** Backup gestartet."
lftp -e "set ftp:ssl-allow off; mirror -R -v -n --parallel=3 /volume1/homes/Markus /backup/homes/Markus --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr
echo "**** homes/Markus Backup fertig."
lftp -e "set ftp:ssl-allow off; mirror -R -v -n --parallel=3 /volume1/homes/Beat /backup/homes/Beat --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr
echo "**** homes/Beat Backup fertig."
lftp -e "set ftp:ssl-allow off; mirror -R -v -n --parallel=3 /volume1/video /backup/video --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr
echo "**** video Backup fertig."
lftp -e "set ftp:ssl-allow off; mirror -R -v -n --parallel=3 /volume1/dokumente /backup/dokumente --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr
echo "**** dokumente Backup fertig."
lftp -e "set ftp:ssl-allow off; mirror -R -v -n --parallel=3 /volume1/music /backup/music --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr
echo "**** music Backup fertig."
lftp -e "set ftp:ssl-allow off; mirror -R -v -n --parallel=3 /volume1/photo /backup/photo --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr
echo "**** photo Backup fertig."
echo
echo "**** Backup abgeschlossen."
exit

Läuft in meinem Fall auf DSM7.1 (lftp ist bereits vorinstalliert). Wird aber auch auf anderen Versionen klappen.
Nachteil gegenüber rsync: Lokal gelöschte Dateien verbleiben im Backup. Darum auch nur als Zweitbackup nutzen ;)
Ist eine 50% alternative zu Basic Backup, da dieser bei mir partout nicht funktionieren wollte.
 
Zuletzt bearbeitet:

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.669
Punkte für Reaktionen
1.566
Punkte
314
Hi!

Zunächst einmal finde ich es gut, das du nach anderen Wegen und Lösungen gesucht hast und augenscheinlich auch fündig geworden bist. Ich bin mir auch ziemlich sicher, das du es anders meintest als ich es aufgefasst habe, daher nur für`s Protokoll...
Ist eine 50% alternative zu Basic Backup, da dieser bei mir partout nicht funktionieren wollte.

Ich möchte an dieser Stelle gerne betonen, das es sich bei Basic Backup nur eine grafische Benutzeroberfläche handelt, welche die Konfiguration von rsync erleichtern soll. Daher ist dein "nicht funktionieren" meines Erachtens eher auf rsync und weniger auf Basic Backup zurückzuführen. Des Weiteren habe ich stets betont, das die Sicherung auf, in die File Station eingebundene Remote-Ordner, von Basic Backup offiziell nicht unterstützt wird, auch wenn die Möglichkeit dafür besteht. Hyper Backup lässt dies prinzipiell nicht zu und die werden ihre Gründe dafür haben.

Nichtsdestotrotz lasse ich mich auch gerne vom Gegenteil überzeugen, da die Möglichkeit eines Fehlverhaltens seitens Basic Backup immer besteht und ich dies auch nie hundertprozentig ausschließen kann. Du könntest demnach versuchen, rsync unabhängig von Basic Backup zu konfigurieren und auszuführen, um zu schauen, ob die Fehler, die dir in diesem Beitrag ausgegeben wurden, immer noch bestehen. Solltest du dies dann fehlerfrei ausführen können, nehme ich natürlich alles zurück, was ich grade geschrieben habe und krabbel zurück unter meinen Stein. Sobald ich mich dann wieder ein wenig gefangen habe, würde ich damit beginnen, nach einer Lösung für dieses Problem zu suchen.

Unabhängig davon, würde ich es an deiner Stelle wirklich mal mit rsync probieren, allein aus der Tatsache heraus, damit du am Ende an dein eigentliches Ziel kommst und dich nicht mit Kompromissen abgeben musst, das z.B. lokal gelöschte Daten im Ziel erhalten bleiben.

Tommes
 
  • Like
Reaktionen: treki und maxblank

treki

Benutzer
Mitglied seit
04. Apr 2013
Beiträge
107
Punkte für Reaktionen
9
Punkte
24
Ich meinte, dass meine Lösung nur halb so gut wie Basic Backup ist.
Also alles im Guten gemeint!
 

synfor

Benutzer
Sehr erfahren
Mitglied seit
22. Dez 2017
Beiträge
9.021
Punkte für Reaktionen
1.614
Punkte
308
Des Weiteren habe ich stets betont, das die Sicherung auf, in die File Station eingebundene Remote-Ordner, von Basic Backup offiziell nicht unterstützt wird, auch wenn die Möglichkeit dafür besteht. Hyper Backup lässt dies prinzipiell nicht zu und die werden ihre Gründe dafür haben.
Mir fällt dazu folgendes ein: Beim Backup in einen remote Ordner besteht die Gefahr, dass der während des Backups getrennt wird, ohne dass das Backupprogramm das mitbekommt und dann lokal weiter schreibt. Wenn das Backupprogramm selbst per SMB direkt auf den entfernten Ordner schreibt, gibt es damit kein Problem.
 
  • Like
Reaktionen: treki und Tommes

treki

Benutzer
Mitglied seit
04. Apr 2013
Beiträge
107
Punkte für Reaktionen
9
Punkte
24
Konnte das Problem mit den verbleibenden Dateien im Backup lösen.
Es ist nur der Parameter --delete notwendig ^^

Code:
user="ds216se"         # Backup-User auf FritzNAS
pass="xxxxxxxxxx"
addr="192.168.1.yyy"   # IP der Fritzbox im internen Netzwerk
port=21

# Die User unter homes sind anzupassen! In diesem Bsp die zwei User Beat und Markus.

echo "**** Backup gestartet."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -v -n --parallel=3 /volume1/homes/Markus /backup/homes/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
echo "**** homes/Markus Backup fertig."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -v -n --parallel=3 /volume1/homes/Beat /backup/homes/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
echo "**** homes/Beat Backup fertig."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -v -n --parallel=3 /volume1/video /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
echo "**** video Backup fertig."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -v -n --parallel=3 /volume1/dokumente /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
echo "**** dokumente Backup fertig."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -v -n --parallel=3 /volume1/music /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
echo "**** music Backup fertig."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -v -n --parallel=3 /volume1/photo /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
echo "**** photo Backup fertig."
echo
echo "**** Backup abgeschlossen."
exit
 
Zuletzt bearbeitet:

treki

Benutzer
Mitglied seit
04. Apr 2013
Beiträge
107
Punkte für Reaktionen
9
Punkte
24
Verbessertes Script.
Im Auftragsplaner (Benutzerdefiniertes Script - Benutzer/Besitzer = admin)
bash /volume1/NetBackup/ftpbackup.sh > /volume1/NetBackup/backup_fritznas.log 2>&1
eintragen. Pfade ggf anpassen.

ftpbackup.sh

Code:
user="ds216se"         # Backup-User auf FritzNAS
pass="xxxxxxxxxx"
addr="192.168.1.yyy"   # IP der Fritzbox im internen Netzwerk
port=21

# Die User unter homes sind hier einzutragen. In diesem Bsp die zwei User Beat und Markus.
declare -a users=("Beat"
                  "Markus"
                  "weitereUser"
                  )

## Ab hier nichts mehr aendern ##

error=0
echo "**** Backup gestartet."
for i in "${users[@]}"
do
    echo "**** "$(date +"%d.%m.%Y %H:%M")" homes/$i Backup gestartet."
    lftp -e "set ftp:ssl-allow off; mirror --delete -R -n --parallel=3 /volume1/homes/$i /backup/homes/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
    if [ $? -ne 0 ]; then
        echo "**** $i Backup war fehlerhaft!"
        error=$(( $error + 1 ))
    else
        echo "**** homes/$i Backup fertig."
    fi
done

echo "**** "$(date +"%d.%m.%Y %H:%M")" video Backup gestartet."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -n --parallel=3 /volume1/video /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
if [ $? -ne 0 ]; then
    echo "**** video Backup war fehlerhaft!"
    error=$(( $error + 1 ))
else
    echo "**** video Backup fertig."
fi

echo "**** "$(date +"%d.%m.%Y %H:%M")" dokumente Backup gestartet."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -n --parallel=3 /volume1/dokumente /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
if [ $? -ne 0 ]; then
    echo "**** dokumente Backup war fehlerhaft!"
    error=$(( $error + 1 ))
else
    echo "**** dokumente Backup fertig."
fi

echo "**** "$(date +"%d.%m.%Y %H:%M")" music Backup gestartet."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -n --parallel=3 /volume1/music /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
if [ $? -ne 0 ]; then
    echo "**** music Backup war fehlerhaft!"
    error=$(( $error + 1 ))
else
    echo "**** music Backup fertig."
fi

echo "**** "$(date +"%d.%m.%Y %H:%M")" photo Backup gestartet."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -n --parallel=3 /volume1/photo /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
if [ $? -ne 0 ]; then
    echo "**** photo Backup war fehlerhaft!"
    error=$(( $error + 1 ))
else
    echo "**** photo Backup fertig."
fi

#lftp -e "set ftp:ssl-allow off; mirror --delete -R -v -n --parallel=3 /volume1/home /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
#echo "**** home backup fertig."

echo
if [ $error -gt 0 ]; then
    echo "**** "$(date +"%d.%m.%Y %H:%M")" Backup mit $error Fehlern abgeschlossen!"
else
    echo "**** "$(date +"%d.%m.%Y %H:%M")" Backup fehlerfrei abgeschlossen."
fi

exit
 
Zuletzt bearbeitet:

treki

Benutzer
Mitglied seit
04. Apr 2013
Beiträge
107
Punkte für Reaktionen
9
Punkte
24
Nun zusätzlich mit Mailversand.
Im Auftragsplaner (Benutzerdefiniertes Script - Benutzer/Besitzer = admin)
bash /volume1/NetBackup/ftpbackup.sh
eintragen. Pfad an deine Gegebenheiten anpassen (da wo das Script liegt).

ftpbackup.sh

Code:
user="ds216se"         # Backup-User auf FritzNAS
pass="xxxxxxxxxx"
addr="192.168.1.yyy"   # IP der Fritzbox im internen Netzwerk
port=21
mailto="empfaenger@gmail.com"
mailfrom="versender@gmail.com"

# Die User unter homes sind hier einzutragen. In diesem Bsp die zwei User Beat und Markus:
declare -a users=("Beat"
                  "Markus"
                  "weitereUser"
                  )

## Ab hier nichts mehr aendern ##

SCRIPTPATH=$(cd `dirname $0` && pwd)
scriptname=$(basename "$0")
exec >$SCRIPTPATH/$scriptname.log 2>&1
error=0
echo "**** Backup gestartet."
for i in "${users[@]}"
do
    echo "**** "$(date +"%d.%m.%Y %H:%M")" homes/$i Backup gestartet."
    lftp -e "set ftp:ssl-allow off; mirror --delete -R -n --parallel=3 /volume1/homes/$i /backup/homes/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
    if [ $? -ne 0 ]; then
        echo "**** $i Backup war fehlerhaft!"
        error=$(( $error + 1 ))
    else
        echo "**** homes/$i Backup fertig."
    fi
done

echo "**** "$(date +"%d.%m.%Y %H:%M")" video Backup gestartet."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -n --parallel=3 /volume1/video /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
if [ $? -ne 0 ]; then
    echo "**** video Backup war fehlerhaft!"
    error=$(( $error + 1 ))
else
    echo "**** video Backup fertig."
fi

echo "**** "$(date +"%d.%m.%Y %H:%M")" dokumente Backup gestartet."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -n --parallel=3 /volume1/dokumente /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
if [ $? -ne 0 ]; then
    echo "**** dokumente Backup war fehlerhaft!"
    error=$(( $error + 1 ))
else
    echo "**** dokumente Backup fertig."
fi

echo "**** "$(date +"%d.%m.%Y %H:%M")" music Backup gestartet."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -n --parallel=3 /volume1/music /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
if [ $? -ne 0 ]; then
    echo "**** music Backup war fehlerhaft!"
    error=$(( $error + 1 ))
else
    echo "**** music Backup fertig."
fi

echo "**** "$(date +"%d.%m.%Y %H:%M")" photo Backup gestartet."
lftp -e "set ftp:ssl-allow off; mirror --delete -R -n --parallel=3 /volume1/photo /backup/ --exclude '#recycle/' --exclude '@recycle/' --exclude '@eaDir/'; quit" -u $user,$pass $addr -p $port
if [ $? -ne 0 ]; then
    echo "**** photo Backup war fehlerhaft!"
    error=$(( $error + 1 ))
else
    echo "**** photo Backup fertig."
fi

echo
if [ $error -gt 0 ]; then
    echo "**** "$(date +"%d.%m.%Y %H:%M")" Backup mit $error Fehlern abgeschlossen!"
else
    echo "**** "$(date +"%d.%m.%Y %H:%M")" Backup fehlerfrei abgeschlossen."
fi

function send_email(){      # Thanks to https://github.com/wallacebrf/synology_send_mail
#to_email_address=${1}
#from_email_address=${2}
#log_file_location=${3}
#log_file_name=${4}
#subject=${5}
#mail_body=${6}

    if [[ "${3}" == "" || "${4}" == "" ]];then
        echo "Incorrect data was passed to the \"send_email\" function, cannot send email"
    else
        if [ -d "${3}" ]; then #make sure directory exists
            if [ -w "${3}" ]; then #make sure directory is writable
                if [ -r "${3}" ]; then #make sure directory is readable
                    local now=$(date +"%T")
                    echo "To: ${1} " > ${3}/${4}
                    echo "From: ${2} " >> ${3}/${4}
                    echo "Subject: ${5}" >> ${3}/${4}
                    #echo "" >> ${3}/${4}
                    echo -e "\n$now - ${6}\n" >> ${3}/${4}
                                                 
                    if [[ "${1}" == "" || "${2}" == "" || "${5}" == "" || "${6}" == "" ]];then
                        echo -e "\n\nOne or more email address parameters [to, from, subject, mail_body] was not supplied, Cannot send an email"
                    else
                        if ! command -v ssmtp &> /dev/null #verify the ssmtp command is available
                        then
                            echo "Cannot Send Email as command \"ssmtp\" was not found"
                        else
                            local email_response=$(ssmtp ${1} < ${3}/${4}  2>&1)
                            if [[ "$email_response" == "" ]]; then
                                echo -e "\nEmail Sent Successfully" |& tee -a ${3}/${4}
                            else
                                echo -e "\n\nWARNING -- An error occurred while sending email. The error was: $email_response\n\n" |& tee ${3}/${4}
                            fi
                        fi
                    fi
                else
                    echo "cannot send email as directory \"${3}\" does not have READ permissions"
                fi
            else
                echo "cannot send email as directory \"${3}\" does not have WRITE permissions"
            fi
        else
            echo "cannot send email as directory \"${3}\" does not exist"
        fi
    fi
}

send_email "$mailto" "$mailfrom" "$SCRIPTPATH" "mail.log" "FritzNAS Backup" "$(cat $SCRIPTPATH/$scriptname.log)"
 
Zuletzt bearbeitet:

treki

Benutzer
Mitglied seit
04. Apr 2013
Beiträge
107
Punkte für Reaktionen
9
Punkte
24
Dürft es ruhig mal ausprobieren.
Wenn's nicht klappt, passiert auch nichts!
Alles so genacht, dass keine zusätzlichen Pakete installiert werden müssen.
Mehr noch: Habe auf einem NAS ohne SSH Zugriff ausgetestet!
 


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat