selfhosted-apps-docker/borg_backup/readme.md

184 lines
5.2 KiB
Markdown
Raw Normal View History

2020-04-09 22:52:11 +00:00
# BorgBackup in docker
2020-05-18 22:49:18 +00:00
###### guide-by-example
2020-04-09 22:52:11 +00:00
2020-04-25 09:09:46 +00:00
![logo](https://i.imgur.com/dR50bkP.png)
2020-04-09 22:52:11 +00:00
2020-05-06 23:49:16 +00:00
# Purpose & Overview
2020-04-25 09:09:46 +00:00
Backups.
2020-04-09 22:52:11 +00:00
* [Official site](https://www.borgbackup.org/)
* [Github](https://github.com/borgbackup/borg)
2020-05-06 23:49:16 +00:00
Borg is an open source deduplicating archiver with compression and encryption.</br>
Written in python with performance critical code implemented in C/Cython.
Highlight of borg is the deduplication, where files are cut in to variable size
chunks, and only new chunks are stored.
This allows to keep snapshots from several days, weeks and months,
while not wasting disk space.
In this setup borg is installed directly on the host system.</br>
2020-05-07 00:14:43 +00:00
A script is created that backs up the entire docker directory and /etc locally.</br>
Cronjob is set to execute this script daily.
2020-05-06 23:49:16 +00:00
2020-05-07 00:14:43 +00:00
The repository is also pruned on each run of the script -
old archives are deleted while keeping the ones fitting the retention rules
in the script.</br>
One backup per day for last 7 days, last 4 weeks, last 6 months are kept.
# Files and directory structure
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
```
2020-05-01 09:38:43 +00:00
/home/
└── ~/
├── borg/
│ ├── docker_backup/
│ ├── borg_backup.sh
│ └── borg_backup.log
2020-04-25 22:57:10 +00:00
2020-05-01 09:38:43 +00:00
└── docker/
2020-04-25 22:57:10 +00:00
├── container-setup #1
├── container-setup #2
2020-04-25 22:59:40 +00:00
├── ...
2020-04-25 22:57:10 +00:00
```
2020-04-09 22:52:11 +00:00
2020-05-10 01:26:52 +00:00
* `docker_backup/` - borg repository directory containg the backups
2020-05-07 00:02:19 +00:00
* `borg_backup.sh` - the backup script that adds new archive in to the repository
2020-05-07 00:14:43 +00:00
* `borg_backup.log` - log file with the dates of backups
Only `borg_backup.sh` has to be provided.</br>
Repo directory is created by `borg init` command
and the log file is created on the first run.
2020-05-06 23:49:16 +00:00
2020-04-25 09:09:46 +00:00
# The setup
2020-04-16 22:05:54 +00:00
2020-05-06 23:49:16 +00:00
#### Install BorgBackup
2020-04-16 22:05:54 +00:00
2020-05-06 23:49:16 +00:00
Borg is likely in your linux repositories.
2020-04-16 22:05:54 +00:00
2020-05-06 23:49:16 +00:00
#### Create a new borg repo
2020-05-09 15:13:49 +00:00
2020-04-25 22:57:10 +00:00
`mkdir ~/borg`</br>
2020-05-09 15:13:49 +00:00
`sudo borg init --encryption=none ~/borg/docker_backup`
Note the sudo. Borg commands should be run as root, so it can access everything.
2020-04-16 22:05:54 +00:00
2020-05-06 23:49:16 +00:00
#### The backup script
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
`borg_backup.sh`
```bash
#!/bin/bash
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
# INITIALIZE THE REPO WITH THE COMMAND:
# borg init --encryption=none ~/borg/my_backup
# THEN RUN THIS SCRIPT
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
# -----------------------------------------------
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
BACKUP_THIS='/home/bastard/docker /etc'
REPOSITORY='/home/bastard/borg/docker_backup'
LOGFILE='/home/bastard/borg/borg_backup.log'
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
# -----------------------------------------------
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
NOW=$(date +"%Y-%m-%d | %H:%M | ")
echo "$NOW Starting Backup and Prune" >> $LOGFILE
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
# CREATES NEW ARCHIVE IN PRESET REPOSITORY
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
borg create \
$REPOSITORY::'{now:%s}' \
$BACKUP_THIS \
\
--compression zstd \
--one-file-system \
--exclude-caches \
--exclude-if-present '.nobackup' \
--exclude '/home/*/Downloads/' \
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
# DELETES ARCHIVES NOT FITTING KEEP-RULES
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
borg prune -v --list $REPOSITORY \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6 \
--keep-yearly=0 \
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
echo "$NOW Done" >> $LOGFILE
echo '------------------------------' >> $LOGFILE
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
# --- USEFULL SHIT ---
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
# setup above ignores directories containing '.nobackup' file
# make '.nobackup' imutable using chattr to prevent accidental removal
# touch .nobackup
# chattr +i .nobackup
2020-04-09 22:52:11 +00:00
2020-04-25 22:57:10 +00:00
# in the repo folder, to list available backups:
# borg list .
# to mount one of them:
# borg mount .::1584472836 ~/temp
# to umount:
# borg umount ~/temp
# to delete single backup in a repo:
# borg delete .::1584472836
```
2020-04-09 22:52:11 +00:00
2020-05-09 15:13:49 +00:00
The script must be **executabe** - `chmod +x borg_backup.sh`
2020-05-10 01:26:52 +00:00
### Manual run
`sudo ./borg_backup.sh`
2020-05-09 15:13:49 +00:00
It could ask about
*Attempting to access a previously unknown unencrypted repository*</br>
Answer yes, this could be important as the automatic backup would stop at
this question otherwise.
2020-04-09 22:52:11 +00:00
2020-05-10 01:26:52 +00:00
### Automatic execution
Using [cron](https://wiki.archlinux.org/index.php/cron).
**Make sure cron is installed and the service is running**</br>
`sudo systemctl status cronie`
2020-04-25 22:57:10 +00:00
2020-05-10 01:26:52 +00:00
Create a cron job that executes the script
[at 03:00](https://crontab.guru/#0_03_*_*_*)
2020-05-09 15:13:49 +00:00
2020-05-10 01:26:52 +00:00
* switch to root</br>
`su`
* add new cron job</br>
`crontab -e`</br>
`0 3 * * * /home/bastard/docker/nextcloud/nextcloud-backup-script.sh`
2020-05-10 01:32:48 +00:00
`crontab -l` - list current cronjobs</br>
`journalctl | grep cron` - cron history
2020-05-09 15:13:49 +00:00
# Accessing the backup files
2020-05-10 01:26:52 +00:00
* go in to the borg repo</br>
`cd /home/bastard/borg/docker_backup/`
* list the archives</br>
`sudo borg list .`
2020-05-09 15:13:49 +00:00
* choose one by the date, copy its identifier which is epoch time, e.g. 1588986941
2020-05-10 01:26:52 +00:00
* mount it to some folder</br>
`sudo borg mount .::1588986941 /mnt/temp`
2020-05-09 15:13:49 +00:00
* browse the directory where mounted and do whatever is needed
2020-05-10 01:26:52 +00:00
* umount the backup</br>
`sudo borg umount /mnt/temp`
2020-04-25 09:09:46 +00:00
2020-05-07 00:02:19 +00:00
# Extra info
Test your backups, test your recovery procedure.
2020-04-25 09:09:46 +00:00
# Remote backup
2020-04-09 22:52:11 +00:00
2020-04-25 09:09:46 +00:00
Backing up borg repo to a network share or cloud using rclone
2020-04-09 22:52:11 +00:00
2020-04-25 09:09:46 +00:00
*To be continued*