Zuletzt geändert am 13. Juni 2020 um 07:36

Borg Backup

Der Artikel ist eher als Notiz für mich gedacht und nicht als Anleitung!


SSH Keys generieren

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa_storagebox
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa_storagebox.
Your public key has been saved in /root/.ssh/id_rsa_storagebox.pub.

Inhalt von ~/.ssh/id_rsa_storagebox.pub in die authorized_keys auf dem Backup Server kopieren.

Die Berechtigungen für den .ssh Ordner auf 0700 setzen und für die authorized_keys auf 0600.


Die Verbindung kann mit folgenden Befehl getestet werden:

sftp -o "IdentityFile=/root/.ssh/id_rsa_storagebox" -P 23 u123456-sub1@u123456.your-storagebox.de

Borg Repository initialisieren

Als Ordner nehme ich die Variable HOSTNAME.

borg init --encryption=repokey ssh://u123456-sub1@u123456.your-storagebox.de:23/./$(hostname)

Jetzt kann man das Passwort für die Repository festlegen. Passwort aufschreiben, sonst kommt man später nicht mehr an die Backup dran!


Initial Backup erstellen

borg create -v --stats \
ssh://u123456-sub1@u123456.your-storagebox.de:23/./$(hostname)::initial \
/ \
--exclude /dev \
--exclude /proc \
--exclude /sys \
--exclude /var/run \
--exclude /run \
--exclude /lost+found \
--exclude /tmp \
--exclude /mnt


Backups auflisten

borg list ssh://u123456-sub1@u123456.your-storagebox.de:23/./$(hostname)


Backups löschen

borg delete ssh://u123456-sub1@u123456.your-storagebox.de:23/./$(hostname)::2020-02-22_10:00

Verzeichnis aus Backup wiederherstellen

In dem Beispiel wird das Verzeichnis /var/www von dem Backup 2020-02-22_10:00 in dem aktuelle Verzeichnis, in dem man sich befindet, wiederhergestellt.

mkdir /opt/backup-restore
cd /opt/backup-restore
borg extract ssh://u123456-sub1@u123456.your-storagebox.de:23/./$(hostname)::2020-02-22_10:00 var/www

Backup Script

mailutils muss auf dem System installiert sein, damit die E-Mail Benachrichtigung funktioniert.


#!/usr/bin/env bash

export BORG_RSH="ssh -i /root/.ssh/id_rsa_storagebox"
export BORG_PASSPHRASE="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

LOG="/var/log/borg/backup.log"
BACKUP_USER="u123456-sub1"
BACKUP_HOST="u123456.your-storagebox.de"
REPOSITORY="ssh://${BACKUP_USER}@${BACKUP_HOST}:23/./$(hostname)"

##
## Write output to logfile
##

if [ ! -d "/var/log/borg/" ]
then
    echo "create log dir ..."
    mkdir -p /var/log/borg/
fi

exec > >(tee -i ${LOG})
exec 2>&1

echo "###### Starting backup on $(date) ######"
echo ""

##
## Create list of installed software
##

dpkg --get-selections > /root/backup/software.list


 
##
## Sync backup data
##

echo "Syncing backup files ..."
echo ""
borg create -v --stats                   \
    $REPOSITORY::'{now:%Y-%m-%d_%H:%M}'  \
    /                                    \
    --exclude /dev                       \
    --exclude /proc                      \
    --exclude /sys                       \
    --exclude /var/run                   \
    --exclude /run                       \
    --exclude /lost+found                \
    --exclude /tmp                       \
    --exclude /mnt

status_backup=$?

if [ $status_backup -eq 0 ]
then
  echo "###### Finished backup on $(date) ######"
else
  echo "###### Failed backup on $(date) ######" >&2
fi
echo ""

##
## Pruning backup data
##

echo "###### Pruning backup on $(date) ######"
echo ""
borg prune -v $REPOSITORY \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6

status_prune=$?

if [ $status_prune -eq 0 ]
then
  echo "###### Pruning finished ######"
else
  echo "###### Pruning failed ######" >&2
fi


##
## Send mail to admin
##
if [ $status_backup -eq 0 ] && [ $status_prune -eq 0 ]
then
  mailx -a "From: "$(hostname)" Backup <"$(hostname)"@meinedomain.de>" -s "Successful Borg Backup | "$(hostname) admin@meinedomain.de < $LOG
else
  mailx -a "From: "$(hostname)" Backup <"$(hostname)"@meinedomain.de>" -s "Failed Borg Backup | "$(hostname) admin@meinedomain.de < $LOG
fi


Cronjob für das Script.

/etc/crontab

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

5 1     * * *   root    /root/backup/borgbackup.sh > /dev/null