Borgbackup
borgbackup is a deduplicating backup software
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
Create a repo
# Create a repo without encryption borg init --encryption=none ./testrepo # If you want encryption borg init --encryption=repokey ./testrepo
Create a backup
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.
Examples
borg create \ --stats --progress --show-rc \ ./testrepo::'{hostname}-daily-{utcnow}' \ /src
Pruning backups
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
Extract
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/
Script
Below is a bash script you can call from cron or systemd.
backup.sh
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: [email protected]
echo To: [email protected]
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