Seit vielen Jahren habe ich meine ganzen Webgeschichten bei All-Inkl gehostet. Ich bin mit dem Anbieter ganz zufrieden. Die Server sind sehr zuverlässig, die Administrationsoberfläche ist durchdacht, der Support antwortet innerhalb von 15 Minuten und alle Funktionen und Extensions, die man so braucht, sind vorhanden. Eines fehlt aber: Eine einfache Möglichkeit Backups zu erstellen.
Mittlerweile hat sich so einiges bei meinem Webhoster angesammelt. Mein Anspruch ist es also, je nach Projekt ein Backup erstellen zu können. Sprich Verzeichnis XYZ und die dazugehörige MySQL Datenbank schön abgepackt als ZIP File, so dass ich die nur noch herunterladen und auf meinen Rechner archivieren muss. All-Inkl bietet zwar in ihren FAQs schon einige interessante Ansätze, aber entweder es betrifft nur den Backup einer MySQL Datenbank, oder man braucht gleich einen der Managed-Server Tarife.
Also habe ich selbst ein kleines Skript geschrieben, dass ein Backup erzeugt. Wichtig: Es funktioniert nur mit dem All-Inkl Premium Tarif, denn das Skript verwendet SSH und das gibt es erst ab den Premium Tarif. Eine Variante, bei der alleine mit PHP Bordmittel ein Backup durchgeführt wird, scheitert leider am begrenzten Speicher. All-Inkl gesteht PHP nur 64MB Arbeitsspeicher zu. Erstellt man also ein Backup für ein Verzeichnis und packt dieses in eine ZIP Datei, so ist bei 64MB Schluss und es kommt ein memory limit exceeded.
Nun aber zu meiner Lösung. Ich verwendet den SSH Zugang, führe damit ein mysqldump aus und packe alles mit tar in eine tar.gz Datei ein. Nachdem All-Inkl die SSH Extension von PHP nicht zur Verfügung stellt, verwende ich die phpseclib. Diese hervorragende Bibliothek rund um das Thema Verschlüsselung bietet einen rein PHP basierten SSH Client an. Die Verwendung des SSH Clients ist denkbar einfach:
<?php
include('Net/SSH2.php');
$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
exit('Login Failed');
}
echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>
Über die phpseclib habe ich bereits an anderer Stelle schon einmal etwas geschrieben.
Nun aber zum Backup-Skript, dass wie folgt aussieht:
<?PHP
$sshUser = 'youruser';
$sshPassword = 'yourpass';
$sshHost = 'yourhost';
$base = "/www/htdocs/<ftpuser>/";
$backupDir = "backup/";
$dbs = array(
array(
"name" => "wordpress",
"dbname" => "d1234567",
"passwd" => "secret",
"dir" => "wordpress"
),
array(
"name" => "website",
"dbname" => "d321",
"passwd" => "secret",
"dir" => "website/www"
),
array(
"name" => "selfoss",
"dir" => "website/selfoss"
),
array(
"name" => "database123",
"dbname" => "d987324",
"passwd" => "secret",
)
);
// ssh connection
include('Net/SSH2.php');
$ssh = new Net_SSH2($sshHost);
if(!$ssh->login($sshUser, $sshPassword))
die('ssh login failed');
$baseWithoutTrailingSlash = substr($base, 1);
foreach($dbs as $db) {
echo $db["name"] . "<br />";
ob_flush();
// directory for backup
$dir = "";
if(isset($db["dir"]) && strlen(trim($db["dir"]))>0) {
$dir = $baseWithoutTrailingSlash . $db["dir"];
}
// backup database
$sql = "";
if(isset($db["dbname"]) && strlen(trim($db["dbname"]))>0) {
$db_name = $db["dbname"];
$db_passwd = $db["passwd"];
$sql_file = $db["name"] . "_" . date('Y.m.d') . ".sql";
$sql = $baseWithoutTrailingSlash . $backupDir . $sql_file;
echo $ssh->exec("mysqldump -u " . $db_name . " -p'" . $db_passwd . "' --allow-keywords --add-drop-table --complete-insert --quote-names " . $db_name . " > " . $base . $backupDir . $sql_file);
}
// generate tar.gz file
$tar_file = $base . $backupDir . $db["name"] . "_" . date('Y.m.d') . ".tar.gz";
$result = $ssh->exec("tar cfz " . $tar_file . &Artikel gek: Lesen Sie den Rest hier (weitere 2235 Bytes)