Nachdem ich meine Webseiten vor kurzem zu all-inkl.com umgezogen habe, war ich ein wenig unglücklich über die fehlende Möglichkeit einer automatisierten Sicherung dort. Da ich von den Lösungen die ich im Internet gefunden habe, nicht überzeugt war, habe ich selbst Hand angelegt und zur Abwechslung mal etwas in PHP programmiert.
Herausgekommen ist ein Backupskript, das sämtliche Seiten und Datenbanken, die ich bei all-inkl.com habe, in einem Rutsch wegsichert und dabei ein paar Komfortfunktionen bietet, die andere Skripte nicht haben.
Was kann das Skript?
- Die Ausführung erfolgt entweder manuell (per Aufruf einer URL) oder automatisiert über einen eingeplanten Cron-Job.
- Das Skript informiert nach jeder Sicherung übersichtlich über die gesicherten Datenmengen und den Füllzustand des Sicherungsordners. Alternativ (im Skript konfigurierbar) wird die Mail nur im Fehlerfall gesandt (meine Einstellung) oder gar nicht (nicht empfohlen).
- Es kann festgelegt werden, ob schnell (gzip) oder klein (bzip2) archiviert werden soll.
- Im Skript lässt sich eine Quota festlegen, also der maximal zu nutzende Speicher für Backups. Ich z.B. habe hier 100GB eingestellt, da mein Paket bei all-inkl.com 250GB Speicher bietet und meine Webseiten nicht allzu viel davon einnehmen. Sobald die Quota überschritten wird, löscht das Skript nach und nach die ältesten Dateien im Backupverzeichnis, bis der Platzbedarf wieder im Rahmen ist.
Konfiguration im Skript
Das vollständige Skript findet ihr weiter unten zum Download. Ich zeige hier nur kurz den Bereich mit den Einstellungen.
// ########## START EDITING HERE ##########
// script settings
// -----------------------------------------------------------------------------
// use appropriate amount of memory and execution time. allowed values depend on
// your hoster (in this case probably all-inkl.com) and package.
$config["php"]["max_execution_time"] = 600; // seconds
$config["php"]["memory_limit"] = "256M"; // megabytes
// general backup settings
// -----------------------------------------------------------------------------
// the target directory is relative to the root of the webspace and has to be
// entered without a trailing slash (e.g. "backup" results in
// /www/htdocs/w0123456/backup). make sure to store nothing else in here because
// old files will be deleted as soon as the quota is met!
$config["backup"]["enabled"] = true; // only disable for testing purposes
$config["backup"]["cleanup"] = true; // disable to never remove any backups
$config["backup"]["target_directory"] = "backup";
$config["backup"]["quota"] = 100 * 1024**3; // in bytes
$config["backup"]["compression_algorithm"] = "gz"; // "gz" = fast, "bz2" = small
// mail settings
// -----------------------------------------------------------------------------
$config["mail"]["enabled"] = true;
$config["mail"]["errors_only"] = false;
$config["mail"]["from"] = "mail@your-domain.com";
$config["mail"]["to"] = "mail@your-domain.com";
$config["mail"]["subject"] = "Backup complete";
// locale settings
$config["locale"]["timestamp_format"] = "Y-m-d_H-i-s";
$config["locale"]["date_format"] = "Y-m-d";
$config["locale"]["filename_timestamp_format"] = "Y-m-d";
// sites settings
// -----------------------------------------------------------------------------
// a site is a set of folders and databases that should be archived together.
// to declare multiple sites just copy the settings block like this:
// $sites[] = [...data of site 1...];
// $sites[] = [...data of site 2...];
// - description: a short summary of the site (e.g. "dummy.com main page").
// used for logging purposes.
// - backup_prefix: backup files will use this as a prefix. be sure to include
// only characters a-z, A-Z, 0-9
// and underscores here to be on the safe side.
// - folders: an array of all folders that belong to the site (subfolders are
// included automatically).
// folders are relative to the ftp root directory.
// - databases: an array of all databases that belong to the site.
// - db: database name.
// - user: username. for all-inkl.com this equals the database name.
// - pass: password for the database.
$sites[] = [
"description" => "your-domain.com WordPress",
"backup_prefix" => "your_domain_de",
"folders" => [
"your-domain.de/www"
],
"databases" => [
[ "db" => "d0123456", "user" => "d0123456", "pass" => "password123" ]
]
];
// ########## STOP EDITING HERE (unless you know what you're doing) ##########
Die Optionen sind im Wesentlichen selbsterklärend oder im Skript entsprechend kommentiert. Bitte passt vor Ausführung insbesondere die Mailadresse an.
Das Zielverzeichnis wird relativ zum Stammverzeichnis (/www/htdocs/w0123456/
) angegeben und muss existieren, d.h. von euch per FTP angelegt werden.
Ein grundlegendes Konzept noch zur Erklärung: Es werden im Skript „Sites“ definiert. Eine Site fasst dabei zusammengehörige Ordner und Datenbanken zusammen. Es können also mehrere davon gemeinsam gesichert werden. Alle Ordner einer Site werden in ein gemeinsames Archiv komprimiert, die Datenbanken erhalten je ein eigenes Archiv je Datenbank.
Zusätzlich hat jede Site eine Beschreibung, z.B. „phenx.de WordPress“ und einen Prefix, der den Dateien in der Sicherung vorangestellt wird, z.B. „phenx_de“.
Mehrere Sites werden einfach dadurch angelegt indem der $sites[] = [ ... ]
Bereich verdoppelt wird. Wer PHP nicht kennt und normalerweise mit nicht ganz so wahnsinnigen Sprachen arbeitet: Die Syntax fügt dem Array einen neuen Eintrag am Ende hinzu.
Wie wird es eingerichtet?
Die ordentlich konfigurierte backup.php muss nun natürlich noch irgendwie zu all-inkl.com um dort täglich ausgeführt zu werden. Das geht wie folgt.
Als erstes legen wir eine neue Subdomain an. In meinem Beispiel ist das „backup.phenx.de“ (nein, diese verwende ich nicht produktiv ;-)).

