\(
\newcommand{\P}[]{\unicode{xB6}}
\newcommand{\AA}[]{\unicode{x212B}}
\newcommand{\empty}[]{\emptyset}
\newcommand{\O}[]{\emptyset}
\newcommand{\Alpha}[]{Α}
\newcommand{\Beta}[]{Β}
\newcommand{\Epsilon}[]{Ε}
\newcommand{\Iota}[]{Ι}
\newcommand{\Kappa}[]{Κ}
\newcommand{\Rho}[]{Ρ}
\newcommand{\Tau}[]{Τ}
\newcommand{\Zeta}[]{Ζ}
\newcommand{\Mu}[]{\unicode{x039C}}
\newcommand{\Chi}[]{Χ}
\newcommand{\Eta}[]{\unicode{x0397}}
\newcommand{\Nu}[]{\unicode{x039D}}
\newcommand{\Omicron}[]{\unicode{x039F}}
\DeclareMathOperator{\sgn}{sgn}
\def\oiint{\mathop{\vcenter{\mathchoice{\huge\unicode{x222F}\,}{\unicode{x222F}}{\unicode{x222F}}{\unicode{x222F}}}\,}\nolimits}
\def\oiiint{\mathop{\vcenter{\mathchoice{\huge\unicode{x2230}\,}{\unicode{x2230}}{\unicode{x2230}}{\unicode{x2230}}}\,}\nolimits}
\)
borgbackup is a deduplicating backup software
Installation
Installation
sudo apt install borgbackup
If you want the latest version, you can download a static build from releases or use this backport repo .
Usage
quickstart
Create a repo
borg init
# Create a repo without encryption
borg init --encryption=none ./testrepo
# If you want encryption
borg init --encryption=repokey ./testrepo
Create a backup
borg create
The following will create a backup of ~/src
titled Monday
to the repo ./testrepo
.
borg create --stats --progress ./testrepo::Monday ~/src
Notes
Name placeholders: {now}, {utcnow}, {fqdn}, {hostname}, {user}
Progress shows (O, C, D, N) which correspond to original size, compressed size, deduplicated size, and number of files processed.
Deduplicated size is the additional size consumed on disk after compression and deduplication.
Expand Examples
borg create \
--stats --progress --show-rc \
./testrepo::'{hostname}-daily-{utcnow}' \
/src
Pruning backups
borg prune
If you're scripting daily, weekly, or monthly backups, you'll probably want to prune old backups.
The command below will keep one backup from today, one backup from last week, and one backup from one month.
borg prune --keep-daily 1 --keep-weekly 1 --keep-monthly 1 remote:~/my_backup
See extract
borg extract --progress <archive>
Note that borgbackup 1.1.11
included in Ubuntu 20.04 has a memory leak when using --progress
documented here . Download a newer version of borgbackup.
You should extract to an empty folder since borg does not delete existing files in the target folder.
Scheduling
borgmatic
See https://torsion.org/borgmatic/
Bash Script
Below is a bash script you can call from cron or systemd.
Expand backup.sh
#!/bin/bash
REPOSITORY = "my_server:~/Backups/my_backup"
ARCHIVE_NAME = "{hostname}-{utcnow}"
SOURCE_DIR = "/home/david/"
BACKUP_DIRS =(
"."
)
BORG_CREATE_FLAGS =(
"--stats"
"--progress"
"-x"
"--show-rc"
)
BORG_PRUNE_FLAGS =(
"--keep-daily"
"3"
"--keep-weekly"
"1"
"--keep-monthly"
"1"
# "--stats"
"--list"
"--show-rc"
)
EXCLUSIONS =(
"-e" "System Volume Information"
"-e" "\$RECYCLE.BIN"
)
BORG_EXEC = "borg"
export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK = yes
export BORG_RELOCATED_REPO_ACCESS_IS_OK = yes
LOCKFILE = /tmp/backup_server.lockfile
LOGFILE = /home/david/Documents/server-backup-scripts/my_backup.log
exec { lock_fd} >$LOCKFILE || exit 1
flock -n " $lock_fd " || {
echo "Another instance is running" >& 2
exit 1
}
function send_fail_email {
{
echo From: my_email@gmail.com
echo To: my_gmail@gmail.com
echo Subject: my_backup failed
echo
echo my_backup failed
} | /usr/lib/sendmail -t
exit
}
if [ -d " ${ SOURCE_DIR } " ]
then
# shellcheck disable=SC2015
cd " ${ SOURCE_DIR } " && \
$BORG_EXEC create " ${ BORG_CREATE_FLAGS [@] } " " ${ EXCLUSIONS [@] } " " ${ REPOSITORY } " ::" ${ ARCHIVE_NAME } " " ${ BACKUP_DIRS [@] } " 2 >& 1 | tee " $LOGFILE " &&
$BORG_EXEC prune " ${ BORG_PRUNE_FLAGS [@] } " " ${ REPOSITORY } " | tee -a " $LOGFILE " ||
send_fail_email
fi
Borg vs Restic
Restic is a very similar piece of software which supports backing up to S3-compatible (e.g. S3, Minio, Backblaze B2) storage.
Hosted Services
See https://www.borgbackup.org/support/commercial.html
Resources