dinsdag , 22 januari 2019
Home > Blog > Script voor backup website(s) van VPS of VM naar FTP of NAS (Synology)

Script voor backup website(s) van VPS of VM naar FTP of NAS (Synology)

Synology NAS via FTP
Synology NAS via FTP

Back-ups maken van een VPS, VM of een enkele website kan doorgaans bij de betreffende hosting partij, maar het is daarnaast ook altijd aan te raden zelf nog back-ups naar een andere locatie te maken. Mocht de hosting partij in de problemen komen, failliet gaan of niet mee willen werken, dan kan je de code, media en databases mogelijk als verloren beschouwen.

Ik heb zelf een VPS met ongeveer 20 websites, daarnaast heb ik een Synology NAS waar dus prima aanvullende back-ups opgeslagen zouden kunnen worden. Ik kon geen bestaande oplossingen vinden, dus heb ik zelf via een aantal Linux en PHP-scripts een goed werkende en schaalbare oplossing gemaakt. Mogelijk kunnen de scripts geoptimaliseerd worden, tips daarvoor kan je bij de reacties achterlaten, dan zal ik die verwerken.

De back-ups heb ik op drie manieren geregeld:

Database back-ups

Iedere dag wordt er een back-up van de databases gemaakt. Dit doe ik als volgt:

Cronjob, bijvoorbeeld dagelijks:

wget -O - -q -t 1 http://www.domeinnaam.nl/dbscript.php (Aan het begin van de dag om de back-ups te genereren)
wget -O - -q -t 1 http://www.domeinnaam.nl/ftp-dbs.php (Aan het eind van de dag ivm overzetten via FTP, dit script kan je ieder uur draaien)

 

Dbscript.php (Let op, deze verwijdert alle bestanden in de map die je opgeeft, voordat de nieuwe databasedumps worden weggeschreven!):

set_time_limit(0);
$backupdir = "/home/admin/domains/domeinnaam.nl/private_html/backupmap";
//Oude files weggooien
if ($handle = opendir($backupdir)) { while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { unlink($backupdir."/".$entry); } } closedir($handle); }
//DB's exporteren
$db_host = "localhost"; $db_user = "username"; $db_pass = "password"; $datum = date("Y-m-d");
mysql_connect($db_host, $db_user, $db_pass) or die("DB Fout");
$query = "SHOW DATABASES"; $result = mysql_query($query);
while (list ($database) = mysql_fetch_row($result))
{
system("mysqldump --quote-names --databases $database -u$db_user -p$db_pass -h$db_host | gzip -c > $backupdir/$datum-$database.gz");
system("chmod 777 ".$backupdir."/".$database.".gz");
flush();
}

 

Ftp-dbs.php:

error_reporting(E_ALL);
set_time_limit(0);
$ftp_server = "IPofDomeinnaam";
$ftp_user_name = "username";
$ftp_user_pass = "password";
$source_dir = "/home/admin/domains/domeinnaam.nl/private_html/backups";
$destination_dir = "/home/db-backups";
// set up basic connection
$conn_id = ftp_connect($ftp_server);
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_pasv($conn_id, true);
// check connection
if ((!$conn_id) || (!$login_result)) { 
 echo "FTP connection has failed!";
 echo "Attempted to connect to $ftp_server for user $ftp_user_name"; 
 exit; 
} else {
 //echo "Connected to $ftp_server, for user $ftp_user_name\n";
}
//List all files
if ($handle = opendir($source_dir)) {
 while (false !== ($entry = readdir($handle))) {
 if ($entry != "." && $entry != "..")
 {
 // upload the file
 $upload = ftp_put($conn_id, $destination_dir."/".$entry, $source_dir."/".$entry, FTP_BINARY); 
 
 // check upload status
 if (!$upload) { 
 //echo "FTP upload has failed: $entry \n";
 } else {
 unlink($source_dir."/".$entry);
 //echo "Uploaded $entry to $ftp_server as $entry\n";
 }
 }
 }
closedir($handle);
}
// close the FTP stream 
ftp_close($conn_id);

 

