WordPress erfreut sich bei Bloggern nach wie vor großer Beliebtheit. Wenn man einen eigenen WordPress-Blog betreibt, sollte man sich auch um das Thema Backup kümmern.
Wird der Blog bei einem Webhosting-Provider gehostet, dann werden meist von diesem automatisch Backups des kompletten Webspace durchgeführt. Damit wird dann auch ein vorhandener WordPress-Blog mit gesichert.
Anders sieht die Sache bei selbstgehosteten Blogs aus. Hier ist der Administrator selbst für Backups des Servers und der Webseiten verantwortlich.
Voraussetzungen
Dieser Artikel richtet sich an Administratoren, die WordPress auf einem eigenen (Home-)Server betreiben.
Als Grundlage dient ein WordPress-Blog, der auf einem Ubuntu Server 18.04 LTS installiert ist. Als Webserver dient hier nginx, als Datenbank kommt MariaDB zum Einsatz.
Eine beispielhafte Konfiguration wurde bereits im Artikel Zweite Web-Anwendung neben ownCloud/Nextcloud einrichten (am Beispiel WordPress) gezeigt.
Allerdings lassen sich die gezeigten Schritte auch auf andere Umgebungen (andere Distributionen, andere Webserver, etc.) anwenden.
Grundlagen
Ein Backup von WordPress besteht immer aus zwei Teilen:
- Dem WordPress Dateiverzeichnis: Dies sind alle Dateien, die zum Betrieb von WordPress benötigt werden (z.B. php, oder auch css-Dateien). Dies ist normalerweise unter /var/www/wordpress zu finden.
- Der WordPress-Datenbank: WordPress benötigt eine MySQL/MariaDB-Datenbank. Diese muss ebenfalls in die Sicherung einfließen.
Sollen Backups des eigenen Blogs eingerichtet werden, müssen immer diese beiden Teile berücksichtigt werden.
Im Vorfeld sollte man sich Gedanken darüber machen, wo die Backups gespeichert werden sollen. Im Rahmen dieses Artikels nutze ich beispielhaft das Verzeichnis /media/hdd/wordpress_backup als Backup-Ziel. Dies kann in der Praxis eine zweite (externe) Festplatte oder ein NAS sein, welches im Netzwerk zur Verfügung steht.
Backup erstellen
Um ein Backup zu erstellen, stoppen wir zunächst den Webserver:
service nginx stop
Dies verhindert, dass während des Backups aktive Zugriffe auf den Blog stattfinden.
Als nächstes wird das Dateiverzeichnis von WordPress gesichert. Hier ist dies beispielhaft das Verzeichnis /var/www/wordpress. Bitte den Punkt am Ende des Befehls beachten.
tar -cpzf "/media/hdd/wordpress_backup/wordpress-filedir_`date +"%Y%m%d"`.tar.gz" -C "/var/www/wordpress" .
Als nächstes wird die Datenbank gesichert. Nach dem Absetzen des Befehls ist noch das Passwort des WordPress-Datenbank-Users einzugeben:
mysqldump --single-transaction -h localhost -u wordpress_db_user -p wordpress_db > /media/hdd/wordpress_backup/wordpress-db_`date +"%Y%m%d"`.sql
Das Backup ist damit schon komplett und der Webserver kann neu gestartet werden:
service nginx start
Backup wiederherstellen
Das Anfertigen von Backups ist aber nur der erste Schritt. Ebenso wichtig ist es, dass diese Backups auch wiederhergestellt werden können.
Dies sollte man nach dem ersten Anfertigen eines Backups auch mindestens einmal ausprobieren.
Zunächst wird der Webserver gestoppt:
service nginx stop
Anschließend wird das Dateiverzeichnis von WordPress gelöscht und neu angelegt (allerdings leer):
rm -r /var/www/wordpress/ mkdir -p /var/www/wordpress
Als nächstes werden die Inhalte des Verzeichnisses aus dem Backup wiederhergestellt. Zu beachten ist hier der richtige Dateiname (da abhängig vom Datum):
tar -xpzf /media/hdd/wordpress_backup/wordpress-filedir_20190530.tar.gz -C /var/www/wordpress/
Nun werden noch die passenden Rechte gesetzt:
chown -R www-data:www-data /var/www/wordpress
Nun muss nur noch die Datenbank wiederhergestellt werden. Dazu wird die alte Datenbank zunächst einmal entfernt und neu angelegt:
mysql -h localhost -u wordpress_db_user -p -e "DROP DATABASE wordpress_db" mysql -h localhost -u wordpress_db_user -p -e "CREATE DATABASE wordpress_db"
Nun wird der DB-Dump aus dem Backup wieder eingespielt:
mysql -h localhost -u wordpress_db_user -p wordpress_db < /media/hdd/wordpress_backup/wordpress-db_20190530.sql
Am Schluss wird der Webserver wieder gestartet:
service nginx start
Backup/Restore mit Bash-Skript
Ein Backup kann mit diesen einfachen Schritten erstellt werden. Allerdings sind dazu immer manuelle Schritte erforderlich. Komfortabler wird die Sache, wenn man alle Schritte mit einem Bash-Skript zusammenfasst. Dieses kann dann einfach ausgeführt werden und es wird automatisch ein Backup erstellt.
Zu diesem Zweck habe ich zwei Bash-Skripte auf Codeberg zur Verfügung gestellt:
WordPress-Backup-Restore @ Codeberg
Hinweis: Ich habe die Skript-Dateien als Open Source auf Codeberg zur Verfügung gestellt. Damit sind diese frei verfügbar und können auch von jedermann angepasst und verbessert werden. Ich übernehme allerdings keinerlei Haftung für den Einsatz dieser Skripte. Diese sollen lediglich als Basis für die Erstellung eigener Backup-/Restore-Skripte für eure WordPress-Instanzen dienen.
Das Repository kann einfach über Git gecloned werden:
cd ~ git clone https://codeberg.org/DecaTec/Wordpress-Backup-Restore.git cd WordPress-Backup-Restore
Wichtig: Die Skripte müssen auf jeden Fall noch an die konkrete Umgebung angepasst werden. Alle Stellen, die kontrolliert bzw. angepasst werden müssen, sind in den Skripten mit dem Kommentar „TODO“ gekennzeichnet.
Bitte passt die Skripte daher auf jeden Fall an und führt diese nicht einfach „blind“ aus!
Wenn das geschafft ist, werden die Skripte noch als ausführbar markiert:
chmod +x WordPressBackup.sh chmod +x WordPressRestore.sh
Nun können die Skripte ganz einfach wie folgt ausgeführt werden:
./WordpressBackup.sh
Das Backup wird automatisch im Verzeichnis /media/hdd/wordpress_backup erstellt. Hier wird ein Verzeichnis mit dem aktuellen Zeitstempel erstellt, z.B.: /media/hdd/wordpress_backup/20190530_081555
Wiederhergestellt werden kann ein Backup durch das Restore-Skript. Dieses erwartet den Zeitstempel eines vorhandenen Backups als Parameter:
./WordpressRestore.sh 20190530_081555
Diese Skripte sind so konzipiert, dass diese keine Benutzer-Interaktion erfordern. Daher kann die Ausführung auch einfach per Cron automatisiert werden. Besonders für das Backup-Skript ist dies sinnvoll: So kann man z.B. jede Nacht um 03:00 ein Backup des eigenen WordPress-Blogs anfertigen. Dazu kann ein Cronjob für den Webserver-User eingerichtet werden:
crontab -u www-data -e
Hier wird am Ende einfach folgender Befehl angehängt:
0 3 * * * /home/user/Wordpress-Backup-Restore/WordpressBackup.sh > /dev/null 2>&1
Dies sorgt dafür, dass jede Nacht um 03:00 ein Backup von WordPress angelegt wird. Wichtig ist hier nur, dass der absolute Pfad zu Skript angegeben wird, da die Ausführung ansonsten fehlschlagen wird.
Alternative: Backup per WordPress-Plugin
Eine Alternative zum dem gezeigten Vorgehen ist der Einsatz eines entsprechenden Plugins für WordPress. Meiner Erfahrung nach gibt es hier zwei empfehlenswerte Plugins:
Beide Plugins dienen dazu, Backups der WordPress-Instanz manuell oder automatisiert anzulegen. Das ganze wird einfach im Dashboard von WordPress konfiguriert bzw. ausgeführt. Die Plugins sind dabei mehr oder weniger selbsterklärend, so dass ich hier nicht weiter darauf eingehen werde.
Zum einen macht dies das Anfertigen von Backups einfacher. Zum anderen macht man sich allerdings in gewisser Weise abhängig von dem verwendeten Plugin. Dies ist durch ein manuelles Backup oder ein Backup per Bash-Skript nicht gegeben.
Welche Variante (manuell/per Skript oder per Plugin) die passende ist, muss jeder WordPress-Administrator für sich selbst entscheiden.
Fazit
Ein Backup einer WordPress-Instanz ist recht schnell angefertigt. Noch komfortabler geht dies mit den bereitgestellten Bash-Skripten. Mit diesen kann das Anfertigen eines Backups auch mittels Cron automatisiert werden.
Am Ende noch ein wichtiger Tipp: Nichts ist ärgerlicher, wenn man immer Backups angefertigt hat, diese aber im Ernstfall nicht wiederhergestellt werden können. Daher sollte einmal der komplette Backup- und Restore-Prozess getestet werden. Nur auf diese Weise kann man sicher sein, dass im Falle des Falles ein bestehendes Backup wiederhergestellt werden kann.
Weiterführende Artikel
- Zweite Web-Anwendung neben ownCloud/Nextcloud einrichten (am Beispiel WordPress)
- phpMyAdmin neben Nextcloud installieren (nginx)
Hallo Jan,
klasse Artikel.
Wie schaut es da bei All-Inkl. und Cronjob aus, währe dies theoretisch möglich?
Vielen Dank
Gruß Hans
Hi Hans,
der Artikel richtet sich eigentlich an Systeme, auf die man vollen SSH-Zugriff hat.
Bei All-Inkl kann man das wohl auch irgendwie hinbekommen, aber das ist meiner Meinung nach ziemlich kompliziert: siehe hier.
Du könntest bei All-Inkl auch Dateien (hier) und Datenbanken (hier) über andere Wege sichern.
Am einfachsten ist für ein Shared-Hosting allerdings immer noch die Möglichkeit, Backups über ein WP-Plugin zu machen. Updraft Plus und als Speicherort z.B. einen speziellen Ordner in deinem Webspace per FTP. Damit hast du glaube ich am wenigsten Aufwand.
Gruß,
Jan
Hallo Jan,
vielen Dank für die Info, werde ich alles mal testen.
Gruß Hans
Auch ein gutes backup scrip: https://github.com/ccztux/glsysbackup