1 . Vorbemerkung
Die folgenden Ausführungen sind für Webmaster von HTML- und WordPress-Webseiten gedacht, die mit folgender Aufgabenstellung konfrontiert sind:
- Es sollen regemäßig Backups erstellt werden, der Webhoster erstellt aber keine Backups oder er erstellt Backups nur für einen begrenzten, nicht ausreichenden Zeitraum.
- Falls WordPress installiert wurde, sollen die Backups ohne Verwendung eines Plugins angelegt werden.
- Die Backups sollen automatisiert erstellt werden.
Unten finden Sie php-Skripte, mit denen Backups von HTML- und WordPress-Webseiten automatisch mit Hilfe eines Cronjobs erzeugt werden können. Dort wird beispielhaft auch erklärt, wo und welche Änderungen im Falle deren Verwendung bei den Webhostern lima-city, netcup und ALL-INKL.COM vorgenommen werden müssen und wie die automatische Ausführung der Skripte mit einem Cronjob bewerkstelligt werden kann.
Die Nutzung der Skripte erfolgt auf eigene Verantwortung. Ich übernehme keine Haftung für direkte oder indirekte Schäden, die durch die Verwendung der Skripte allenfalls entstehen können.
2. Skript zur Sicherung von HTML-Webseiten
<?php
// Backup-Konfiguration
$source_dir = '/home/webpages/lima-city/danny5/meine-website'; // Pfad zum Webordner
$backup_dir = '/home/webpages/lima-city/danny5/backup'; // Backup-Zielordner
$timestamp = date('Y-m-d_H-i-s');
$backup_filename = "backup_$timestamp.tar.gz";
$full_backup_path = "$backup_dir/$backup_filename";
// Stelle sicher, dass das Backup-Verzeichnis existiert
if (!is_dir($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
// Backup erstellen
$cmd = "tar -czf " . escapeshellarg($full_backup_path) . " -C " . escapeshellarg(dirname($source_dir)) . " " . escapeshellarg(basename($source_dir));
exec($cmd, $output, $return_var);
if ($return_var !== 0) {
error_log("Backup fehlgeschlagen am $timestamp. Fehlercode: $return_var");
exit(1);
}
// Ältere Backups löschen (nur 60 letzte behalten)
$files = glob("$backup_dir/backup_*.tar.gz");
usort($files, function($a, $b) {
return filemtime($b) - filemtime($a); // Neueste zuerst
});
// Nur die drei neuesten behalten
$files_to_delete = array_slice($files, 60);
foreach ($files_to_delete as $file) {
unlink($file);
}
?>
Anpassungabedarf zu diesem Skript:
In den Zeilen 3 und 4 müssen
- der zu sichernde Ordner
- der Ordner für das Backup
und in der fünftletzten Zeile die Zahl der zu behaltenden Backups (z. B. 60) angegeben werden.
Im Beispiel finden Sie einen typischen Eintrag für die Sicherung von HTML-Webseiten beim Webhoster lima-city:
$source_dir = ‚/home/webpages/lima-city/danny5/meine-website‘;
$backup_dir = ‚/home/webpages/lima-city/danny5/backup‘;
(der Pfad /home/webpages/lima-city/ ist immer derselbe, danach müssen Sie die in Ihrem Fall zutreffenden Pfade angeben)
===============================
Falls Ihr Webhoster ALL-INKL.COM ist, lauten typische Einträge:
$source_dir = ‚/www/htdocs/w01fbkb7/meine-website‘;
$backup_dir = ‚/www/htdocs/w01fbkb7/backup‘;
(der Pfad /www/htdocs/ ist immer derselbe, danach müssen Sie die in Ihrem Fall zutreffenden Pfade angeben)
===============================
Sind Sie Kunde von Netcup, lauten typische Einträge:
$source_dir = ‚/var/www/vhosts/hosting215845.a6h96.netcup.net/meine-website;
$backup_dir = ‚/var/www/vhosts/hosting215845.a6h96.netcup.net/backup‘;
Der Pfad /var/www/vhosts/ist immer derselbe, danach müssen Sie die in Ihrem Fall zutreffenden Pfade angeben. Diese finden Sie, indem Sie sich in customercontrolpanel.de/ einloggen, dann auf Produkt > Account-Bezeichnung klicken. Suchen Sie anschließend die Einträge bei „Account-Bezeichnung“ und darunter bei „Webserver“. Hängen Sie diese in weiterer Folge in Kleinschreibung und durch einen Punkt getrennt an /var/www/vhosts/ an. Das Verzeichnis lautet dann beispielsweise /var/www/vhosts/hosting215845.a6h96.netcup.net/. Ergänzen Sie diesen Eintrag nun noch um die Namen der für die Sicherung maßgeblichen Ordner.
3. Skript zur Sicherung von WordPress-Webseiten
<?php
// WordPress Backup Script mit automatischer Löschung alter Backups
$timestamp = date('Y-m-d_H-i-s');
// Einstellungen
$wp_dir = '/home/webpages/lima-city/danny5/meine-website'; // WordPress Installationsverzeichnis
$backup_dir = '/home/webpages/lima-city/danny5/backup/'; // Backup Zielverzeichnis
// 1. Datenbank Einstellungen aus wp-config.php auslesen
$wp_config_path = rtrim($wp_dir, '/') . '/wp-config.php';
if (!file_exists($wp_config_path)) {
exit("FEHLER: wp-config.php nicht gefunden in: $wp_config_path");
}
// wp-config.php sicher einlesen
$wp_config_content = file_get_contents($wp_config_path);
if ($wp_config_content === false) {
exit("FEHLER: Konnte wp-config.php nicht lesen");
}
// Alternative Methode zum Auslesen der DB-Daten
$db_settings = array();
$lines = file($wp_config_path);
foreach ($lines as $line) {
if (preg_match("/define\s*\(\s*['\"]DB_(NAME|USER|PASSWORD|HOST)['\"]\s*,\s*['\"]([^'\"]+)['\"]\s*\)/", $line, $match)) {
$db_settings[strtolower($match[1])] = $match[2];
}
}
// Überprüfen der DB-Daten
if (empty($db_settings['name'])) {
exit("FEHLER: Konnte DB_NAME nicht aus wp-config.php auslesen");
}
$db_name = $db_settings['name'];
$db_user = $db_settings['user'] ?? '';
$db_pass = $db_settings['password'] ?? '';
$db_host = $db_settings['host'] ?? 'localhost';
// 2. Backup-Verzeichnis vorbereiten
if (!is_dir($backup_dir)) {
if (!mkdir($backup_dir, 0755, true)) {
exit("FEHLER: Konnte Backup-Verzeichnis nicht erstellen");
}
}
// 3. Datei-Backup durchführen
$files_backup = "wp_files_$timestamp.tar.gz";
$full_files_path = "$backup_dir/$files_backup";
$cmd_files = "tar -czf " . escapeshellarg($full_files_path) . " -C " . escapeshellarg(dirname($wp_dir)) . " " . escapeshellarg(basename($wp_dir)) . " 2>&1";
exec($cmd_files, $output_files, $return_files);
if ($return_files !== 0) {
exit("FEHLER: Datei-Backup fehlgeschlagen. Code: $return_files");
}
// 4. Datenbank-Backup durchführen
$db_backup = "wp_db_$timestamp.sql.gz";
$full_db_path = "$backup_dir/$db_backup";
$cmd_db = "mysqldump --host=" . escapeshellarg($db_host) . " --user=" . escapeshellarg($db_user) . " --password=" . escapeshellarg($db_pass) . " " . escapeshellarg($db_name) . " | gzip > " . escapeshellarg($full_db_path) . " 2>&1";
exec($cmd_db, $output_db, $return_db);
if ($return_db !== 0) {
if (file_exists($full_files_path)) {
unlink($full_files_path);
}
exit("FEHLER: DB-Backup fehlgeschlagen. Code: $return_db");
}
// 5. Alte Backups bereinigen
function cleanOldBackups($backup_dir, $pattern) {
$files = glob("$backup_dir/$pattern");
if (count($files) > 60) {
usort($files, function($a, $b) {
return filemtime($a) - filemtime($b);
});
$files_to_delete = array_slice($files, 0, count($files) - 60);
foreach ($files_to_delete as $file) {
unlink($file);
}
}
}
cleanOldBackups($backup_dir, 'wp_files_*.tar.gz');
cleanOldBackups($backup_dir, 'wp_db_*.sql.gz');
echo "Backup erfolgreich erstellt\n";
?>
Anpassungbedarf zu diesem Skript:
Wenn Sie eine WordPress-Webseite betreiben, müssen Sie In den Zeilen 6 und 7 den zu sichernden Ordner und den Ordner für das Backup angeben (siehe die Ausführungen zu Punkt 2) sowie ganz unten unter Punkt „5. Alte Backups bereinigen“ des Skripts die Zahl der zu behaltenden Backups angeben (im Beispiel sind 60 vorgesehen). Die für die Datenbanksicherung relevanten Daten liest das Skript automatisch aus der Datei „wp-config.php“. Diesbezüglich müssen Sie keine Angaben machen.
4. Skript zur Sicherung von WordPress-Webseiten beim Webhoster Netcup
<?php
// WordPress Backup Script mit DB-Sicherung und automatischer Löschung alter Backups
$timestamp = date('Y-m-d_H-i-s');
// === Einstellungen ===
$wp_dir = '/var/www/vhosts/hosting234567.a3b46.netcup.net/meine-website'; // WordPress Installationsverzeichnis
$backup_dir = '/var/www/vhosts/hosting234567.a3b46.netcup.net/backup'; // Backup Zielverzeichnis
$max_backups = 60; // Anzahl der zu behaltenden Backups
// === Backup-Verzeichnis vorbereiten ===
if (!is_dir($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
// === wp-config.php einlesen ===
$wp_config_path = rtrim($wp_dir, '/') . '/wp-config.php';
if (!file_exists($wp_config_path)) {
exit("FEHLER: wp-config.php nicht gefunden in: $wp_config_path\n");
}
$wp_config_content = file_get_contents($wp_config_path);
if ($wp_config_content === false) {
exit("FEHLER: Konnte wp-config.php nicht lesen\n");
}
// === DB-Zugangsdaten extrahieren ===
$db_settings = array();
$required_keys = array('name', 'user', 'password', 'host');
$lines = file($wp_config_path);
foreach ($lines as $line) {
if (preg_match('/^\s*(\/\/|#)/', $line)) continue;
if (preg_match("/define\s*\(\s*['\"]DB_(NAME|USER|PASSWORD|HOST)['\"]\s*,\s*['\"]([^'\"]+)['\"]\s*\)/i", $line, $match)) {
$key = strtolower($match[1]);
$db_settings[$key] = $match[2];
}
}
foreach ($required_keys as $key) {
if (!isset($db_settings[$key])) {
exit("FEHLER: Konnte DB_$key nicht in wp-config.php finden.\n");
}
}
// === DB_HOST aufteilen (IP:Port oder localhost) ===
$db_host_raw = $db_settings['host'];
if (strpos($db_host_raw, ':') !== false) {
list($db_host, $db_port) = explode(':', $db_host_raw, 2);
$db_port = (int)$db_port;
} else {
$db_host = $db_host_raw;
$db_port = 3306;
}
// === Datenbank-Dump erstellen ===
$db_backup_file = "$backup_dir/db_backup_$timestamp.sql";
$cmd = sprintf(
'mysqldump --no-tablespaces -h%s -P%d -u%s -p%s %s > %s',
escapeshellarg($db_host),
$db_port,
escapeshellarg($db_settings['user']),
escapeshellarg($db_settings['password']),
escapeshellarg($db_settings['name']),
escapeshellarg($db_backup_file)
);
system($cmd, $retval);
if ($retval !== 0) {
exit("FEHLER: mysqldump fehlgeschlagen mit Code $retval\n");
}
echo "✔️ Datenbank gesichert: $db_backup_file\n";
// === WordPress-Dateien archivieren ===
$archive_file = "$backup_dir/wp_files_$timestamp.tar.gz";
$tar_cmd = sprintf(
'tar -czf %s -C %s .',
escapeshellarg($archive_file),
escapeshellarg($wp_dir)
);
system($tar_cmd, $retval2);
if ($retval2 !== 0) {
exit("FEHLER: tar-Archivierung fehlgeschlagen mit Code $retval2\n");
}
echo "✔️ WordPress-Dateien gesichert: $archive_file\n";
// === Ältere Backups löschen (nur die 60 neuesten behalten) ===
function cleanup_old_backups($dir, $pattern, $keep = 60) {
$files = glob("$dir/$pattern");
usort($files, function($a, $b) {
return filemtime($b) <=> filemtime($a); // neueste zuerst
});
$files_to_delete = array_slice($files, $keep);
foreach ($files_to_delete as $file) {
if (is_file($file)) {
unlink($file);
echo "🗑️ Alte Datei gelöscht: $file\n";
}
}
}
// Nur jeweils 60 Backups behalten
cleanup_old_backups($backup_dir, 'db_backup_*.sql', $max_backups);
cleanup_old_backups($backup_dir, 'wp_files_*.tar.gz', $max_backups);
echo "✅ Backup abgeschlossen: $timestamp\n";
?>
Anpssungsbedarf zu diesem Skript:
Hier wird der Code für die Sicherung einer WordPress-Webseite beim Webhoster Netcup präsentiert. Für Netcup kann nicht das unter Skript unter Punkt 3. verwendet werden, weil Netcup als Datenbank-Hostname nicht „localhost“ verwendet, sondern eine IP-Adresse mit dem Standard-Port für das MySQL-Protokoll, z. B. 10.12.36.53:3306. Wenn Sie eine WordPress-Seite beim Webhoster Netcup betreiben, müssen Sie In den Zeilen 7 und 8 den zu sichernden Ordner und den Ordner für das Backup angeben (siehe die obigen Ausführungen zu Punkt 2.) und in der Zeile 9 und im Skript unten unter „Ältere Backups löschen“ die Zahl der zu behaltenden Backups bestimmen (im Beispiel sind 60 vorgesehen). Die für die Datenbanksicherung relevanten Daten liest das Skript automatisch aus der Datei „wp-config.php“. Diesbezüglich müssen Sie keine Angaben machen.
5. Download
Hier können Sie alle drei Skriptes downloaden.
6. Automatisierung der Erstellung der Backups via Cronjob
Als erster Schritt sollten ein Ordner „backup“ und ein Ordner „skripte“ angelegt und dann das Backup-Skript (ich bezeichnete dieses im Folgenden als backup.php) in den Ordner „skripte“ hochgeladen werden. Das Skript muss die Dateiberechtigung 755 erhalten (siehe zu den Dateiberechtigungen selfhtml.org/wiki/Linux/Dateirechte ) Wenn Sie FileZilla verwenden, klicken Sie einfach mit der rechten Maustaste auf die Datei, wählen sie „Dateiberechtigungen“ und schreiben Sie dann im Feld „Numerischer Wert“ 755. Wechseln Sie anschließend in das Verwaltungspanel Ihres Webhosters und legen sie dort einen Cronjob an. Siehe zu den Cronjobs wikipedia.org/wiki/Cron . Anhand der Webhoster lima-city, Netcup und All-INKL.COM wird demonstriert, welche Schritte zur Realisierung eines Cronjobs erforderlich sind.

a) lima-city
Loggen Sie Sie sich in www.lima-city.de/login ein. Klicken Sie dann auf „Webhosting“ , anschließend auf „Cronjobs“. Wählen Sie „Cronjob erstellen“ und sodann „Shell-Cronjob“. Schreiben Sie im Feld „Kommando“ den Befehl php und anschließend den vollständigen Pfad zu Ihrem Backup-Skript, in meinem Fall /home/webpages/lima-city/danny5/skripte/backup.php. Legen Sie dann noch die Ausführungszeitpunkte fest. Sie müssen dazu die Syntax von Crontab verwenden. Zur Ermittlung der richtigen Syntax können Sie den Crontab Generator verwenden. Siehe https://www.bennetrichter.de/tools/crontab-generator/. Geben Sie in den Generator ganz unten zunächst den Befehl ein und legen Sie oben fest, wann der Cronjob erledigt werden soll. In meinem Beispiel habe ich 0 3 * * * gewählt, was bedeutet, dass der Backup-Befehl jeden Tag um 3 Uhr früh ausgeführt wird.

b) Netcup
Loggen Sie sich in customercontrolpanel.de ein. Wählen Sie dann „Produkte“ und klicken Sie anschließend auf das Lupensymbol Ihres Produkts. Gehen Sie zu „geplanten Angaben“, dann zu „Aufgabe hinzufügen“. Wählen Sie im Weiteren „PHP-Skript ausführen“. Schreiben Sie nun im Feld „Skriptpfad“ den Pfad zu Ihrem Skript, und zwar nicht den absoluten Pfad (z. B. /var/www/vhosts/hosting212345.a2e16.netcup.net/ skripte/backup.php), sondern nur den Pfad nach „…netcup.net/“, also in meinem Beispiel skripte/backup.php. Legen Sie danach noch die PHP-Version und den Zeitpunkt für die Ausführung des Skripts fest.

c) ALL-INKL.COM
Loggen Sie sich in kas.all-inkl.com ein. Wählen Sie in der linken Listenansicht „Tools“, dann „Cronjobs“
Im Gegensatz zu den Webhostern lima-city oder Netcup können Sie bei All-INKL.COM keinen Shell-Cronjob ausführen, sondern nur einen URL-Cronjob. Damit dies klappt, wird nachstehende Vorgangsweise empfohlen:
Legen Sie einen Ordner mit dem Namen „skripte“ und anschließend eine Subdomain mit beliebigem Namen und als Webspace-Verzeichnis den Ordner „skripte“ an. Versehen den Ordner „skripte“ mit einem Verzeichnisschutz und laden Sie die backup.php in den Ordner hoch. Vergessen Sie nicht, dem Skript die Rechte 755 zu verleihen (siehe dazu oben). Gehen Sie im Weiteren zu Cronjobs > Cronjob anlegen. Wählen Sie als Protokoll/Pfad die angelegte Subdomain und hängen Sie an diese den Namen backup.php an. Das Protokoll/der Pfad lautet dann z.B. skripte.thommy378.de/backup.php. Legen Sie anschließend den Zeitpunkt der Ausführung fest. Da das Verzeichnis „skripte“ paswortgeschützt ist, müssen Sie bei „zusätzliche Einstellungen“ auch noch den Benutzernamen und das Passwort für das Verzeichnis eintragen. Dann auf „Speichern“ klicken.
