Howto: rclone mit Nextcloud-Remote

Auf dem Desktop-Rechner wird man normalerweise den Desktop-Synchronization-Client installieren. Doch was, wenn man headless auf dem Server arbeitet? Dafür bietet sich rclone an.

rclone ist in Go geschrieben und lässt sich als Binary inkl. aller Abhängigkeiten runterladen und installieren. Ich entscheide mich dennoch für die etwas ältere Version, die mit Ubuntu 22.04 installiert wird. Damit muss man sich nicht selbst um Updates kümmern:

sudo apt install rclone

Statt händisch Dateien zu editieren, führt ein rclone config einen durch das Setup:

2024/02/17 11:20:24 NOTICE: Config file "/home/user/.config/rclone/rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> nextcloud           
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
...
31 / Webdav
   \ "webdav"
...

Nach Eingabe von “n” für “new remote” und Eingabe eines Namens für das Remote (ich entscheide mich der Einfachheit halber für “nextcloud”) soll man aus einer langen numerierten Liste einen “Storage type” durch Eingabe der Nummer auswählen. Für Nextcloud ist die Auswahl “webdav” richtig (in dem Beispiel “31”).

Als nächstes wird man nach der URL des Servers gefragt:

URL of http host to connect to.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / Connect to example.com
  \ "https://example.com"
url> https://nextcloud.example.com/remote.php/dav/files/user

Die WebDAV-URL der eigenen Servers findet man in der Nextcloud-Oberfläche durch Klick auf “Dateien-Einstellungen” heraus:

Der Config-Wizard fragt als Nächstes nach dem Typ des WebDAV-Storage, hier wählt man natürlich “nextcloud” aus:

Name of the Webdav site/service/software you are using
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / Nextcloud
   \ "nextcloud"
 2 / Owncloud
   \ "owncloud"
 3 / Sharepoint
   \ "sharepoint"
 4 / Other site/service or software
   \ "other"
vendor> 1

Hat man bei seiner Nextcloud-Installation 2 Faktor-Authentifizierung gewählt (was nebenbei bemerkt eine sehr gute Idee ist!) muss man für rclone ein spezielles App-Passwort generieren lassen. Das Nextcloud-Account-Passwort wird nicht funktionieren.

Das App-Passwort generiert man über die Benutzereinstellungen in der Nextcloud-Oberfläche in dem Abschnitt “Sicherheit – Geräte & Sitzungen”:

Am Besten man wählt einen eindeutigen Bezeichner, der Rückschlüsse auf das eingesetzte Programm (hier “rclone”) und den Rechnernamen zulässt. Dann kann später bei einem Problem das App-Passwort für das Gerät gezielt gelöscht werden:

Bei der Abfrage nach Username/Password wird das Password und das Bearer-Token zunächst leer gelassen:

Nach dem Klick auf “Neues App-Passwort erstellen” wird Username/Passwort einmalig angezeigt. Diese Angaben müssen nun übernommen werden in die rclone-Config, das Bearer-Token kann leer bleiben:

User name
Enter a string value. Press Enter for the default ("").
user> user
Password.
y) Yes type in my own password
g) Generate random password
n) No leave this optional password blank (default)
y/g/n> y
Enter the password:
password:
Confirm the password:
password:
Bearer token instead of user/pass (eg a Macaroon)
Enter a string value. Press Enter for the default ("").
bearer_token> 
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n> 

Zum Abschluß wird der Eintrag in der Config-Datei nochmal angezeigt und man kann mit “y” den Eintrag bestätigen:

Remote config
--------------------
[nextcloud]
url = https://nextcloud.example.com/remote.php/dav/files/user
vendor = nextcloud
user = user
pass = *** ENCRYPTED ***
--------------------
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:

Name                 Type
====                 ====
nextcloud            webdav

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

Ohne weitere Maßnahmen landet das Passwort mehr oder weniger im Klartext in der Datei! Glücklicherweise bietet rclone an, die gesamte Config-Datei mit einem Passwort zu verschlüsseln.

Um nicht später jedesmal das Config-Passwort von Hand eintragen zu müssen, kann man das Passwort komfortable von einem CLI-Passwort-Manager wie pass anlegen und verwalten lassen. Die Konfiguration von pass selbst ist kein Teil dieses Howtos. Nur soviel: In einem andern Terminal kann man sich ein Passwort anlegen und in die Zwischenablage kopieren lassen:

pass generate -n -c rclone-config

Zurück im rclone config – Terminal speichern wir im nächsten Screen mit “s” und “a” das neu generierte Configuration-Passwort:

Current remotes:

Name                 Type
====                 ====
nextcloud            webdav

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> s
Your configuration is not encrypted.
If you add a password, you will protect your login information to cloud services.
a) Add Password
q) Quit to main menu
a/q> a
Enter NEW configuration password:
password:
Confirm NEW configuration password:
password:
Password set
Your configuration is encrypted.

Die Konfiguration ist damit abgeschlossen und der Config-Wizard kann beendet werden.

Damit rclone weiß, wie es an das Config-Passwort kommt, setzen wir z.B. in der ~ /.bashrc die entsprechende Umgebungsvariable:

export RCLONE_PASSWORD_COMMAND="pass rclone-config"

Wenn alles korrekt eingerichtet ist müsste bei einem rclone ls <remote> das Config-Passwort über pass interaktiv abgefragt werden und die Dateien auf der Nextcloud-Instanz in der Ausgabe erscheinen:

rclone ls nextcloud:bilder

Nun kann man rclone benutzen um z.B. Dateien der Nextcloud-Installation regelmäßig lokal zu synchronisieren:

rclone sync nextcloud:bilder /mnt/meine_bilder

“sync” entspricht dabei nicht einem Zwei-Wege-Sync, sondert sorgt dafür, dass eine 1:1 Copy des Remote-Verzeichnisses entsteht und seit dem letzten Sync remote gelöschte Dateien auch lokal gelöscht werden.