#!/bin/bash # Local backup script, adapted from https://webworxshop.com/centralised-backups-with-restic-and-rsync/ # Place in /usr/sbin/backup.sh # Enable with `systemctl enable backup.timer` # Check status with `systemctl status backup.service` set -e # Check variables if [ -z "$BACKUP_DEST" ]; then echo "BACKUP_DEST must be set" exit 1 fi if [ -z "$RESTIC_REPOSITORY" ]; then echo "RESTIC_REPOSITORY must be set" exit 1 fi if [ -z "$RESTIC_PASSWORD_FILE" ]; then echo "RESTIC_PASSWORD_FILE must be set" exit 1 fi if [ -Z "$BACKUP_DIRS" ]; then echo "BACKUP_DIRS must be set" exit 1 fi if [! -Z "$EXCLUDE_FILE" ]; then EXCLUDES="--exclude-from=$EXCLUDE_FILE" fi # Split dirs using semicolons DIRS=$(echo $BACKUP_DIRS | tr ";" "\n") function do_rsync() { # Write start info to log file echo "Starting rsync backup job $1 to $BACKUP_DEST$1 at $(date '+%Y-%m-%d %H:%M:%S')..." # Ensure backup directory exists mkdir -p $BACKUP_DEST$1 # Execute rsync /usr/bin/rsync -aP --delete $EXCLUDES $1 $BACKUP_DEST # Write end-info to log file echo "Rsync job finished at $(date '+%Y-%m-%d %H:%M:%S')." echo "Done" } echo "Starting rsync clone" for D in $DIRS; do do_rsync $D done # copy apt list dpkg --get-selections > $BACKUP_DEST/packages.list echo "Starting restic backup" # Check database restic check # Execute backups for D in $DIRS; do restic backup $BACKUP_DEST/$D done # Clean up old snapshots restic forget -d 7 -w 4 -m 6 -y 2 # Re-check the database restic check