Remote Webserver Backup mit Linux NAS

Die fol­gen­de Anlei­tung habe ich mit einer Link­sys NSLU2 und Uns­lung 6.10 inkl. Open­S­SH aus­pro­biert. Soll­te aber auch mit jeder ande­ren NAS, die mit Linux läuft und SSH-Zugriff von außen erlaubt zulassen.

Das Skript muss mit hoher Wahr­schein­lich­keit von Euch noch ange­passt wer­den. Es han­delt sich nicht um eine Auf­Den­Ser­ver­Oh­ne­Zu­Den­ken­Ko­pie­ren­Und­Aus­füh­ren-Vari­an­te. Also Skript genau anschau­en und verstehen.

Das Problem

Ich möch­te von mei­nem Web­ser­ver jede Nacht ein Back­up machen und die­ses auf mei­nen NAS-Ser­ver zu Hau­se kopie­ren. Gesi­chert wer­den sol­len die MyS­QL-Daten­ban­ken und die Ver­zeich­nis­se mit den Dateien.

Die Voraussetzungen

  • Linux-Web­ser­ver mit der Mög­lich­keit Skrip­te aus­zu­füh­ren und Cron­jobs zu erstellen
  • NAS mit Linux auf die man von außen Zugriff per SSH hat

Das Vorgehen im Groben

  • Ein Archiv der MyS­QL-Daten­ban­ken mit tar erzeugen
  • Ein Archiv des zu sichern­den Ver­teich­nis­ses mit tar erzeugen
  • Archi­ve per SCP übertragen
  • Archi­ve auf dem Ser­ver löschen

Kopieren per SCP ohne Passwort-Eingabe

Da ich den SCP-Befehl benut­ze um die Datei­en zu über­tra­gen muss ich das Pro­blem lösen die­sen ohne Abfra­ge des Pass­wor­tes aus­zu­füh­ren. SCP kennt lei­der kei­nen Para­me­ter um das Pass­wort mit in der Kom­man­do­zei­le zu über­ge­ben. Dir Syn­tax für unser Pro­blem ist

scp <dateiname> user@host.de:/ziel/verzeichnnis

Danach wird aller­dings nach einem Pass­wort gefragt, was wir zunächst umge­hen müssen.

Dafür gibt es eine pri­ma Anlei­tung, die ich für die­sen Zweck ver­wen­det habe. Ein­fach Step by Step abarbeiten.

Backup Script auf Server erstellen

Wenn das grund­sätz­li­che Kopie­ren per SCP vom Ser­ver auf die NAS funzt, geht es an das Skript, wel­ches alles auto­ma­tisch aus­führt. Die­ses läuft spä­ter per Cron­job auf dem Webserver.

In dem Skript gehe ich von der Kon­fi­gu­ra­ti­on auf mei­nem Root­ser­ver aus. Das müsst Ihr evtl. für Eure Zwe­cke anpassen.

  • MyS­QL-Daten­ban­ken lie­gen in /var/lib/mysql
  • Die Daten der ein­zel­nen Domains lie­gen für neunzehn72.de in /home/n/neunzehn72.de
    Es gibt also für jeden Buch­sta­ben ein Sub­di­rec­to­ry, in die­sem Fall “n” wo dann neunzehn72.de liegt.

Skript Teil 1 - Die Variablen

today=`date +%Y%m%d`
webroot='/home'
dbuser='root'
dbpass='password'
databases=( neunzehn72_blog zweiteMySQLDB dritteMySQLDB )
domains=( neunzehn72.de zweite-domain.de dritte-domain.de )

data­ba­ses sind die ein­zel­nen Unter­ver­zeich­nis­se unter­halb vom MyS­QL-Ver­zeich­nis in denen die jewei­li­gen Daten­ban­ken liegen.

domains sind auch jeweils die Unter­ver­zeich­nis­se unter­halb des Web­roots, in mei­nem Fall hei­ßen die genau wie die Domain selbst.

Skript Teil 2 - Datenbanken sichern

for database in ${databases[@]}
do
filename=$today\_$database\_mysql.tar.gz
mysqldump -u $dbuser -p$dbpass --add-drop-table $database > /root/backup/$database.sql
tar zcvf /root/backup/$filename /root/backup/$database.sql >/dev/null
scp /root/backup/$filename user@host.dyndns.org:/path/to/save/backup
rm /root/backup/$filename
rm /root/backup/$database.sql
done

In die­ser Schlei­fe wird jede Daten­bank per mys­qldump expor­tiert und dann als Tar-Archiv im Ver­zeich­nis /root/backup abge­legt. Anschlie­ßend dann per SCP auf die NAS gescho­ben und wie­der auf dem Ser­ver gelöscht. Im Datei­na­men des Archi­ves ist jeweils das Tages­da­tum enthalten.

Skript Teil 3 - Webroots sichern

for domain in ${domains[@]}
do
firstletter=${domain:0:1}
filename=$today\_${domain/./_}.tar.gz
tar zcvf /root/backup/$filename /home/$firstletter/$domain >/dev/null
scp /root/backup/$filename user@host.dyndns.org:/path/to/sav/backup
rm /root/backup/$filename
done

Der drit­te Teil des Skrip­tes funk­tio­niert ähn­lich dem zwei­ten. Ledig­lich die Varia­ble “first­let­ter” wird erstellt, da ich den ers­ten Buch­sta­ben der Domain für den Pfad benötige.

Das kom­plet­te Skript gibt es hier noch ein­mal zum Down­load.

Cronjob erstellen

Zuletzt müs­sen wir noch einen Cron­job erstel­len. Ich las­se das Skript jede Nach um 5:00 Uhr lau­fen. Dazu in der cron­tab einen Ein­trag erzeugen

0 5 * * * /root/backup_remote.sh > /dev/null

und die Cron­tab instal­lie­ren. Wie das genau geht fin­det Ihr not­falls über Google.

Viel Spaß damit. Es bleibt genug Raum für Ver­bes­se­run­gen, z.B.

  • für jeden Tag ein Ver­zeich­nis auf dem Back­up-NAS erstellen
  • Back­ups nur für einen bestimm­ten Zeit­raum aufbewahren

Mit dem Absenden eines Kommentars stimmst du unserer Datenschutzerklärung und der Speicherung von dir angegebener, personenbezogener Daten zu.

7 Gedanken zu „Remote Webserver Backup mit Linux NAS“

  1. Das Sichern der MyS­QL-Datei­en direkt ist kei­ne gute Idee, steht auch irgend­wo in der Doku­men­ta­ti­on, da man sich da auch evtl. vor­lie­gen­de LOCKs mit­si­chert und die Daten­bank evtl. inkon­sis­tent ist in der Sicherung.
    Laut Doku soll­te man sich mit mys­qldump --opt einen Dump erzeu­gen und den sichern.

    Antworten
  2. gutes tuto­ri­al. jedoch stim­me ich jens zu. wenn du nur die datei­en sicherst kannst du im schlim­mes­ten fall nur daten­schrott erhal­ten. oder daten die nicht mehr in der form vor­han­den sind wie sie sollten.

    Antworten

Schreibe einen Kommentar