====== 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