Creating Backups with Restic and Backblaze B2 Cloud

Creating Backups with Restic and Backblaze B2 Cloud

Monday, Dec, 7, 2020

Reliable Backups on a Linux System with Restic Backblaze B2 and systemd

Backups are a critical part of ensuring your data stays safe. Losing data is not something anyone wants to experience and reliable backups are how to ensure this never happens.

Backup infrastructure is critical but shouldn’t require large amounts of time to maintain. A program to create backups should work quietly in the background while ensuring data integrity and safety.

Restic is a great backup tool with powerful features like deduplication and encryption. It supports B2 cloud as a storage backend allowing offsite backups for an inexpensive price. Restic is a CLI tool and doesn’t include any scheduled tasks to run to create backups regularly. This tutorial configures systemd to run daily backups, prune the backup repository and run data integrity checks periodically.

Restic has many backends capable of storing backup data. Backblaze B2 is a good option due to low cost of storage and availability of the stored data.

Creating the config file

This file contains the authentication details as well as any settings to provide to the Restic command. Save the file with restrictive permissions only readable by the root user to prevent leaking the credentials.

❯ sudo cat /etc/restic-backup.conf
BACKUP_PATHS="/etc/restic.includes"
EXCLUDE_PATHS="/etc/restic.excludes"
RETENTION_DAYS=7
RETENTION_WEEKS=8
RETENTION_MONTHS=12
RETENTION_YEARS=10
B2_ACCOUNT_ID=""
B2_ACCOUNT_KEY=""
RESTIC_REPOSITORY="b2:[REPO_NAME]:/"
RESTIC_PASSWORD=""
RESTIC_CACHE_DIR=/tmp/restic_cache

Configure the include and exclude files to specify which files to backup.

❯ sudo cat /etc/restic.includes
/home/mitch
❯ sudo cat /etc/restic.excludes
**/node_modules/**
**.local/share/Steam/**
**/.stversions/**
**/.PlayOnLinux/**
**/.local/share/Trash/**
**/downloads/**

Configuring systemd

This backup configuration consists of three systemd service units, ‘restic-backup’, ‘restic-prune’, and ‘restic-check’. These three units each run a specific job to maintain the Restic repository. There are separate timer unit files to run the backup tasks periodically. Once the unit files are in place, use the systemctl command to activate and start the timer services.

restic-backup

The restic-backup.service unit handles creating the backup snapshots.

❯ cat /etc/systemd/system/restic-backup.service
[Unit]
Description=Restic system backup
Before=restic-prune.service
Wants=restic-prune.service
JoinsNamespaceOf=restic-prune.service restic-check.service

[Service]
Type=oneshot
ExecStart=restic backup --verbose --tag auto-backup --iexclude-file $EXCLUDE_PATHS --files-from $BACKUP_PATHS ; /usr/bin/sleep 20
EnvironmentFile=/etc/restic-backup.conf
SuccessExitStatus=3

The backup frequency is configured with the restic-backup.timer unit file.

❯ cat /etc/systemd/system/restic-backup.timer
[Unit]
Description=Backup with restic daily

[Timer]
OnCalendar=daily
RandomizedDelaySec=6hours
Persistent=true

[Install]
WantedBy=timers.target

restic-prune

The restic-prune.service unit runs the prune command on the repo, using the retention periods configured in the restic-backup.conf file. This unit is configured to run after the backup unit.

❯ cat /etc/systemd/system/restic-prune.service
[Unit]
Description=Restic prune to clean up old backups
Requires=restic-backup.service
After=restic-backup.service
JoinsNamespaceOf=restic-backup.service restic-check.service

[Service]
Type=oneshot
ExecStart=restic forget --prune -o b2.connections=10 --compact --tag auto-backup --cleanup-cache --keep-daily $RETENTION_DAYS --keep-weekly $RETENTION_WEEKS --keep-monthly $RETENTION_MONTHS --keep-yearly $RETENTION_YEARS
EnvironmentFile=/etc/restic-backup.conf

restic-check

Checking backup archive integrity

The restic-check.service unit runs the consistency check on the repo to ensure data integrity. It’s configured to use the local cache in order to reduce the download API calls to B2 cloud to lower costs.

❯ cat /etc/systemd/system/restic-check.service
Description=Restic system backup repository consitency check
Conflicts=restic-backup.service restic-prune.service
JoinsNamespaceOf=restic-backup.service restic-prune.service
After=restic-prune.service

[Service]
Type=oneshot
ExecStart=restic --verbose=3 check --with-cache
EnvironmentFile=/etc/restic-backup.conf

This unit is configured to run weekly.

❯ cat /etc/systemd/system/restic-check.timer
[Unit]
Description=Check restic repository consistency

[Timer]
OnCalendar=weekly
RandomizedDelaySec=1day
Persistent=true

[Install]
WantedBy=timers.target

Activating systemd units

After configuring the unit files the systemctl configuration will need to be reloaded, then the timer units activated and started.

systemctl daemon-reload
systemctl enable restic-backup.timer restic-check.timer
systemctl start restic-backup.timer restic-check.timer

The system should now create daily backups, prune any extra data daily, and check the repository consistency weekly.

Check the backup timer status with systemctl list-timers and individual units with systemctl status restic-backup.