Backup-Script für SysCP-Systeme mit FCGI

rellek

relativ sensationell
Teammitglied
Schönen guten Morgen,

ich dachte mir, ich lass euch mal mein neustes Script zu Teil werden.
Ein Backup-Script!
Es sichert alle SQL-Datenbanken und den gesamten Ordner, der im Web zugreifbar ist. Dies macht es jedes Mal, wenn es aufgerufen wird, idealerweise kann man sich also einen Cronjob schreiben ;)
Das Script macht immer dann Backups, wenn es angestossen wird. Das letzte Backup wird dabei gekillt, übrig bleibt nur das letzte von vergangener Woche, denn es wird jede Woche ein neuer Ordner angefangen.

Wovon das Script ausgeht:
Das Script geht von einer FCGI-Umgebung aus. Das bedeutet, dass der Webserver nicht über www-data oder ähnliches, sondern über einen separaten Benutzer läuft. Des Weiteren geht das Script von einem von SysCP gemanageten Web aus, es lässt sich aber recht leicht auf alle gängigen anderen Lösungen umschreiben.

Was wir brauchen:
Einen Backup-Ordner. Idealerweise sollte der auf einer anderen Festplatte liegen. Gehen wir mal davon aus, nicht gehackt zu werden, kann ja trotzdem die primäre Festplatte sterben. Wäre unglücklich, wenn auf der toten Festplatte das Backup liegt ;) Die zweite Festplatte sei unter /backups gemountet.
Des Weiteren brauchen wir für jeden, der auf dem Server residiert einen echten Linux-Benutzer. Schaut euch dafür die Doku an.

Zuerst einmal legen wir eine Datei an, die SysCP- und Linux-Benutzer beinhält, und zwar bereits miteinander verknüpft. Ich habe meine unter /etc/backupconf.conf abgelegt, wer sie woanders speichern möchte, muss dies nachher im eigentlichen Script ändern. In der Datei steht in etwa dies drin:
Code:
syscpuser1 linuxuser1
syscpuser2 linuxuser2
syscpuser3 linuxuser2
Wie ihr seht, gibt es für den dritten SysCP-User keinen Linux-User, der Linux-User 2 bekommt später also Zugriffsrechte.

Und das eigentliche Script. Dies habe ich unter /usr/share/backups.sh abgelegt. Es braucht zudem noch Ausführungsrechte:
Code:
chmod +x /usr/share/backups.sh
Der Inahlt der Datei ist wie folgt:
Code:
#!/bin/bash
# "geheim" ist das MySQL-Rootpasswort:
ROOTPW=geheim
BACKUPFOLDER=/backups
CFGFILE=/etc/backupconf.conf
DBASELIST=`mktemp`
IFS="
"

for y in `cat $CFGFILE`; do
    FOLDER=`echo $y | awk '{print $1}'`;
    USER=`echo $y | awk '{print $2}'`;
    echo "Sicherung von $FOLDER...";
    mysqlshow -p$ROOTPW | awk '{print $2}' | grep -v Databases | grep $FOLDER | sort >$DBASELIST;
    cd $BACKUPFOLDER;
    mkdir -p `date +%Y%m%W`/$FOLDER;
    cd `date +%Y%m%W`/$FOLDER;
    for x in `cat $DBASELIST`; do
        echo "Datenbank: $x sichern";
        mysqldump --opt -p$ROOTPW $x >$x.sql;
    done;
    echo "Datenbanken einpacken...";
    rm backup.zip;
    rm *.gz;
    gzip *;
    echo "httpdocs einpacken...";
    zip -r backup.zip /var/syscp/webs/$FOLDER/;
    cd ..;
    #rechte erstellen
    chown -R $USER:$FOLDER ./$FOLDER;
    #rechte setzen (USER kann lesen und schreiben; FOLDER kann nur lesen)
    chmod -R 750 ./$FOLDER;
done;

Wer sich mit dem Script auseinandersetzt, wird feststellen, wieso die Config-Datei wichtig ist: Es wird nur derjenige Inhalt (Dateien wie Datenbanken) gesichert, der in der Config erwähnt wird!

Nun kann das Script mal probiert werden. Dazu einfach mal als Root auf der Konsole aufrufen.

Wenn das schliesslich funktioniert hat, kann man mit einem Programm wie WinSCP (Windows), Fugu (Mac) oder einem sonstigen SFTP-Client mal eine Verbindung starten und sich als einer der angelegten User anmelden. Im Ordner /backups liegt nun ein weiterer Ordner, der folgendem Schema folgt:
YYYYMMWW
Wobei WW die Woche ist. Dort drin sind wiederum Ordner, die den SysCP-Benutzernamen entsprechen. Jeder Linux-User sollte nur zu seinen zugewiesenen SysCP-Namen Zutritt haben.

Wenn das alles schön funktioniert hat, kann das Script Teil der Cronjobs werden, damit der Aufruf automatisch erfolgt. Je nach dem, wie viel auf dem Server liegt, dauert es eine ganze Weile, bis die Sicherung fertig ist. Währenddessen ist der Server ordentlich beschäftigt, deshalb sollte ein Zeitpunkt gewählt werden, an dem möglichst niemand online ist. Bei meinen Web-Projekten ist das die Stunde zwischen 4:00 und 4:59.
Also die /etc/crontab um folgende Zeile erweitern:
Code:
12 4    * * *   root    /usr/share/backups.sh
Damit wird jeden Tag um 4:12 der Backup-Vorgang losgetreten.

Disclaimer:
Die hier aufgelisteten Scripte sind ohne jegliche Garantie und wer nicht weiss, was er tut, sollte ohnehin nicht seinen Server mit dem Root-User vergewaltigen.
Bei mir funktioniert die hier beschriebene Anleitung aber :)

Vielleicht hilft das dem einen oder anderen - wenn dem so ist, wünsche ich viel Spass damit :)
 

rellek

relativ sensationell
Teammitglied
In der Stunde zwischen 4 und 5 ist am wenigsten los und wenns zu keiner glatten Uhrzeit losgeht, sinkt die Wahrscheinlichkeit, dass andere Dienste dieselbe Idee hatten.
 
Oben