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.
Install
On all machines that you want to backup you will need to install Borg
Ubuntu and Debian
apt install borgbackup
MacOS
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 borg@sandraudiga.squashedfly.eu
This is my backup script for Gna (I have removed the passphrase):
#!/bin/sh # Setting this, so the repo does not need to be given on the command line: export BORG_REPO=ssh://borg@sandraudiga.squashedfly.eu/~/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 \ backup_exit=$? 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 \ prune_exit=$? # 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 exit ${global_exit}