In dem angelegten Verzeichnis legen wir mit einem beliebigen FTP Client nun *nochmal* ein Verzeichnis „backup“ an. Das hat den Hintergrund, dass wir die Subdomain per SSL schützen wollen (da laufen schließlich wichtige Daten drüber!) und das geht nicht, wenn der Hauptordner vor dem Zugriff von Let’s Encrypt geschützt ist.

Das ist dann auch der nächste Schritt: Das neue Verzeichnis schützen wir mit einem User / Passwort. Diese Kombination brauchen wir später für den Cron Job, damit er das Skript aufrufen kann. Zum manuellen Zugriff benötigen wir die Daten auch. Ob ihr dafür den cron User verwendet oder einen weiteren anlegt ist euch überlassen.

Den Cronjob legen wir nach Bedarf an – bei mir ist es „täglich“. Die URL muss auf das cron_backup.php Skript zeigen, da der direkte Aufruf von backup.php aufgrund der maximalen Skriptlaufzeit innerhalb eines Cronjobs nur bei *sehr* kleinen Datenmengen funktionieren würde. Eine E-Mail-Adresse tragen wir hier nicht ein, das erledigt das Skript intern selber. Wenn ihr hier etwas eintragt bekommt ihr zusätzlich von all-inkl.com bei jeder Ausführung eine Mail. Ich zumindest möchte das nicht.

Die Seite schützen wir jetzt noch mit einem Let’s Encrypt SSL Zertifikat, dafür gehen wir in die „bearbeiten“ Seite der Subdomain:

Dort dann auf „SSL-Schutz“ – bearbeiten.

Einmal die AGBs bestätigen und los geht’s.

Anschließend können wir noch die Umleitung von HTTP auf HTTPS aktivieren und HSTS aktivieren. Beides bietet mehr Sicherheit, ist aber nicht zwingend erforderlich.

Zum Abschluss legen wir jetzt noch die Backupskripte in das passwortgeschützte Verzeichnis (zu erkennen an den Dateien .htaccess und .htpasswd):

Und schon können wir das Skript einmal manuell aufrufen, in meinem Fall unter https://backup.phenx.de/backup/backup.php. Beim Aufruf werden wir nach den Benutzerdaten gefragt, die wir vorher eingestellt haben.

So sieht das Ergebnis im Browser aus:

Und so per Mail (nach ein paar weiteren hinzugefügten Seiten):

Download
Die aktuelle Version des Skriptes findet sich nun bei Github unter https://github.com/eikowagenknecht/webhost_backup. Dort einfach über Code > Download ZIP herunterladen.
Wer mit beitragen will, kann auch gerne dort Issues oder PRs aufmachen, ich sehe das dann direkt.

Freiberuflicher IT Berater, Open Source Entwickler und begeisterter Smarthome Nutzer. Das hier ist mein Braindump für Technikthemen, die mich beschäftigen.
Guten Abend,
das script für den cronJob funtioniert bei mir gut, der Aufruf des Backup programms leider noch nicht
Wie sieht es denn aus, wenn du das Skript im Browser ausführst?
URL not found
Hallo Eiko,
tolles Skript, vielen Dank dafür!
Gibt es eine Möglichkeit, auch einzelne Dateien mit ins Backup zu nehmen? Ggf. als
„files“ => [ „path/to/composer.json“ ]
im $sites-Array?
Das lässt sich recht einfach erweitern. Wenn du die Angaben so pflegst wie du schreibst kannst du weiter unten dann einfach den ganzen Block „foreach ($site[„folders“] as $folder)“ in „foreach ($site[„files“] as $folder)“ umbenennen und dann in der Schleife den Code anpassen, so dass er nur noch eine einzelne Datei erwartet. Dürften nur ein paar Zeilen sein, die da anzupassen sind. Sag bescheid, wenn dabei Probleme aufkommen, dann schaue ich mir das nochmal an.
Danke, das hat funktioniert – Einzeldateien lassen sich nun auch sichern!
Wenn du das Skript hier entsprechend aktualisieren möchtest, schicke ich es dir gerne zu.
Sehr gerne! Meine Mailadresse findest du oben unter „Impressum“.
Hallo zusammen,
super Skript, vielen Dank!
Schade das die Funktion nicht von All-Inkl selbst angeboten wird.
Version 1.0 hat ohne Probleme funktioniert.
Version 1.1 hatte leider nen kleinen Fehler denke ich, in Zeile 235 fehlt das schließen der „foreach ($site[„files“] as $file) {
“ mit „}“ – sonst startet das Backup leider nicht.
Ich würde derartige Fixes auch gern selbst beisteuern. Daher die Frage, schon mal überlegt das Skript auf GitHub zur Verfügung zu stellen und PRs zu akzeptieren?
Beste Grüße,
Christian
Moin Christian, danke für den Hinweis. Habe ich gerade gefixt mit deinem Hinweis und die neue Version bei Github gehostet: https://github.com/eikowagenknecht/webhost_backup
Wenn du dich mit PRs beteiligen möchtest, kannst du das gerne tun.
Hallo, vielen Dank für das Super-Script. Es hat auf Anhieb bei mir funktioniert. Deine Anleitung ist auch super ausführlich und klärt alle Fragen, sodass ich es ohne Probleme einrichten konnte. Tolle Arbeit und Danke, dass du es mit allen teilst.
Tolle Sache Herr Wagenknecht !
Sie sollten noch erwähnen was man mit der Datei „important-file.ext“ – hatte nichts gefunden.
Werde Sie per Beitrag verlinken.
MFG Peter —-> Werbung ist alles 😉
https://freecad-webinar.de/tolles-backup-script-fuer-all-inkl-com/
Hallo Peter, danke für den Beitrag. Die „important-file.ext“ ist einfach nur ein Beispiel, wie man eine zusätzliche einzelne Datei in das Backup einschließen kann. Wenn es nicht benötigt wird, kann das Array einfach leer gelassen werden (
"files" => [],
).AAAH Perfekt – Danke für den netten Support ! LG Peter