Nextcloud ist inzwischen eine sehr verbreitete Software zur Speicherung von Dateien, Kontakten, Kalendereinträgen und vielem mehr auf einem eigenen Server.

Dieser Beitrag soll die Einrichtung und Verwendung des Nextcloud Clients auf einem Raspberry Pi zur Synchronisierung von Dateien beschreiben.

Installation

Diese Anleitung geht von einem aktuellen Raspbian Buster System aus. Bei älteren Systemen kann es sein, dass einzelne Teile leicht abweichen oder nicht funktionieren werden.

Als erstes installieren wir alle benötigten Abhängigkeiten:

sudo apt update
sudo apt install build-essential git cmake openssl libssl-dev sqlite3 libsqlite3-dev qt5-default libqt5webkit5-dev qttools5-dev qttools5-dev-tools python-sphinx texlive-latex-base inotify-tools qt5keychain-dev doxygen extra-cmake-modules kio-dev

Anschließend laden wir alle benötigten Quellen von GitHub herunter und kompilieren den Nextcloud Client:

cd ~
git clone https://github.com/nextcloud/client_theming.git nextcloud_client
cd nextcloud_client
git submodule update --init
cd client
git submodule update --init
cd ..
mkdir build
cd build
cmake -D OEM_THEME_DIR=pwd/../nextcloudtheme ../client
sed -i 's/Icon=nextcloud/Icon=Nextcloud/g' src/gui/nextcloud.desktop
sed -i 's/Icon\[\(.*\)\]=nextcloud/Icon\[\1\]=Nextcloud/g' src/gui/nextcloud.desktop
make

Das Kompilieren kann (und wird) einige Zeit in Anspruch nehmen. Bei mir waren es auf einem Pi 4 etwa 12 Minuten.

Wenn das Kompilieren erfolgreich war, können wir nun die eigentliche Installation vornehmen:

sudo make install

Wenn wir nun versuchen den Nextcloud Client zu starten erhalten wir diese Fehlermeldung:

nextcloudcmd -v
nextcloudcmd: error while loading shared libraries: libnextcloudsync.so.0: cannot open shared object file: No such file or directory

Diesen Fehler beheben wir wie folgt, wobei nur die Einträge hinzugefügt werden, die noch fehlen:

echo 'LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/arm-linux-gnueabihf' | sudo tee -a /etc/environment
grep '/usr/local/lib/arm-linux-gnueabihf' /etc/ld.so.conf.d/arm-linux-gnueabihf.conf >/dev/null 2>&1 || echo '/usr/local/lib/arm-linux-gnueabihf' | sudo tee -a /etc/ld.so.conf.d/arm-linux-gnueabihf.conf
grep '/usr/local/lib/arm-linux-gnueabihf' /etc/ld.so.conf.d/x86_64-linux-gnu.conf >/dev/null 2>&1 || echo '/usr/local/lib/arm-linux-gnueabihf' | sudo tee -a /etc/ld.so.conf.d/x86_64-linux-gnu.conf
sudo ldconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/arm-linux-gnueabihf

Anschließend können wir den Nextcloud Client aufrufen.

nextcloudcmd -v
nextcloudcmd version 2.3.3

GUI-Client

Der normale grafische Client kann über das Anwendungsmenü oder über ein Terminal mittels nextcloud gestartet werden.

Möchtet ihr den Nextcloud Client automatisch beim Start des Raspberry Pi mit starten lassen (Autostart), dann fügt ihr einfach in der Datei /etc/xdg/lxsession/LXDE/autostart eine Zeile mit @nextcloud hinzu.


CMD-Client

Zusätzlich zu dem GUI-Client gibt es noch den CMD-Client nextcloudcmd. Über diesen kann die Synchronisation über ein Terminal durchgeführt werden und es wird keine grafische Oberfläche benötigt.

Anders als der GUI-Client führt der CMD-Client nur ein mal die Synchronisation durch und beendet sich anschließend wieder. Für eine regelmäßige Synchronisation müssen wir also zum Beispiel einen CRON-Job verwenden.

Der Aufruf des CMD-Clients ist eigentlich ganz einfach:

nextcloudcmd [Optionen] [lokales_Verzeichnis] [Server_URL]

Als Optionen können Benutzername und Passwort mit angegeben werden, was jedoch nicht besonders sicher ist. Besser ist es hier die Option -n zu verwenden, wodurch netrc für den Login beim Server verwendet wird. Netrc ist denkbar einfach. Wir erstellen einfach im Home-Verzeichnis eine Datei namens .netrc, welche den Server, Benutzername und Passwort nach folgendem Muster enthält und passen die Dateirechte an:

nano ~/.netrc
machine mein.server.de
        login benutzername
        password passwort
chmod 0600 ~/.netrc

Hier noch ein Beispiel zur Nutzung des CMD-Clients mit netrc. Das lokale Verzeichnis ist hierbei /var/data/cloud. Vom Server wird die WebDAV-URL benötigt.

nextcloudcmd --non-interactive -n /var/data/cloud/ https://mein.server.de/remote.php/webdav/

Mögliche Parameter für den CMD-Client

ParameterBeschreibung
--user [Name], -u [Name][Name] als Benutzernamen für den Login verwenden.
--password [Passwort], -p [Passwort][Passwort] für den Login verwenden.
-nNetrc (Datei ~/.netrc) für den Login verwenden.
--non-interactiveNicht nachfragen, sondern eine nicht interaktive Ausführung erlauben.
--slient, -sUnterdrückt gesprächige Logmeldungen.
--httpproxy [Proxy]Einen HTTP-Proxyserver nach dem Muster http://server:port verwenden.
--trustAuch ungültigen oder selbst signierten SSL-Zertifikaten vertrauen.
--exclude [Datei]Eine Datei mit einer Liste von Dateien und Verzeichnissen angeben, die nicht vom Client zum Server synchronisiert werden sollen.
--unsyncedfolders [Datei]Eine Datei mit einer Liste von Dateien und Verzeichnissen angeben, die nicht vom Server zum Client synchronisiert werden sollen.
--max-sync-retries [n]Maximale Anzahl an wiederholten Synchronisationsversuchen. Standard ist 3.
-hAuch versteckte Dateien (die mit einem . beginnen) mit Synchronisieren.
--version, -vDie Version des Nextcloud Clients anzeigen und dann beenden.

Automatische Synchronisation mit dem CMD-Client

Für eine automatische Synchronisation mittels CRON-Job erstellen wir uns zuerst ein kleines Bash-Skript unter /home/pi/cloud-sync.sh mit folgendem Inhalt, wobei das lokale Verzeichnis und die Serveradresse, sowie gegebenenfalls die Parameter noch angepasst werden müssen:

#!/bin/bash
LOCAL=/var/data/cloud/
REMOTE=https://mein.server.de/remote.php/webdav/
PARAMS="--non-interactive -n --exclude /home/pi/cloud-sync-exclude.txt"

LOG=/var/log/cloud-sync.log

if [ pgrep -x nextcloudcmd ]; then
  echo "====================" | tee -a $LOG
  date -R | tee -a $LOG
  echo "Cloud-Sync läuft schon!" | tee -a $LOG
  echo "====================" | tee -a $LOG
  exit 1
fi

echo "====================" | tee -a $LOG
date -R | tee -a $LOG
echo "Cloud-Sync gestartet" | tee -a $LOG
echo "====================" | tee -a $LOG

/usr/local/bin/nextcloudcmd $PARAMS $LOCAL $REMOTE 2>&1 | tee -a $LOG

echo "====================" | tee -a $LOG
date -R | tee -a $LOG
echo "Cloud-Sync beendet" | tee -a $LOG
echo "====================" | tee -a $LOG

Diese Datei machen wir dann ausführbar und fügen einen Eintrag in der crontab hinzu.

chmod +x /home/pi/cloud-sync.sh
crontab -e
# [...]
# m h  dom mon dow   command
0 4 * * * /home/pi/cloud-sync.sh >/dev/null &

Hier in dem Beispiel wird die Synchronisation jeden Tag nachts um 4 Uhr gestartet.

Das Ergebnis der Synchronisation kann jederzeit in der Log-Datei /var/log/cloud-sync.log eingesehen werden.

Damit die Log-Datei auch vom Nutzer pi geschrieben werden kann, müssen wir diese noch einmalig anlegen und die Rechte entsprechend anpassen:

sudo touch /var/log/cloud-sync.log
sudo chown pi:pi /var/log/cloud-sync.log

Logrotate einrichten

Damit die Log-Datei /var/log/cloud-sync.log mit der Zeit nicht endlos groß wird und unnötig Speicherplatz belegt legen wir noch eine Konfiguration für Logrotate für diese Datei an.

sudo nano /etc/logrotate.d/cloud-sync
/var/log/cloud-sync.log {
  weekly
  missingok
  rotate 4
  compress
  delaycompress
  notifempty
  create 640 pi pi
}

Mit dieser Konfiguration führt der Logrotate vom System dann wöchentlich eine Rotation der Log-Datei durch, wobei immer die letzten vier Kopien gespeichert werden. Die ältesten drei Kopien werde zudem gepackt um Speicherplatz zu sparen.