For some time I’ve been looking for a backup solution for Linux that can periodically take snapshots of data, allowing me to go back in history of any file just like git. I finally found restic which fits these requirements. Here is how I set it up to take snapshots of particular directories, say every 15 minutes.
Though restic is available in repositories of almost all Linux distros, I recommend downloading the latest release directly from GitHub to avoid dealing with potentially outdated version. Helpfully, you can stay current with restic release with
Restic has a notion of “repository” which is where it stores backup snapshots. You first need to create/initialize a repo before create any backups:
mkdir ~/restic-repo rust init ~/restic-repo
Initialization steps requires a password for the repo to keep it encrypted. This password has to be provided in all future invocations of restic which refer to this newly created repo. To avoid specifying password directly on the command line, you can create a file like
~/.restic_passwd with your password as the only content. This file must have permissions set such that only you can read/write this file:
chmod 600 ~/.restic_passwd.
Creating backup snapshots
Now you can backup any folder(s) to this repo with:
restic -r ~/restic-repo -p ~/.restic_passwd dir1 dir2 dir3
Of course, replace
dir1 etc. with directories you actually want to backup. Once you have verified that this command works fine, let’s put it in a script file
restic_backup.sh. We will call this script from service files below.
~/bin/restic_backup.sh: be sure to specify directorie(s) you actually want to backup in script below
#!/bin/bash REPO="$HOME/restic-repo" PASSWD="$HOME/.restic_passwd" restic -r "$REPO" -p "$PASSWD" --verbose backup dir1 dir2 dir3 restic -r "$REPO" -p "$PASSWD" --verbose forget --keep-within 1m --prune
This script also prune/deletes snapshots more than 1 month old. If you want to keep and infinite history, just comment out the last line.
Now that you can create backup snapshots on demand, it’s time to automate this process and make it happen, say every 15 minutes. On Linux, the best way to schedule such periodic jobs is to use
systemd (fear not!). For this, you need to create two files in
~/.config/systemd/user/; create this directory if it doesn’t already exist. Ok, here is content of these two files:
systemdwhat command to execute
[Unit] Description=Restic Backup service Wants=backup.timer [Service] ExecStart=%h/bin/restic_backup.sh [Install] WantedBy=default.target
systemdhow frequently to run this service
[Unit] Description=Run backup every 15 minutes [Timer] OnCalendar=*:0/15 Persistent=true [Install] WantedBy=timers.target
You can change how frequently the service is run by modifying
Finally enable this service with:
systemctl --user enable --now backup.service
Restoring a snapshot
There are many ways for restoring any snapshot of data from a restic repo, from dumping a particular file to mounting the restic repo. The official documentation on restoric backups covers this well.
There’s much more restic can do like directly backing up to a remote site using rclone, but a local snapshot style backup is all I needed for now.