Borg Backup
Container image for creating cron scheduled backups with borg backup based on Alpine Linux.
Borg key features
- Space efficient storage through deduplication and compression.
- Fast backup runs and pruning of old backups.
- Encrypted allows backup storage in insecure offsite locations.
- FUSE mount support for easy recovery.
- Focus on local backups. (For cloud backups restic offers more options.)
Security considerations
- This container will run with root priveliges in order to access all data for backup.
- The backup source volume is mounted read-only to avoid alering data by mistake.
- Simplified feature set for sake of simplicity, compared to borgmatic
- py3-llfuse and bash are included for comfort during backup restore and could be potentially removed
- curl is included to push Promethous metrics and could be removed if this functionality is not used
Build
- Alpine and borg version are hard-coded in docker compose so we don't mess up backups due to version upgrades
- Run
docker compose build
to build the container image from ./build/Dockerfile
Installation & Setup
- Configuration:
cp .env.template .env
and adapt .env
(parameters are explained in the template file)
- Init the backup archive:
docker exec --rm -it borg bash -c "borg init --encryption repokey-blake2"
- Start the container:
docker-compose up -d
Preparing for disaster recovery
Very important: The following files MUST be stored along with the backup to enable decryption of the backup data
.env
-file file containing the passphrase
- Keyfiles, stored in ./data/.config/borg/keys/
Backup restore
- Stop the backup container:
docker compose down
- Run an interactive shell:
docker compose -f docker-compose.yml -f docker-compose.restore.yml run borg bash
- Fuse-mount the backup:
borg mount $BORG_REPO <mount_point>
- Restore your files
- Finally unmount and exit:
borg umount <mount_point> && exit
.
Monitoring
- Status and statistics are sent to Prometheus using a simple bash script and curl
Progam flow
/scripts/entry.sh
is called during container startup
and installs the cronjob defined in .env
variable $CRON
- crond starts
/scripts/do-backup.sh
which
- notifies prometheus about the status and stats
- executes borg backup
- prunes and compacts old backups in
Failure handling
- In case Borg fails to create/acquire a lock:
borg break-lock /mnt/repository