Android Geräte mit Borgbackup sichern

Bei Android Geräten mit externem Speicherplatz über eine microSD Karte kann man seine Backups notfalls auch lokal auf der SD-Karte speichern. Doch was tun, wenn das neue Gerät gar keine Speicherkarte mehr unterstützt oder man auf Nummer sicher gehen möchte? Off-phone Backup aufs NAS mit Borgbackup!

Bisher hatte ich auf meinen Android Smartphones immer "lokale" Backups auf die im Gerät enthaltene microSD Karte gemacht. Dazu habe ich das altbewährte, aber auch schon etwas in die Jahre gekommene TitaniumBackup in Kombination mit root/SuperSU verwendet. Das hat viele Jahre tadellos funktioniert und mich durchaus hin und wieder vor Datenverlust bewahrt. Was ich dabei jedoch nicht ganz bedacht hatte, war die Tatsache, dass bei einem Verlust oder Diebstahl des Handys sowohl die Apps, als auch anderen Daten wie Fotos verloren wären. Aus diesem Grund - und weil mein neues OnePlus Smartphone keinen microSD Slot mehr besitzt - habe ich mich dieses Jahr nach einer neuen Backup-Strategie für mein Android Telefon umgesehen.

Ziele

  • Backup von Apps und App-Daten
  • Backup von Bildern und Dateien
  • Backup von SMS, Kontakten, Einstellungen
  • Backups außerhalb des Android Gerätes speichern (NAS, RaspberryPi, root-Server o.ä.)

Verwendete Komponenten

Screenshot des Borgbackup Logfiles

Umsetzung

Das gesamte Projekt ist leider relativ umfangreich, weshalb ich in dieser Anleitung nicht alle Schritte im kleinsten Deatil beschreiben kann. Den Borgbackup Server hatte ich zum Beispiel bereits eingerichtet, weil ich diesen bereits seit einiger Zeit für die Backups meiner Linux Server und meines Laptops benutze. Wenn entsprechender Bedarf besteht, kann ich gerne weitere Anleitungen für die einzelnen Komponenten zusammenstellen. In diesem Teil konzentrieren wir uns auf die Einrichtung und Konfiguration von Borgbackup unter Android.

Bevor es mit dem eigentlichen Backup Mechanismus losgehen kann, müsst ihr dafür sorgen, dass sämtliche Daten, die ihr sichern möchtet, in einem passenden Format vorliegen, dass ihr im Falle eines Falles auch wieder ohne Problem zurückspielen könnt. Zu diesem Zweck verwende ich die App SMS Backup & Restore, um meine SMS-Nachrichten und die Anruf-Liste lokal auf dem Telefon zu sichern. Als nächstes habe ich meine Messenger-Apps (WhatsApp, Signal, Threema) so konfiguriert, dass sie nächtlich ein lokales Backup der Gesprächsverläufe und Medien (Bilder, Videos, Dateien) machen. Zu guter letzt habe ich als Ersatz für TitaniumBackup die OpenSource App OAndBackupX installiert, um regelmäßig alle meine Apps inklusive der jeweiligen Einstellungen (Accounts, Spielstände, o.ä.) und Daten lokal zu sichern. Für den vollen Funktionsumfang benötigt die OAndBackupX App Root-Zugriff, aber ihr könnt die wichtigsten Funktionen auch ohne Magisk/Root nutzen.

Damit ihr die bisher lokal auf dem Smartphone erstellten Backup-Daten auf off-site auf euren externen Server sicher könnt, benötigt ihr auf eurem Android Gerät eine Linux-Shell mit SSH und Borgbackup. Dazu verwende ich die Android App Termux sowie deren Add-On App Termux API, um den aktuellen Akku-Ladestand sowie den WLAN-Verbindungsstatus abzufragen.

Wenn ihr die beiden Termux Apps installiert habt, könnt ihr mit folgenden Befehlen die für Borgbackup und SSH nötigen Linux-Pakete installieren.

