Kategorien
Technik

Komfortables Backupskript für all-inkl.com

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

Wenn diese Seite für dich hilfreich war und du dich bei mir bedanken möchtest, dann freue ich mich ganz außerordentlich darüber, wenn du für deinen nächsten Einkauf bei amazon.de über diesen Link gehst. Ich bekomme dann eine kleine Provision, für dich kostet es keinen Cent extra. Wenn du mir lieber direkt etwas zukommen lassen möchtest, dann kannst du das hier.

4 Antworten auf „Komfortables Backupskript für all-inkl.com“

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.