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:
- Backup every database individually to /mybackups/db
- Backup every vhost folder individually /mybackups/vhosts
- Than mount rsync.net filesystem to the webserver
- 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.