Wie erstellt man einfach und schnell Backups in Joomla! und Wordpress? - Kubik-Rubik Backup Scripts

Dieses Tutorial wurde in der Rohfassung von Roland (Naturstrolche.de) erstellt und ist von mir überarbeitet und ergänzt worden.

Das Skript gibt es auch als eigenständige Komponente für Joomla! 2.5: EJB - Easy Joomla! Backup

Logo des Skripts Kubik-Rubik Joomla! Backup ScriptKubik-Rubik hat für die Systeme Joomla! und Wordpress zwei PHP Skripte geschrieben, mit denen man die komplette Website samt Datenbank sehr einfach und schnell sichern kann. Dabei muss man sich nicht vorher irgendwo einloggen, sondern kann das Skript direkt aufrufen und somit komplette Backuparchive (im Zip-Format) über einen Aufruf im Browser erstellen lassen. Das Skript hat mehrere Einstellungen, die wir weiter unten genauer betrachten werden. Standardmäßig ist das Skript auf einen einzigen Backupprozess optimiert. Durch ein paar Änderungen in den Einstellungen kann man das Skript für regelmäßige Backups verwenden, die sich zum Beispiel auch über Cronjobs erledigen lassen.

Downloadseite für Joomla! (JBS): http://joomla-extensions.kubik-rubik.de/de/downloads/php-scripts-php-skripte/kubik-rubik-joomla-backup-script
Downloadseite für Wordpress (WBS): http://joomla-extensions.kubik-rubik.de/de/downloads/php-scripts-php-skripte/kubik-rubik-wordpress-backup-script

Wer eine Website betreibt, lebt mit mehreren Hoffnungen:

  • Die Site möge nicht in die Hände eines Hackers fallen
  • Der Server möge nie einen technischen Fehler bekommen
  • Die Website möge nach einem Update noch richtig funktionieren
  • ...

Diesen Dingen kann man wesentlich gelassener entgegen sehen, wenn man aktuelle Backups von der Website hat. Backups, auch Sicherungen genannt, sind das täglich Brot eines Websitebetreibers. Wer ohne Sicherungen eine Site betreibt ist vergleichbar mit einem Autofahrer, der auf Bremsen verzichtet. Eine besonders gute Idee ist das sicherlich nicht.

Jeder Administrator sollte regelmäßig Backups anlegen, um bei Problemen den funktionierenden Zustand wiederherstellen zu können. Vor jeder großen Änderung ist ein Backup der Website Pflicht!

Aus was besteht eine komplette Sicherung einer Website?

Eine komplette Sicherung von Joomla! oder Wordpress besteht aus den Dateien und der Datenbank. Die Dateien sind das, was uns mit einem FTP Programm zugänglich ist. Die Datenbank ist klassischerweise eine MySQL Datenbank, die über phpMyAdmin verwaltet werden kann. Sind diese Dinge vorhanden, kann man eine Internetseite vollständig wiederherstellen. So eine Sicherung ist im Grunde die Versicherungspolice für eine Website.
Um eine klassische, immer funktionierende Sicherung zu erstellen, benötigt man mehrere Klicks und häufig eine Reihe an Passworteingaben. Man muss Dateien per FTP herunterladen und die Datenbank exportieren. Ein Arbeitsaufwand der nicht unerheblich ist. Die Gefahr dabei ist, dass diese Art Sicherungen zu erstellen schnell lästig wird und irgendwann die Sorgfalt schwindet.

JBS (Joomla! Backup Script) und WBS (Wordpress Backup Script) erledigen diese Aufgabe mit einer Befehlszeile im Browser. Danach lässt sich die Sicherung per Browser downloaden. Einfacher und schneller geht es kaum. Auch das Einspielen einer Sicherung läuft ähnlich unproblematisch. Bei dieser Art der Sicherung hat man die Dateien und die Datenbank im Griff. Die Dateien sind weder verschlüsselt noch brauchen sie zur Weiterverwendung ein besonderes Programm. Bei JBS und WBS handelt es sich um PHP Skripte, die man so verwenden kann, wie sie vorkonfiguriert sind. Allerdings lässt sich eine ganze Reihe an Einstellungen vornehmen und an die eigenen Bedürfnisse anpassen.

