restic is a command-line tool for making backups.
Unfortunately restic does not come pre-configured with a way to run automated backups. Here follows a step-by step tutorial on how to set it up.
Tip: The steps in this section will instruct you to copy files from this repo to system directories.
$ git clone https://github.com/payrequestio/restic-amazon-backup.git
$ cd restic-amazon-backup
$ sudo make install
Put these files in /etc/restic/
:
aws-env.sh
: Fill this file out with your S3 bucket settings. The reason for putting these in a separate file is that it can be used also for you to simply source, when you want to issue some restic commands. For example:
$ source /etc/restic/aws-env.sh
$ restic snapshots # You don't have to supply all parameters like --repo, as they are now in your environment!
Now we must initialize the repository on the remote end:
source /etc/restic/aws-env.sh
restic init
Put this file in /usr/local/sbin
:
restic_backup.sh
: A script that defines how to run the backup. Edit this file to respect your needs in terms of backup which paths to backup, retention (number of backups to save), etc.
Put this file in /
:
.backup_exclude
: A list of file pattern paths to exclude from you backups, files that just occupy storage space, backup-time, network and money.
Now see if the backup itself works, by running
$ /usr/local/sbin/restic_backup.sh
$ restic snapshots
Now we can do the modern version of a cron-job, a systemd service + timer, to run the backup every day!
Put these files in /etc/systemd/system/
:
restic-backup.service
: A service that calls the backup script.restic-backup.timer
: A timer that starts the backup every day.
Now simply enable the timer with:
$ systemctl start restic-backup.timer
$ systemctl enable restic-backup.timer
You can see when your next backup is scheduled to run with
$ systemctl list-timers | grep restic
and see the status of a currently running backup with
$ systemctl status restic-backup
or start a backup manually
$ systemctl start restic-backup
You can follow the backup stdout output live as backup is running with:
$ journalctl -f -u restic-backup.service
(skip -f
to see all backups that has run)
We want to be aware when the automatic backup fails, so we can fix it. Since my laptop does not run a mail server, I went for a solution to set up my laptop to be able to send emails with postfix via my Gmail. Follow the instructions over there.
Put this file in /usr/local/sbin
:
systemd-email
: Sends email using sendmail(1). This script also features time-out for not spamming Gmail servers and getting my account blocked.
Put this files in /etc/systemd/system/
:
[email protected]
: A service that can notify you via email when a systemd service fails. Edit the target email address in this file.
As you maybe noticed already before, restic-backup.service
is configured to start status-email-user.service
on failure.
Once in a while it can be good to do a health check of the remote repository, to make sure it's not getting corrupt. This can be done with $ restic check
.
There are some *-check*
-files in this git repo. Install these in the same way you installed the *-backup*
-files.
If you want to run an all-classic cron job instead, do like this:
etc/cron.d/restic
: Depending on your system's cron, put this in/etc/cron.d/
or similar, or copy the contents to $(sudo crontab -e). The format of this file is tested under FreeBSD, and might need adaptions depending on your cron.usr/local/sbin/cron_mail
: A wrapper for running cron jobs, that sends output of the job as an email using the mail(1) command.