====== Borg Backup Client Setup ======
Einrichtung eines Client-Gerätes zur Nutzung von BorgBackup auf [[infrastruktur:host:billy]].
==== Initialisierung: SSH ====
Anmerkung: Ersetze "tux" in folgendem mit deinem Nutzernamen im LDAP.
Erzeuge einen SSH Schlüssel, mit dem dein borg client im Hintergrund später die Backups machen darf:
$ ssh-keygen -f ~/.ssh/id_ed25519_billyborg
Füge willi und billy ähnlich wie folgt in deine ~/.ssh/config hinzu:
**~/.ssh/config**:
Host willi
User tux
Hostname willi.nobreakspace.org
IdentityFile ~/.ssh/id_ed25519_billyborg
Host billyborg
Hostname billy.nobreakspace.org
User tux
IdentityFile ~/.ssh/id_ed25519_billyborg
ProxyCommand ssh -4 willi -o ControlMaster=no -W "[%h]":%p
Nun installiere den public key deines neuen SSH keys auf willi und billi:
$ ssh-copy-id -i ~/.ssh/id_ed25519_billyborg tux@willi.nobreakspace.org
$ cat ~/.ssh/id_ed25519_billyborg.pub | ssh billyborg ssh-add-authorized-keys
==== Initialisierung: Borg Repository ====
Initilisiere dein Borg auf billy:
$ borg init --encryption=keyfile ssh://billyborg/~/home
Exportiere und drucke wie vom obigen "borg init" Befehl empfohlen deinen Borg Schlüssel aus und bewahre ihn und das Passwort sicher und getrennt voneinander auf.
WICHTIG: OHNE DIESE KOMMST DU SPÄTER NICHT MEHR AUF DEINE BACKUPS!
==== Borg Backup Beispiel Script ====
Dies ist ein Beispiel. Hier die BORG_PASSPHRASE anpassen, sowie die excludes.
Möglichst alle größeren oder Binär-Daten, die es eh auch wo anders schon gibt, nicht mit backupen. Deine Linux Distro muss sicherlich nicht komplett gebackupt werden. Auch bei Programmier-Projekten wenn möglich nur den Quellcode backupen.
Dieses Skript kann dann so schon ausgeführt werden (nach einem "chmod +x ~/.local/bin/borg-backup-billy.sh") um Backups von deinem home-Verzeichnis auf billy zu erzeugen. Idealerweise sollte die initiale Ausführung, die evtl. etwas länger dauert, im Space gemacht werden, weil wir nicht die schnellste Internetanbindung im Space haben.
Der zweite, untere Befehle des Skripts löscht redundante Backups und stellt sicher, dass nur eine sinnvolle Anzahl an täglichen/wöchentlichen/monatlichen etc. Backups behalten werden, statt jedes, tägliches zu behalten.
**~/.local/bin/borg-backup-billy.sh**
#!/bin/sh
export BORG_REPO=ssh://billyborg/~/home
export BORG_PASSPHRASE=""
# some helpers and error handling:
info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM
info "Starting backup"
# --dry-run \
borg create \
--verbose \
--filter AME \
--list \
--stats \
--show-rc \
--compression lz4 \
--exclude-caches \
--exclude "${HOME}/borg/logs/" \
--exclude "${HOME}/.cache/" \
--exclude "${HOME}/.ccache/" \
--exclude "${HOME}/.local/share/Trash/" \
--exclude "${HOME}/.electron-gyp/" \
--exclude "${HOME}/.config/Electron/Cache/" \
--exclude "${HOME}/.tmp/" \
--exclude "${HOME}/.mnt/" \
--exclude "${HOME}/.pub-cache/" \
--exclude "${HOME}/.steam/" \
--exclude "${HOME}/Games/" \
--exclude "${HOME}/.android/cache/" \
--exclude "${HOME}/backup/" \
--exclude "${HOME}/Musik/dnb-vids/*.mkv" \
--exclude "${HOME}/Downloads/" \
--exclude "${HOME}/Desktop/" \
--exclude "${HOME}/Videos/" \
--exclude "${HOME}/dev/linux/*.deb" \
--exclude "${HOME}/dev/linux/linux/*.deb" \
--exclude "${HOME}/dev/linux/*.gz" \
--exclude "${HOME}/dev/linux/linux/*.gz" \
--exclude "${HOME}/dev/**/build_dir/" \
--exclude "${HOME}/dev/gluon*/output*/" \
--exclude "${HOME}/dev/gluon-*dl/" \
--exclude "${HOME}/dev/gluon-*dl-old/" \
--exclude "${HOME}/dev/gluon-*dl-old*/" \
--exclude "${HOME}/dev/openwrt-*dl/" \
--exclude "${HOME}/dev/**/__pycache__/**/" \
--exclude "${HOME}/dev/**/build_dir/" \
--exclude "${HOME}/dev/**/staging_dir/" \
--exclude "${HOME}/dev/**/bin/" \
--exclude "${HOME}/dev/**/tmp/" \
--exclude "${HOME}/dev/**/*.o" \
--exclude "${HOME}/dev/**/*.ko" \
--exclude "${HOME}/dev/**/*.mod.c" \
\
::'{hostname}-{now}' \
${HOME}/
backup_exit=$?
info "Pruning repository"
# Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly
# archives of THIS machine. The '{hostname}-' prefix is very important to
# limit prune's operation to this machine's archives and not apply to
# other machines' archives also:
borg prune \
--list \
--prefix '{hostname}-' \
--show-rc \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 6 \
--keep-yearly 10
prune_exit=$?
# use highest exit code as global exit code
global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))
if [ ${global_exit} -eq 1 ];
then
info "Backup and/or Prune finished with a warning"
fi
if [ ${global_exit} -gt 1 ];
then
info "Backup and/or Prune finished with an error"
fi
exit ${global_exit}
==== Automatische Backups per systemd timer ====
$ mkdir -p ~/borg/logs
**~/.config/systemd/user/borg-backup-billy.service**
[Unit]
Description=Borg Backup
Conflicts=shutdown.target
#StartLimitIntervalSec=20h
#StartLimitBurst=5
[Service]
Type=oneshot
ExecStart=%h/.local/bin/borg-backup-billy.sh
Restart=on-failure
RestartSec=30min
StandardOutput=append:%h/borg/logs/borg.log
StandardError=append:%h/borg/logs/borg.err
Nice=15
IOSchedulingClass=best-effort
IOSchedulingPriority=7
**~/.config/systemd/user/borg-backup-billy.timer**
[Unit]
Description=Run Borg Backup daily and on boot
[Timer]
OnBootSec=15min
OnUnitActiveSec=1d
[Install]
WantedBy=timers.target
$ systemctl --user enable borg-backup-billy.timer
$ systemctl --user start borg-backup-billy.timer
(ToDo: war da noch was, um OnBootSec in systemd zu aktivieren? Evtl. "loginctl enable-linger" vom user, der den borg client ausführen soll, damit dieser tatsächlich nach dem boot direkt backups probiert und nicht erst, nachdem der user sich eingeloggt hat?)
Überprüfe, inbesondere auch nach einem Neustart:
$ systemctl --user list-timers
$ systemctl --user status borg-backup-billy.timer
$ systemctl --user status borg-backup-billy.service
Überprüfe auch, ob in ~/borg/logs/borg.err Fehler auftreten. Falls dies der Fall sein sollte, wird borg / systemd dies alle 30 Minuten erneunt versuchen, statt bloß einmal pro Tag. Auslöser hierfür kann auch / oft einfach eine kleine (übersprungene) Datei mit fehlenden Leserechten sein.
==== (Vor)Letzter Check: Backups überprüfen ====
$ borg info ssh://billyborg/~/home
$ borg list ssh://billyborg/~/home
$ mkdir /tmp/borgmount
$ borgfs ssh://billyborg/~/home /tmp/borgmount
Prüfe nun, ob du in /tmp/borgmount/... deine Dateien wieder findest und auslesen kannst. Manchmal kann das Öffnen einer Datei oder Ordners beim ersten Versuch etwas dauern, bis Daten von billy wieder zurück übertragen und gecached wurden.
Zu letzt wieder schließen mit:
$ umount /tmp/borgmount
==== Allerletzter Check: Backups mit ausgedruckten Schlüssel wiederherstellen ====
ToDo