~ $ apt-get update
~ $ apt install moreutils openssh vim
~ $ pkg install termux-api
~ $ pkg install borgbackup
~ $ pkg install rsync

Sobald alle nötigen Pakete installiert sind, könnt ihr auf eurem Borgbackup Server das Repository für euer Smartphone vorbereiten. Falls ihr keinen eigenen Borg-Server betreiben könnt oder wollt, gibt es bei BorgBase auch bezahlbare Hosting-Tarife.

Zuerst erstellt ihr das zukünftige Verzeichnis für das Borg-Repo auf dem Backup-Server:

backup@borgserver:~$ mkdir /backup/phone/andreas-mobil/

Dann erstellt ihr ein neues Borg Repo in diesem Verzeichnis und sichert es am besten zusätzlich mit einem Repo-Key. Den Repo-Key müsst ihr euch für den Notfall zusätzlich irgendwo notieren, am besten in einer Passwortverwaltung wie KeePass oder Bitwarden.

backup@borgserver:~$ borg init -e repokey /backup/phone/andreas-mobil/

Zu guter letzt erstellt ihr auf dem Backup Server als Backup-User in der Datei .ssh/authorized_keys folgenden Eintrag, damit das Android Gerät später per SSH-Key ohne Passwort die Backups auf den Server übertragen kann. Durch den vorangestellten command-Abschnitt wird der Zugriff auf Borg beschränkt, sodass keine anderen Befehle auf dem Backup-Server ausgeführt werden können.

command="borg serve --restrict-to-path /backup/phone/andreas-mobil/" ssh-rsa AAAAB3Nza...EUER..SSH..KEY..IST..LAENGER.. u0_a715@andreas-mobil

Um einen neuen SSH-Key für euer Android Gerät zu generieren und anschließend anzuzeigen könnt ihr folgende Befehle verwenden:

~ $ ssh-keygen
~ $ cat .ssh/id_rsa.pub

Als nächstes benötigt ihr noch das eigentliche Backup-Script, das regelmäßig auf eurem Smartphone ausgeführt wird, um das Backup durchzuführen. Grundsätzlich soll euch das Script als Start bzw. Anhaltspunkt dienen und kann nach belieben erweitert werden. Als ich das Projekt umgesetzt habe, kannte ich das Borgmatic Projekt, das einen Wrapper um Borgbackup bietet, leider noch nicht. Wenn ihr Borg öfter benutzt, ist es auf jeden Fall einen Blick wert! Ich habe das Script auf Android in Termux unter folgendem Pfad abgelegt: /data/data/com.termux/files/home/bin/borgbackup.sh

#!/bin/bash

##
# Repo configurations
##

LOG="/data/data/com.termux/files/home/bin/backup.log"
REPOPATH="/backup/phones/andreas-mobil"
REMOTUSER="backup"
REMOTEHOST="my.borgserver.technik-zeilen.de"
REMOTEPORT="1234"
REPOSITORY="ssh://$REMOTUSER@$REMOTEHOST:${REMOTEPORT}${REPOPATH}
export BORG_PASSPHRASE='Abc123is_a_bad_password!!!'

##
## Cleanup Logfile; Limit to 5000 lines
##

tail -n 5000 $LOG | sponge $LOG

##
## Write output to logfile
##

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

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

##
## check for wifi and power status
##

termux-battery-status | grep "plugged" | grep -q "PLUGGED_"
PLUGGED_RET=$?

termux-wifi-connectioninfo | grep "supplicant_state" | grep -q "COMPLETED"
WIFI_RET=$?

BAT_RET=$(termux-battery-status | grep "percentage" | sed 's/[^0-9]*//g')

if [[ $PLUGGED_RET -ne 0 && $WIFI_RET -eq 0 && $BAT_RET -gt 90 ]]; then
#   echo "No external Power, but WIFI connected and battery above 90 percent."
    sleep 0
elif [[ $PLUGGED_RET -ne 0 || $WIFI_RET -ne 0 || $BAT_RET -lt 40 ]]; then
#   echo "Power or wifi not connected or battery too low."
#   echo "power_ret: $PLUGGED_RET wifi_ret: $WIFI_RET power_perc: $BAT_RET"
    sleep 0
    exit
fi

## Breaks borg lock. Use with caution!
#borg break-lock $REPOSITORY

##
## Prune old backups
##

borg prune -v --list $REPOSITORY --keep-within=1d --keep-daily=7 --keep-weekly=4 --keep-monthly=12

##
## Sync backup data
##

STORAGE="/data/data/com.termux/files/home/storage/shared"

echo "Syncing backup files ..."
borg create --compression lz4 --exclude-caches -v --stats \
    $REPOSITORY::'{now:%Y-%m-%d_%H:%M}'              \
    $STORAGE/OABX_Backups       \
    $STORAGE/Telegram           \
    $STORAGE/Android/media/com.whatsapp \
    $STORAGE/Signal         \
    $STORAGE/MyTinyScan         \
    $STORAGE/zedge          \
    $STORAGE/Threema            \
    $STORAGE/DCIM           \
    $STORAGE/Pictures           \
    $STORAGE/Fuelio         \
    $STORAGE/Documents          \
    /data/data/com.termux/files/home    \
    --exclude /dev                       \
    --exclude /proc                      \
    --exclude /sys                       \
    --exclude /var/run                   \
    --exclude /run                       \
    --exclude /lost+found                \
    --exclude /mnt                       \
    --exclude $STORAGE/DCIM/Fotos1234 \

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

Nachdem ihr die Datei auf euer Android Gerät kopiert habt, müsst ihr zuerst im oberen Teil die Daten zu eurem Borgserver sowie den Repo-Key hinterlegen und im unteren Teil die Pfade anpassen, die ihr gesichert haben möchtet. Bevor ihr das borgbackup.sh dann ausführt, solltet ihr vorher zum Test eine normale SSH-Verbindung zu dem Borgserver herstellen, um den Host-Key zu akzeptieren.

Wenn alles fertig eingerichtet ist und euer erstes manuelles Backup erfolgreich durchgelaufen ist, konnt ihr den Termux Scheduler benutzen, um das Backup-Script ähnlich wie einen Cronjob regelmäßig ausführen zu lassen.

~ $ termux-job-scheduler -s /data/data/com.termux/files/home/bin/borgbackup.sh --period-ms 10800000 --persisted true

Fazit

Ich habe das Setup jetzt schon seit einiger Zeit am laufen und es funktioniert bisher ziemlich gut. Auch ein Restore, den ich ein paar Wochen nach der Einrichtung benötigt habe, hat ohne Probleme funktioniert. Das Script sichert, sofern das Handy am Strom hängt (oder genug geladen ist) und eine WLAN-Verbindung hat, inkrementell alle geänderten Daten auf den Borgserver. Durch den Weg über die SSH-Verbindung funktioniert das Backup auch, wenn man nicht zu Hause ist (z.B. im Hotel), was sehr sehr praktisch ist. Zusätzlich ist der geringe Speicherplatzbedarf auf dem Borgserver hervorzuheben, da man durch die Kompression und Deduplizierung nur etwa zweimal so viel Platz wie die Rohdaten benötigt. Zur Verdeutlichung hier eine aktuelle Speicherplatz Übersicht von Borgbackup auf meinem Smartphone.

Duration: 4 minutes 26.14 seconds
Number of files: 20118
                       Original size      Compressed size    Deduplicated size
This archive:               77.73 GB             74.05 GB             47.35 kB
All archives:                1.38 TB              1.32 TB            187.30 GB

Wer eine zuverlässige Lösung für ein off-site Backup seines Android Gerätes sucht, sollte auf jeden Fall mal einen Blick auf Borgbackup werfen.

Viel Spaß beim Basteln! :-)

Vorheriger Beitrag Nächster Beitrag