Prinzipielles Vorgehen

Im Folgenden wird beschrieben, was das Skript macht und wie es mit den Standardeinstellungen arbeitet. Wir zeigen das Vorgehen anhand des Joomla! Backup Skripts, für das Wordpress Backup Skript ist das Vorgehen gleich!

Backup Skript runterladen und entpacken

JBS downloaden und das Ziparchiv entpacken. Die Datei jbs.php auf den Server hochladen und über den Browser aufrufen (www.eigene-domain.de/jbs.php).
Hochgeladen wird die Datei in das sogenannte Rootverzeichnis. Damit ist die oberste Ebene gemeint, die außerhalb jeglichen Ordners liegt. Dort befinden sich in aller Regel zum Beispiel auch die .htaccess oder die configuration.php.

Backup Skript und erstelltes Archiv im Rootverzeichnis

Das Skript fängt nach Aufruf über den Browser an, die Dateien und die Datenbank in eine zip-Datei zu packen. Dies kann einen Moment dauern (je nach Größe der Website von ein paar Sekunden bis einige Minuten). Während dieser Zeit bleibt der Bildschirm weiß, der Browser weist mit einem Ladesymbol darauf hin, dass sich etwas tut (je nach Browser zum Beispiel mit dem Hinweis: 'Warten auf www.eigene-domain.de').
Wenn das Skript die Arbeit erledigt hat, erscheint eine Meldung im Bildschirm, dass die Sicherung zum Download bereit steht. Diesen Link anklicken und die Sicherung wird auf den Computer heruntergeladen. Dabei verbleibt die Sicherung auf dem Server und sollte per FTP nach dem Download gelöscht werden. Weiter unten im Tutorial erklären wir, wie man die Sicherungsdateien vor unerlaubten Zugriffen schützen kann.

Erfolgsmeldung des Backup Skripts

Das Skript löscht sich in der Grundeinstellung nach dem Vorgang selbständig vom Server, so dass kein anderer mehr auf dieses Skript zugreifen kann.
Weitere Vorteile des Skriptes: Ist das Skript sicher auf dem Server hochgeladen, kann man von jedem Computer mit Internetanschluss eine Sicherung der Internetseite erstellen lassen und die Sicherung auf diesen Computer runterladen. Das hat den Vorteil, dass man ein Backup nicht mit auf Reisen nehmen muss, falls man zum Beispiel im Urlaub an der Website etwas machen möchte. Ist das Skript korrekt konfiguriert, kann man die Sicherung der Website auch auf seine Kunden übertragen, da diese nur einen Befehl in die Browserzeile eingeben muss. Oder man richtet einen automatischen Cronjob ein, der das Skript täglich oder in einem bestimmten Intervall aufruft. Somit sind die Ausreden, dass das Erstellen von Backups zu schwierig oder langwierig sei, nicht mehr zu verzeihen.

Fehlermeldungen und Lösungen

Das Skript ist sehr robust und sollte auf den meisten Servern problemlos laufen. Es kann jedoch je nach Konfiguration des Servers zu Problemen beim Backupprozess kommen. Hier sind mögliche Fehler und deren Lösungen.

Problem: Der Bildschirm bleibt weiß, der Browser stoppt die Ausführung des Skripts.

Lösung: Das kann sehr viele verschiedene Ursachen haben. Dabei ist es sehr hilfreich, eine Fehlerausgabe zu erhalten, um das Problem lösen zu können. Um einen Error Report zu bekommen, muss im Skript ganz oben folgende Zeile gelöscht (oder mit // auskommentiert) werden:

ini_set('error_reporting', 0);

Danach startet man das Skript noch mal neu und es sollte eine Fehlermeldung eingeblendet werden. Bei einigen Nutzern kam es zum einen (Gateway-) Timeout, weil das Skript zu lange ausgeführt wurde. Diese Einstellung wird von den Hostern vorgegeben und kann nicht beeinflusst werden. In diesem Fall kann man einfach über eine Option Ordner mit großen oder vielen Dateien ausschließen. Zum Beispiel muss der Bilderordner nicht bei jedem Backup gesichert werden und kann getrost ausgeschlossen werden!

Problem: Zip Klasse ist auf dem Server nicht installiert. Bitte Zip Modul aktivieren! (Class 'ZipArchive' not found)

Lösung: Es fehlt auf dem Server das Zip-Modul. Um das Backup-Skript zum Laufen zu bringen, muss serverseitig das Zip-Modul installiert sein. Dieses Zip-Modul wird in der php.ini aktiviert / installiert, bzw. PHP muss mit Zip-Unterstützung kompiliert werden. Das ist Sache des Hosters. Meistens ist dieses Modul aktiviert. Wenn nicht, den Hoster um Aktivierung kontaktieren.

Einstellungen

Bei den Backup Skripten können die Einstellungen ganz individuell gesetzt werden. Dazu öffnet man das Skript in einem geeigneten Editor (z.B. Notepad++). Dort werden die möglichen Einstellungen ebenfalls nochmal erläutert. Die Erläuterungen sind im Skript auf Englisch.
Auf der oben angegebenen Downloadseite wird beschrieben, wie man das Skript für regelmäßige Backups nutzen kann. Dafür muss man die Einstellungen des Skripts etwas anpassen, um die Sicherheit vor externen Aufrufen zu erhöhen. Mit ein paar Anpassungen kann man somit das Skript auch über einen Cronjob täglich aufrufen lassen und braucht sich keine Sorgen mehr um die Seite zu machen.

Einstellungen des Backup Skripts

Hier erklären wir die Einstellungen und geben gleich die optimale Einstellung für regelmäßige Backups an. Bei den Optionen steht immer die Empfehlung des Entwicklers als Kommentar (mit // getrennt).

$folder = '.' // Sollte nicht geändert werden.
Diese Option gibt an, welcher Ordner gesichert wird. Das ist der Startpunkt für die Sicherung, von dem aus alle Unterordner eingelesen und in das Zip Archiv gespeichert werden. Diese Option nur dann ändern, wenn das Skript in einen Unterordner abgelegt wird und aus diesem Unterordner gestartet wird (zum Beispiel: www.domain.de/skript/jbs.php). In diesem Fall wurde das Skript in den Unterordner 'skript' kopiert. Für das Skript bedeutet das, dass es die Dateien im Ordner 'skript' und die Dateien die darunter liegen, gesichert werden. Soll das Rootverzeichnis und alle anderen Ordner gesichert werden, dann muss man '.' in '..' ändern. Dieser Befehl sagt dem Skript, dass die Sicherung eine Ebene höher beginnen soll. Zusätzlich muss die Einstellung 'located root' (fast ganz unten in dieser Liste) angepasst werden.

$add_empty_folders = true; // Sollte nicht geändert werden, außer man benötigt keine leeren Ordner im Backup.
Diese Einstellung teilt dem Skript mit, ob leere Ordner mitgesichert werden sollen. Ändert man dieses auf 'false', werden leere Ordner von der Sicherung ausgeschlossen. Das ist nicht unbedingt empfehlenswert, da die Möglichkeit besteht, dass die eine oder andere Erweiterung leere Ordner anlegt, die später noch benötigt werden.

$name_of_archive = false; // Sollte nicht geändert werden, außer man benötigt einen individuellen Namen.
Die Sicherung wird automatisch nach dem Schema: websitenname-ordnerstruktur-datum.zip angelegt. Wer einen anderen Namen möchte kann diesen hier eingeben. Zum Beispiel: 'meine-sicherung'. Achtung: Bitte die Striche nicht vergessen. Keine Sonderzeichen oder Umlaute benutzen.

$target_directory = '.'; // Sollte in einen Ordner geändert werden, der nicht benutzt wird, z.B.: 'backup'. Der neue Ordner sollte mit einer .htaccess Datei geschützt werden!
Lässt man diese Option, wird die Sicherung auf derselben Ebene abgelegt, auf der das Skript liegt. Möchte man die Sicherung in einen bestimmten Ordner schreiben lassen, so kann man statt '.' zum Beispiel 'backup' angeben. Das Skript legt einen neuen Ordner mit dem Namen 'backup' an und schreibt in diesen Ordner die Sicherung. Tipp: Ordner in denen sich Sicherungen befinden, sollten immer per .htaccess vor externen Zugriffen geschützt werden.

$overwrite_archive = true; // Sollte auf false geändert werden, um den Verlust von alten Backupdateien zu vermeiden. Wenn der Speicherplatz limitiert ist, dann auf true lassen.
Diese Option sagt aus, dass eine vorhandene Sicherungsdatei mit demselben Namen überschrieben werden soll. Hat man für den Archivnamen einen eigenen Namen gegeben (siehe oben), dann wird die neue Sicherung die alte Sicherung mit dem gleichen Namen überschreiben. Sollte das nicht gewünscht sein, weil man Sicherungen über mehrere Tage hinweg haben möchte, so in false ändern. Somit wird keine Sicherung überschrieben. Dasselbe gilt auch, wenn man mehrere Sicherungen am einem Tag macht. Das Namensschema ist: websitenname-ordnerstruktur-datum.zip. Macht man am nächsten Tag die nächste Sicherung, so unterscheidet sich der Name schon alleine bezüglich des Datums und man kann die Einstellung auf true lassen. Wird die Option auf false gesetzt, werden die Namen weiterer Sicherungen am gleichen Tag mit einem Zeitstempel versehen, um das Überschreiben zu verhindern.

$exclude_files = false; // Sollte nicht geändert werden, außer man möchte Dateien ausschließen, die nicht im Backup benötigt werden.
Man kann Dateien von der Sicherung ausschließen. Das kann sinnvoll sein, wenn man zum Beispiel große Bilder oder Dateien wie Filme auf dem Server hat. Diese Dateien müssen nicht bei jedem Backupprozess mitgesichert werden, wenn man diese auf dem PC oder bereits eine Sicherung mit diesen Dateien hat. Das verkleinert die Sicherungsdatei, spart Speicherplatz und beschleunigt den Sicherungsprozess.
Wenn man sich nicht sicher ist, dann sollte man alle Dateien sichern lassen. Um Dateien auszuschließen, müssen diese einzeln angegeben werden und durch Komma getrennt werden. Dabei ist zu beachten, dass man die Dateien immer relativ vom Startpunkt angeben muss und nicht nur den Namen der Datei! Beispiel: 'video1.wmv, images/video2.wmv, images/bilder/urlaub/foto1.jpg'.

$exclude_folders = false; // Sollte nicht geändert werden, außer man möchte Ordner ausschließen, die nicht im Backup benötigt werden.
Wie man Dateien von der Sicherung ausschließen kann, so kann man auch ganze Ordner von der Sicherung ausschließen. Das kann sinnvoll sein, wenn es sich lediglich um Ordner mit großen Dateien handelt, die man auch auf dem eigenen PC gesichert hat.
Weiterhin kann es sinnvoll sein, die Ordner von möglichen Sicherungskomponenten, wie zum Beispiel Akeeba Backup, auszuschließen. Sonst werden die Sicherungsdateien dieser Komponenten mitgesichert, was zu sehr großen Sicherungsdateien führt. Bei dieser Option gilt dasselbe wie bei der Option für den Ausschluss von Dateien.
Will man den Akeeba Backup Ordner ausschließen, kann man folgendes eintragen: administrator/components/com_akeeba/backup

$delete_backup_script = true; // Sollte auf false geändert werden, sonst muss das Zip Skript bei jedem Backup Prozess erneut hochgeladen werden.
Das Skript wird nach einem kompletten Durchlauf gelöscht. Das ist eine reine Sicherheitsmaßnahme. Vor allem dann, wenn man das Skript ins Rootverzeichnis hochlädt und es nicht umbenannt wird. Somit könnte jeder eine Sicherung durch einen Aufruf durchführen und sich die Sicherungsdatei herunterladen. Das ist nicht nötig, wenn man das Skript umbenennt, es in einen Unterordner hochlädt und einen Token vergibt (siehe weiter unten).

$add_drop_statement = false; // Sollte nicht geändert werden, außer man möchte die Datenbank mit denselben Tabellen überschreiben.
Die Option bedeutet, dass beim SQL Dump der DROP Table Befehl hinzugefügt wird. Das braucht man, wenn man den Dump wieder in die gleiche Datenbank einspielen möchte. Damit werden die vorhandenen Tabellen vorher gelöscht. Sollte nicht geändert, denn die DB Struktur muss in diesem Fall ganz genau gleich sein wie im Dump. Wenn man das Archiv in dieselbe Datenbank einspielen möchte, dann kann man vorher die Tabellen manuell entfernen, weswegen man den DROP Befehl nicht unbedingt benötigt.

$additional_databases = false; // Sollte nicht geändert werden, außer man hat andere Datenbanken, die für die Joomla! Website benötigt werden (z.B.: eine Piwik Installation).
Das bedeutet, dass man zusätzlich zu der Joomla! Datenbank weitere Datenbank, die die gleichen Verbindungsdaten haben, mitsichern kann. Hat man zum Beispiel beim Hoster in der MySQL Umgebung 10 Datenbanken, die sich nur im Namen unterscheiden (db_1, db_2, db_3.....), kann man mit dieser Option auch diese Datenbank sichern lassen, in dem man die Namen der Datenbanken hier eingibt: 'db_2, db_3'.

$token = false; // Sollte in einen langen und sicheren Token geändert werden, um das Skript zu schützen.
Oben ist beschrieben, dass man das Skript durch Umbenennen oder Verstecken in einen Ordner vor externen Zugriffen schützen kann. Dieses ist allerdings nur ein geringer Schutz. Um das Skript sicher zu schützen, kann man hier einen Token eingeben. Token bedeutet in diesem Fall nichts anderes als ein Passwort. Ohne die Angabe des Tokens kann das Skript nicht gestartet werden. Das Skript muss mit dem Token zusammen aufgerufen werden. Beispiel: www.domain.de/jbs.php?token=[TOKEN]. Hier steht [TOKEN] für den selbstgewählten Token. Es wird dringend empfohlen, einen eigenen Token festzulegen!

$located_root = 0; // Sollte nicht geändert werden, wenn das Skript ins Rootverzeichnis platziert wird.
Wird das Skript in einen Unterordner geladen, so muss auch die Angabe '0' geändert werden. Wird das Skript in einen Unterordner geladen, so muss die '0' durch eine '1' ersetzt werden. Diese Angabe ist notwendig, damit das Skript die Konfigurationsdatei des Systems findet, in der die Verbindungsdaten zu der Datenbank stehen.

$backup_only_database = false; // Sollte nicht geändert werden, außer man möchte nur ein Datenbankbackup erstellen.
In der Datenbank stehen die wichtigsten Daten der gesamten Website (Artikel, Einstellungen etc.). Eine Datenbanksicherung ist weitaus wichtiger als die Sicherung der Dateien. Hat man bereits eine komplette Sicherung aller Dateien, dann reicht es im Grunde aus, nur Backups von der Datenbank anzulegen. Setzt man diese Option auf 'true', wird nur die Datenbank gesichert, was natürlich sehr schnell abläuft.

$max_number_of_archives = false; // Sollte geändert werden, um den Speicherplatz nicht komplett mit Backuparchiven zu belegen. Dazu muss die Option $target_directory aktiviert werden!
Diese Option ist wichtig, wenn der Speicherplatz limitiert ist. Je nach Häufigkeit der Backups kann man hier einen Wert angeben, um einen bestimmten Zeitraum mit Backups zu überdecken. Wenn man zum Beispiel jeden zweiten Tag ein Backup durchführt und die Option auf '7' einstellt, dann werden 7 Archivdateien parallel gehalten, was den Zeitraum auf 2 Wochen spannt. Bei einem weiteren Backup wird die älteste Datei automatisch gelöscht. Die Backups sollten nach Möglichkeit regelmäßig auf den heimischen Rechner und ggf. auf eine Cloudplatte (Google Drive, DropBox etc.) geladen werden, um mögliche Verluste zu minimieren.

Wie spielt man das Backup wieder ein?

Wie oben bereits erwähnt, ist das sehr einfach möglich. Zuerst entpackt man das Archiv auf der Festplatte. Im Rootverzeichnis befindet sich neben vielen Dateien und Ordnern eine .sql-Datei, die die komplette Datenbank beinhaltet. Zuerst spielt man alle Dateien, außer der besagten Datei mit der .sql-Endung, mit Hilfe des FTP Programms auf den Server. Danach loggt man sich über phpMyAdmin in die Datenbank ein und importiert die .sql Datei. Wenn man die DROP Option nicht nutzt, muss man vor dem Import alle Tabellen löschen. Hat man das Backup auf eine anderen Server gespielt (z.B.: Hosterwechsel oder von einer lokalen Serverumgebung auf den Online-Server), dann muss man noch zusätzlich die Konfigurationsdatei des Systems mit den neuen Verbindungsdaten aktualisieren. Das war es schon mit der Wiederherstellung!
Kleiner Tipp: Für einen schnellen Upload kann man auch das Kubik-Rubik Unzip Skript nutzen und das Backuparchiv direkt auf dem Server entpacken!

Kann man die Skripte auch für andere Systeme nutzen?

Ja, das ist mit einem kleinen Trick möglich. Der Code für das Packen der Archive funktioniert theoretisch in jedem System, lediglich die Datenbankanbindung wird für jedes System aus der spezifischen Konfigurationsdatei geladen. Das beudeutet, dass man dem Skript die Verbindungsdaten zu der Datenbank in einer selbstangelegten Datei liefern kann, damit es die Datenbank mitsichern kann. Im Falle vom Joomla! Backup Skript legt man einfach eine PHP Datei mit dem Namen configuration.php und folgendem Inhalt in das Rootverzeichnis:

<?php
$host = ''; // Hier den Host eintragen
$user = ''; // Hier den Benutzer eintragen
$password = ''; // Hier das DB-Passwort eintragen
$db = ''; // Hier die zu sichernde DB eintragen
?>

Somit kann man alle möglichen Systeme (wie Drupal, xt:Commerce, Contao, TYPO3 etc.) ebenfalls mit diesem Skript sichern!

Fazit

Das Sichern der Website ist ein Muss für jeden Websitebetreiber und mit den richtigen Hilfsmitteln ist das Anlegen von Backups ein Kinderspiel! Kubik-Rubik Joomla! Backup Script und Kubik-Rubik Wordpress Backup Script erledigen diese Aufgabe schnell und zuverlässig.

Wir wünschen allen viel Erfolg mit den Kubik-Rubik Backup Skripten für Joomla! und Wordpress und natürlich wieder ruhige Nächte. Und nun ab ein Backup anlegen!