How to backup your webserver files and mysql database using rsync.net

I am very happy with my provider, but if you don’t have backup server for your account, you need another service to backup your files.

After a little research, i found rsync.net. Their price is acceptable ($0.80-1.4 gb/mounth | static - global redundant) , and the service is really fine.

I want to backup my dbs every night, but files; every two weeks. My model is like this:

  1. Backup every database individually to /mybackups/db
  2. Backup every vhost folder individually /mybackups/vhosts
  3. Than mount rsync.net filesystem to the webserver
  4. Syncronize local backup folder to the mounted filesystem

Here is how i setup my server.

You need to install sshfs to your server first, than

sudo apt-get install sshfs

due to a bug, run below code

sudo modprobe fuse

If rsync is not installed

sudo apt-get install rsync

After you make your purchase from rsync.net, they will send you an email regarding to your account information. I choosed tp pay with paypal and subscribed, so it will be paid monthly.

We are going to use automated scripts, so, it is better to use ssh keys. If you haven’t created your ssh key already, do it:

ssh-keygen -t rsa

Do not enter a pass phrase, just hit enter twice.

Now we need to send it to the rsync.net server. Type something like this:

scp ~/.ssh/id_rsa.pub [email protected]:.ssh/authorized_keys

Of course change [email protected] with your rsync.net user info.

To backup my databases i use this bashscript (autodb.sh)

#!/bin/bash
### MySQL Server Login Info ###
MUSER="yourmysqluser"
MPASS="yourmysqlpass"
MHOST="localhost"
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
BAK="/your/backup/path/to/db"
GZIP="$(which gzip)"
MOUNT="/mnt/your-rsync-backup-folder" #name whatever you want
 
find $BAK -type d -mtime +30 -exec rm -rf {} \; #delete anything older than 30 days. you can change this one whatever you want.
NOW=$(date +"%d-%m-%Y")
mkdir $BAK/$NOW
 
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
for db in $DBS
do
 FILE=$BAK/$NOW/$db.$NOW-$(date +"%T").gz
 $MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE
done
 
sshfs your-rsync-net-username@your-rsync-net-server: $MOUNT
 
rsync -az --delete --force --stats /your/backup/path $MOUNT
 
fusermount -u $MOUNT

Now save it wherever you want (not under anywhere web accesible!) and change its writing permissions to 755

To backup my files (autofiles.sh) i use something like this

#!/bin/bash
 
mark_file=/tmp/job-run-marker
# check whether the job runned last week
if [ -e $mark_file ] ; then
  rm -f $mark_file
else
  touch $mark_file
  exit 0
fi
 
#above part is for only to run this script once in two weeks
 
BAK="/your/backup/path/to/vhosts"
VHOSTS="/your/path/to/vhosts"
MOUNT="/mnt/your-rsync-backup-folder" #name same as the above one
 
find $BAK -type d -mtime +46 -exec rm -rf {} \; #delete anything older than 46 days. since we backup our files every two weeks, we will have 4 versions of each
NOW=$(date +"%d-%m-%Y")
mkdir $BAK/$NOW
 
cd $VHOSTS
for files in *
do
set $files
OF=$BAK/$NOW/$1-$NOW-$(date +"%T").tar.gz
#echo $OF
tar -czvf $OF $files
done # exiting for loop
unset $files # un setting set variables
 
sshfs -o nonempty your-rsync-net-username@your-rsync-net-server: $MOUNT
 
rsync -az --delete --force --stats /your/backup/path $MOUNT
 
fusermount -u $MOUNT
 
exit 0 # exiting shell script

Save this file like the other one and change write permission of course.

Now we need to tell the machine to run these scripts automatically. Type

crontab -e

At the end of the file add these lines and press kntrl+o and enter (i mean save it)

01 02 * * * /your/path/to/autodb.sh
01 03 * * 7 /your/path/to/autofiles.sh 

First line will execute the db bash script every day at 02:01 am, the second one execute files bash script every sunday at 03:01, but the file control in the script cause it to run only once in two weeks.

I think that’s all. If you face any problems, feel free to let me know.