#!/bin/bash # Adapted from https://borgbackup.readthedocs.io/en/stable/quickstart.html#automating-backups export SSH_SERVER="<%= @user %>@<%= @host %>" export SSH_PORT="<%= @port %>" export HOSTNAME=`cat /etc/hostname` # Setting this, so the repo does not need to be given on the commandline: export BORG_REPO=ssh://$SSH_SERVER:$SSH_PORT//var/backups/remote/$HOSTNAME/borg # Setting this, so you won't be asked for your repository passphrase: export BORG_PASSPHRASE='<%= @password %>' # or this to ask an external program to supply the passphrase: #export BORG_PASSCOMMAND='pass show backup' # Custom keyfile support if [ "<%= @encryption %>" == "keyfile" ] && [ ! -z "<%= @keyfile %>" ]; then if [ ! -e "<%= @keyfile %>" ]; then fatal "Keyfile not found: <%= @keyfile %>. Please create it manually." fi export BORG_KEY_FILE="<%= @keyfile %>" fi # some helpers and error handling: #info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; } trap 'info $( date ) Backup interrupted >&2; exit 2' INT TERM # Check if [ "$1" == "--check" ]; then borg list exit $? fi # Initialize if ! ssh $SSH_SERVER -p $SSH_PORT test -f /var/backups/remote/$HOSTNAME/borg/config; then info "Initializing borg repository at ssh://$SSH_SERVER:$SSH_PORT//var/backups/remote/$HOSTNAME/borg..." borg init --encryption=<%= @encryption %> ssh://$SSH_SERVER:$SSH_PORT//var/backups/remote/$HOSTNAME/borg init_exit=$? if [ "$init_exit" != "0" ]; then fatal "Error initializing repository" fi fi # Backup the most important directories into an archive named after # the machine this script is currently running on: info "Starting backup..." borg create \ --verbose \ --filter AME \ --list \ --stats \ --show-rc \ --compression lz4 \ --exclude-caches \ --exclude '/home/*/.cache/*' \ --exclude '/var/cache/*' \ --exclude '/var/tmp/*' \ <% @exclude_unencrypted.each do |del| -%> --exclude <%= del %> \ <% end -%> ::'{hostname}-{now}' \ <% @include_unencrypted.each do |add| -%> <%= add %> \ <% end -%> backup_exit=$? #if [ "$backup_exit" != "0" ]; then # fatal "Error creating snapshot" #fi info "Pruning repository..." # Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly # archives of THIS machine. The '{hostname}-' prefix is very important to # limit prune's operation to this machine's archives and not apply to # other machines' archives also: borg prune \ --list \ --prefix '{hostname}-' \ --show-rc \ --keep-daily <%= @keepdaily %> \ --keep-weekly <%= @keepweekly %> \ --keep-monthly <%= @keepmonthly %> \ prune_exit=$? #if [ "$prune_exit" != "0" ]; then # fatal "Error pruning repository" #fi # Use highest exit code as global exit code global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit )) if [ ${global_exit} -eq 1 ]; then info "Backup and/or Prune finished with a warning" fi if [ ${global_exit} -gt 1 ]; then info "Backup and/or Prune finished with an error" fi if [ "${global_exit}" != "0" ]; then fatal "Error completing borg action: exit code ${global_exit}" fi