Website backups

Een back-up van de code en media maak ik eenmaal per week, maar door de cronjob vaker uit te voeren kan je dit ook iedere dag doen.

Cronjob voor het genereren van het .tar bestand (Sluit de back-up map uit, zodat er geen recursive back-up wordt gemaakt, geeft het doel .TAR bestand aan en als laatste de map die naar de .TAR weggeschreven zal worden):

#!/bin/bash
NOW=$(date +"%d-%m-%Y")
tar --exclude='/home/admin/domains/domeinnaam.nl/private_html' -czf /home/admin/domains/domeinnaam.nl/private_html/websitebackups/$NOW-domains.tar.gz /home/admin/domains

 

Cronjob voor het via FTP overzetten van de code en media:

wget -O - -q -t 1 http://www.domeinnaam.nl/ftp-websites.php

 

Ftp-websites.php om via FTP het .tar bestand over te zetten:

error_reporting(E_ALL);
set_time_limit(0);
$ftp_server = "IPofDomeinnaam";
$ftp_user_name = "username";
$ftp_user_pass = "password";
$source_dir = "/home/admin/domains/domeinnaam.nl/private_html/websitebackups";
$destination_dir = "/home/websites-backups";
// set up basic connection
$conn_id = ftp_connect($ftp_server);
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_pasv($conn_id, true);
// check connection
if ((!$conn_id) || (!$login_result)) { 
 echo "FTP connection has failed!";
 echo "Attempted to connect to $ftp_server for user $ftp_user_name"; 
 exit; 
} else {
 //echo "Connected to $ftp_server, for user $ftp_user_name\n";
}
//List all files
if ($handle = opendir($source_dir)) {
/* This is the correct way to loop over the directory. */
 while (false !== ($entry = readdir($handle))) {
 if ($entry != "." && $entry != "..")
 {
 echo "$entry\n";
 // upload the file
 $upload = ftp_put($conn_id, $destination_dir."/".$entry, $source_dir."/".$entry, FTP_BINARY); 
 
 // check upload status
 if (!$upload) { 
 echo "FTP upload has failed!\n";
 } else {
 echo "Uploaded $entry to $ftp_server as $entry\n";
 unlink($source_dir."/".$entry);
 }
 }
 }
closedir($handle);
}
// close the FTP stream 
ftp_close($conn_id);

DirectAdmin back-ups

Als je DirectAdmin gebruikt, dan kan je via de optie Admin Back-up automatisch op vaste tijden een complete back-up van alle data op je server naar een FTP server versturen. Neem in de bestandsnaam een jaartal, maand en datum op, zodat de bestanden elkaar niet overschrijven.

Conclusie

Door middel van bovenstaande scripts, of alternatieven, kan je in de basis goede back-ups maken van je complete VM, VPS of een enkele website naar je eigen Synology NAS.

Heb je vragen, suggesties, verbeteringen of alternatieven, laat dan even een reactie achter.

Bekijk ook

Ripple XRP

Western Union: betalen met cryptovaluta mogelijkheid

Western Union heeft aangegeven dat het betalingen met cryptovaluta in de nabije mogelijkheid niet uitsluit. …

Eén reactie

  1. Ik heb zelf een Ubuntu VPS en gebruik deze tools:
    – automysqlbackup en autopostgresqlbackup. Deze scripts zorgen ervoor dat er van de laatste week elke dag een backup is, van de afgelopen vier weken elke week en onbeperkt maandelijkse backups.
    – rdiff-backup. Hiermee kun je incrementeel backups maken dus alleen de wijzigingen overpompen en niet alles. Bovendien worden er ook eerdere versies van bestanden bewaard, tot een zelf te bepalen aantal dagen terug.
    – ssh. De communicatie tussen vps en synology is encrypted dus geen plain text ftp passwords over internet.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *