Backups with Aegis

April 18, 2020

Every now and then, I have a specific need and I write a little script to get something done on my server. Recently, I was looking into writing a new script but instead opted to write a more comprehensive program.

I recently saw that the folks at Spatie were working on a comprehensive backup solution, and I figured I should build something similar and simpler for my own use case. (This means that this package won’t really receive any updates or such.)

So, Aegis was born. It is a very simple console app: you specify jobs in a YAML file, and the app will run those jobs and create an archive of a specific directory and send it to a destination of choice. All that you have to do is run Aegis periodically with a cronjob.

For my own use case, I wanted Aegis to be able to create two gzipped tarballs of projects I run on my own server. The YAML file for these jobs looks like this:

jobs:
  nicoverbruggen.be:
    source:
      path: /var/www/nicoverbruggen.be
      exclude:
        - ./.git
        - ./vendor
        - ./node_modules
        - ./storage/framework
        - ./storage/debug
    destination:
      name: dropbox
      path: /site/
  other.nicoverbruggen.be:
    source:
      path: /var/www/other.nicoverbruggen.be
      exclude:
        - ./.git
        - ./vendor
        - ./bin
    destination:
      name: dropbox
      path: /other/

After specifying what jobs need to run, it’s just a matter of setting up a cronjob. I actually wanted to make sure a database dump of nicoverbruggen.be was included, so I set up a little script, lovingly called dumpie:

#!/bin/sh
rm /var/www/nicoverbruggen.be/storage/dump.sql;
echo "Dumping database of nicoverbruggen.be...";
mysqldump nicoverbruggen > /var/www/nicoverbruggen.be/storage/dump.sql;
echo "Done.";

Before dumpie will do any work, though, I need to set up the credentials for mysqldump, via the ~/.my.cnf file. This is better than putting plain-text password credentials in the script.

Obviously, my password for MySQL is not actually that, but you get the idea. Finally, all that was left was to set up my crontab, via crontab -e:

# Take a backup of the database with dumpie every day at midnight (0:00)
0 0 * * * /home/nico/utils/dumpie > /home/nico/dumpie.log

# Take a backup with Aegis every Sunday at 1:00
0 1 * * 0 /home/nico/aegis/aegis backup:dropbox /home/nico/aegis/jobs/backup.yaml > /home/nico/aegis.log

With this, I get a nice backup of my important websites delivered to my personal Dropbox every Sunday at 1:00. It’s great to have backups like this, even though I still have server backups via my VPS provider.

This is one of those fun side projects that doesn’t need to become anything bigger, but fulfills a nice purpose that makes my life a little easier.