[EN] Backup your server with AutoMySQLBackup and Duplicity

Door 15 december 2016Tips & Trucs

You’ve setup your server (for example with Serverpilot or Laravel Forge on Digital Ocean), but have you thought about backups? If you’re using MySQL it would be nice to have daily backups right? And what if your server crashes? Maybe an off-site backup of everything? If you’re thinking “but I’ve checked the backup option with my droplet on Digital Ocean” right now, don’t rely on that! There are some horror stories about corrupt droplets and those backups are created weekly!

AutoMySQLBackup

This tool is pretty simple and can be installed with: sudo apt-get install automysqlbackup You’re done! Backups will be made daily, automatically of all your databases and will be stored in /var/lib/automysqlbackup If you’d like to manually run it: sudo automysqlbackup

Restoring from one of those backups is as easy as extracting and importing the .sql file with: mysql -u username -p databasename < databasefile.sql, provide your password when asked and your done.

Duplicity

You could copy a lot of directories from your server daily with SCP to another server, or first zip them but then you’ve to create multiple cronjobs to handle all of this. And what about old backups and thought about disk space on the backup server? Duplicity can take care of all of this. Don’t have a backup server? Duplicity supports a lot of storage platforms and transfer protocols like: Amazon S3, Backblaze, Dropbox, Google Drive, SSH/SCP, WebDav, etc. and it’s creating diff files instead of doing complete backups everyday to save diskspace. Let’s install it with: sudo apt-get install duplicity

Full backups

Let’s start with a full backup. I’ve got a TransIP STACK account, it’s a Dutch hosting provider which gives 1TB of free storage which you can access with WebDav so I store my server backups there. Also my webserver is managed by Serverpilot so my directories I’d like to backup are:

  • /srv, all my websites, applications and logs are stored here
  • /var/lib/automysqlbackup, all daily, weekly and monthly backups of all my MySQL databases

I’m not going to use any encryption in this example so to create a full backup with Duplicity from the above directories to my TransIP STACK storage:

sudo duplicity full 
--ssl-no-check-certificate 
--no-encryption 
--include /srv 
--include /var/lib/automysqlbackup 
--exclude '**' 
/ 
webdavs://username:[email protected]/remote.php/webdav/backups

Create a monthly cronjob (as root user else you can’t access the AutoMySQLBackup files) from it and you’re done!

Incremental backups

When you’ve created your first full backup, Duplicity can create incremental backups with the full backup as reference. This means: when a full backup is ready, Duplicity will compare everything with that backup and creates diff files from the changes. And yes Duplicity is smart enough to restore backups from it, you don’t have to run multiple diff files over the full backups or something. Setting up a incremental backup is as easy as replacing full with incremental in the example above. Create a daily cronjob, done!

Removing old backups

Now you’ve setup 2 cronjobs, but it keeps running and won’t delete anything. I’d like to keep 3 months of backups, this can be done with this command:

duplicity remove-all-but-n-full 3 
--ssl-no-check-certificate 
webdavs://username:[email protected]/remote.php/webdav/backups
--force

Restoring backups

But what if something goes wrong and you’d like to restore a backup? You can use the restore command:

duplicity restore 
--ssl-no-check-certificate 
--no-encryption 
webdavs://username:[email protected]/remote.php/webdav/backups .

Which will restore the latest backup to the directory your currently in. You can even restore one file with the --file-to-restore parameter or choose with --time from which backup you’d like to restore. If you want to know which backups you can restore, run the collection-status command.

How I’ve setup my backups

AutoMySQLBackup is installed and running and with crontab -e as my root user I’ve setup my Duplicity cronjobs:

0 1 * * * duplicity --full-if-older-than 1M --ssl-no-check-certificate --no-encryption --include /srv --include /var/lib/automysqlbackup --exclude '**' / webdavs://username:[email protected]/remote.php/webdav/backups >> /dev/null
0 5 1 * * duplicity remove-all-but-n-full 3 --ssl-no-check-certificate webdavs://username:[email protected]/remote.php/webdav/backups --force >> /dev/null

A little bit different from what I’ve said earlier. By default the duplicity command creates a full backup and when there is one already it creates an incremental one. With --full-if-older-than we can specify when a new full backup should be made. This method is better than creating two cronjobs; one for a full backup the first of the month and the other one incremental the other days. What if the full backup fails? We’re getting two months of incremental backups, etc.

Do you want to know more? Run the man duplicity command for the manual or check the duplicity manual online.

And don’t forget: backup, backup, backup!!!