Skip to content

Instantly share code, notes, and snippets.

@notDavid
Forked from jorijn/borgbackup.sh
Created October 26, 2021 09:29
Show Gist options
  • Save notDavid/f8c69add41f50a2f478b66d3484f2d47 to your computer and use it in GitHub Desktop.
Save notDavid/f8c69add41f50a2f478b66d3484f2d47 to your computer and use it in GitHub Desktop.
This is the script I use to backup my macbook to a borgbackup repository. It should be a drop-in script and suit most users just fine, but I do recommend looking at the values and making them fit for your specific situation.
#!/bin/bash
# Setting this, so the repo does not need to be given on the commandline:
export BORG_REPO='*******'
# Setting this, so you won't be asked for your repository passphrase:
export BORG_PASSPHRASE='*******'
# some helpers and error handling:
function info () { echo -e "\n"`date` $@"\n" >&2; }
trap "echo `date` Backup interrupted >&2; exit 2" SIGINT SIGTERM
info "Starting backup"
# Backup the most important directories into an archive named after
# the machine this script is currently running on:
borg create \
--verbose \
--filter AME \
--list \
--stats \
--show-rc \
--compression lz4 \
--exclude-caches \
--exclude '/Users/*/.cache/*' \
--exclude '/Users/*/.Trash/*' \
--exclude '/Users/*/Library/Caches' \
--exclude '/Users/*/Library/Mobile Documents' \
--exclude '/Users/*/Library/Containers/com.apple.mail/Data/Library/Mail Downloads' \
--exclude '/Users/*/Music/iTunes/iTunes Media/Movies' \
--exclude '/Users/*/Music/iTunes/iTunes Media/TV Shows' \
--exclude '/Users/*/Dropbox' \
--exclude '/Users/*/Google Drive' \
--exclude '/Users/*/VirtualBox VMs' \
\
::'{hostname}-{now}' \
/Users \
/Library \
/Applications \
/usr/local # homebrew
backup_exit=$?
info "Pruning repository"
# Use the `prune` subcommand to maintain 24 hourly, 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 \
--stats \
--keep-hourly 24 \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 6 \
prune_exit=$?
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
exit ${global_exit}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment