The Random Thoughts of a Geek heading for Banbury
The Random Thoughts of a Geek heading for Banbury

Borg Backup

BorgBackup1 is a de-duplicating backup program. Optionally, it supports compression and authenticated encryption.

The main goal of Borg is to provide an efficient and secure way to backup data. The data de-duplication technique used makes Borg suitable for daily backups since only changes are stored. The authenticated encryption technique makes it suitable for backups to not fully trusted targets.


On all machines that you want to backup you will need to install Borg

Ubuntu and Debian

apt install borgbackup


You will need HomeBrew

brew cask install borgbackup
brew install borg

on Sandraudiga

sudo adduser borg
sudo -u borg -s
borg init --encryption=repokey ~/backups

on Gna

sudo su
ssh-keygen -t rsa
ssh-copy-id [email protected]

This is my backup script for Gna (I have removed the passphrase):


# Setting this, so the repo does not need to be given on the command line:
export BORG_REPO=ssh://[email protected]/~/backups

# Setting this, so you won't be asked for your repository passphrase:
export BORG_PASSPHRASE='...'

# some helpers and error handling:
info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM

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 '/home/*/.cache/*'    \
    --exclude '/var/cache/*'        \
    --exclude '/var/tmp/*'          \
    --exclude '/*/.git/*'           \
    ::'{hostname}-{now}'            \
    /etc                            \
    /home                           \
    /root                           \
    /var                            \


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    7               \
    --keep-weekly   4               \
    --keep-monthly  6               \


# use highest exit code as global exit code
global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))

if [ ${global_exit} -eq 1 ];
    info "Backup and/or Prune finished with a warning"

if [ ${global_exit} -gt 1 ];
    info "Backup and/or Prune finished with an error"

exit ${global_exit}

Related Articles

  1. Also called Borg