Howto - Backup per lftp Script

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

treki

Benutzer
Registriert
04. Apr. 2013
Beiträge
113
Reaktionspunkte
12
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:
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
Ich meinte, dass meine Lösung nur halb so gut wie Basic Backup ist.
Also alles im Guten gemeint!
 
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
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:
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:
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:
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!
 

Additional post fields

 

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