Cloudersatz für Dropbox & Co.
Dieses Artikel wurde Ende Januar 2019 komplett überarbeitet. Die Methode zur Synchronisation der Daten wurde hier wesentlich vereinfacht und verbessert.
Wer einen Ersatz für Dropbox und Co. sucht, der landet in der Regel zuerst bei Owncloud oder Nextcloud. Das es auch andere Lösungsansätze gibt, über die man unter Umständen nachdenken sollte, beschreibt dieser Artikel.
Die Synchronisation erfolgt mit Tool Unison sowie einem systemd-Skript. Die Anleitung wird auf einem Archlinux durchgeführt, läuft jedoch praktisch auf jeder Distribution.
Was vorausgesetzt wird, ist ein funktionstüchtiger Server, welcher als Gegenstelle für die Synchronisation dient. Dies kann ein Samba Server mit einem SMB / Cifs Mounts sein oder aber ein entfernter SSH Server, welcher mit Authentifizierung per Zertifikat eingerichtet ist. Theoretisch ist auch ein lokales Ziel möglich. Kurz gesagt, alles was Unison kann, ist hier natürlich ebenfalls realisierbar.
In dieser Anleitung gehen wir davon aus, dass der Benutzer Tux seine lokalen Dokumente auf einen entfernen Server per SSH übertragen möchte. Die Authentifizierung mittels SSH-Zertifikaten ist bereits eingerichtet und funktionstüchtig.
Synchronisation einrichten
Die Synchronisation erfolgt mit Unison. Dieses Programm befindet sich bei allen gängigen Distributionen in den Paketverwaltungen und kann über diese komfotabel installiert werden. Bei Arch erfolgt die Installation wie folgt:
sudo pacman -S unison
Ist das Programm installiert, erfolgt die Konfiguration. Im Homeverzeichnis des Benutzers existiert ein verstecktes Verzeichnis .unison, in welchen für jede Konfigurationseinstellung eine entsprechende Einstellungsdatei abgelegt werden können. Auch werden später dort die Differnezdateien gespeichert.
Das systemd-Skript
Als nächstes erzeugen wir unser systemd Skript, welches uns dann die Möglichkeit gibt, das Ganze automatisch als Hintergrundjob starten zu lassen. In meinen Fall nenne ich die Datei startSync.service
und lege diese im Verzeichnis /etc/systemd/system
ab.
[Unit]
Description=Startet die Synchronisation
Requires=network.target
After=network.target
Conflicts=umount.target
Before=umount.target shutdown.target
DefaultDependencies=no
[Service]
Type=oneshot
User=tux
Group=tux
ProtectHome=off
RemainAfterExit=true
#ExecStartPre=/usr/bin/sleep 15
ExecStart=/bin/bash -c '/usr/bin/unison -batch -auto -times -silent -sshargs "-C -i /home/tux/.ssh/id_ecdsa" -force newer -repeat watch /home/Tux/Documents ssh://remote_user@remote_server//home/Tux/Documents &'
ExecStop=/usr/bin/killall -HUP unison
[Install]
WantedBy=multi-user.target
Es wurden hier bewusst alle Parameter für Unison in die Befehlszeile geschrieben. Das Problem ist, wenn man mit einer Einstellungsdatei arbeitet und den Parameter watch verwendet, dann gibt es hier einen Fehler, dass der Parameter für die Einstellungsdatei nicht richtig erkannt wird.
Bevor wird das Skript jedoch das erste mal starten, machen wir die erste Synchronisation per Hand. Hierzu führen wir den Befehl direkt in der Bash aus, ohne die Parameter für den automatischen Betrieb. Das schaut dann wie folgt aus:/usr/bin/unison -times -sshargs "-C -i /home/tux/.ssh/id_ecdsa" /home/Tux/Documents ssh://remote_user@remote_server//home/Tux/Documents
Es erfolgt nun eine Synchronisation, bei der eine Abfrage erfolgt, wie die Daten synchronisiert werden soll. Durch das Drücken das Taste h erhält man eine Hilfe, was die verschiedenen Tasten bewirken.
Den Daemon starten
Ist die manuelle Synchronisation ohne Probleme beendet und hat man alle “Probleme” gelöst, so kann man den Daemon starten und auch für die Zukunft automatisch starten lassen. Bei meinem Beispiel sind das drei Befehle:
systemctl daemon-reload
systemctl start syncJob
systemctl enable syncJob
Anschließend kann man noch prüfen, ob der Dienst auch sauber läuft. Dies geschieht mit folgendem Befehl:
systemctl status syncJob
Läuft der Dienst ist alles gut, wenn nicht, so muss man den Fehler suchen. Entweder sieht man in der Ausgabe bereits etwas oder man muss im Log weiter suchen. Eine gute Hilfe ist der Befehl journalctl -xe
.
Erweiterungen
Möchte man mehrere Synchronisationen starten, so kann man in das Skript mehrere ExecStart-Befehle einführen. Somit laufen dann mehrere Synchronisationen parallel.
Die auskommentierte Befehlszeile mit dem sleep
ist dann sinnvoll, wenn man warten möchte, bis auch eine saubere Netzwerkverbindung vorhanden ist. Ich hatte hier immer wieder Probleme und konnte diese mit dieser Zeile einfach umgehen.
Bekannte Probleme
Aktuell ist ein Problem bekannt, welches auftritt, wenn man mit zwei oder mehreren Systemen gleichzeitig arbeitet und in einem Verzeichnis Daten verschiebt. Hierbei kann es passieren (jedoch nicht immer) das durch die parallele Synchronisation die Daten gelöscht werden. Die Lösung dieses Problems ist simpel. Entweder die Dateien kopieren und danach löschen. Das funktioniert und umgeht das Problem. Alternativ einfach nicht gleichzeitig mit mehreren Systemen arbeiten. ;-)