File-Server mit Synchronisation einrichten (SeaFile)

Mit einem synchronisierenden Dateisystem erhält man das Beste aus einer zentralen und dezentralen Dateiverwaltung. Man muss kaum Kompromisse eingehen für Performance und Vefügbarkeit. Dateien liegen sowohl auf dem Server und auch als Kopie bei jedem Client bereit (womit offline arbeiten möglich ist). Anwender verwenden Dateien wie gewöhnlich lokal und die Magie findet im Hintergrund statt.

Ich benötige diese Art der Dateiverwaltung für Dateien wie Dokumente oder Bilder. Es ist wichtig darauf Zugriff zu haben auch wenn man offline ist. Daher sollen diese auf jedem PC vorliegen. Um hohen Aufwand beim Synchronisieren zu verhindern wird eine Software benötigt die den Datenabgleich vollautomatisiert erledigt.

Dieser Artikel ist Bestandteil der Artikelserie "Home Server mit dem Raspberry Pi". Zum Inhaltsverzeichnis gelangt ihr hier.

Anforderung

Neben einem gewöhnlichen FileServer (ohne Synchronisation) benötige ich einen FileServer der seine Daten zentral verwaltet und dezentral zu Verfügung stellt. Damit meine ich das auf dem Server alle Daten zentral vorliegen. Die Clients sollen aber nicht wie bei einem zentralen Datei-Server über das Netzwerk auf diese zugreifen, sondern lokal (wie bei Dropbox).
Wenn auf dem eigenen PC eine Datei verändert, gelöscht oder hinzugefügt wird, soll dieser Zustand mit dem Server synchronisiert werden. Anschließend erhalten alle anderen PC's automatisch den aktuellen Stand vom Server mit den letzten Änderungen.

Für das Raspberry  gibt es drei populäre Dropbox-ähnliche Cloud-Dienste: OwnCloud, NextCloud und Seafile (NextCloud ist eine Weiterentwicklung von OwnCloud).

Achtung: Die nachfolgenden Aussagen zu OwnCloud/NextCloud habe ich ausschließlich durch Recherche in Erfahrung gebracht. Ich habe nie einen Praxistest von diesen durchgeführt.

OwnCloud ist die Eierlegende Wollmilchsau. Es kann alles, aber nichts davon so richtig gut. Es vereint mehrere Aufgaben in einem Programm wie Dateiverwaltung, CalDav und CardDav (und noch mehr). Mein einziger Anspruch ist allerdings die Dateiverwaltung, alle anderen Features sind nicht relevant. Ohne das ich es je getestet hatte (aber nach vielen Recherchen) soll diese Funktion von OwnCloud auf dem Raspberry sehr träge und nicht resourcenschonend sein. Mein Entschluss war, das OwnCloud keine Alternative für mein Pi darstellt.

Seafile

Seafile ist spezialisiert auf die Dateiverwaltung (wie Dropbox) und macht seine Aufgabe sehr gut, außerdem benötigt es nur wenig Resourcen auf dem Pi.

Achtung: Da ich Seafile nur im lokalen Netz betreiben werde, ohne Zugang von außen, verzichtet auch diese Anleitung auf den Sicherheits-SchnickSchnack.

SQL-Server einrichten (MySQL)

Seafile benötigt als Datenbank SQLite oder MySQL.
Die Entwickler empfehlen deutlich MySQL zu verwenden, da SQLite Nachteile gegenüber MySQL hat (z.B. kann Seafile unter MySQL während des Betriebs, ohne Pausierung, ein Upgrade erhalten, auch die Performance ist hier besser). Das Einrichten ist bei SQLite allerdings einfacher da kein SQL-Server benötigt wird.

Leider wird PostgreSQL offiziell nicht/teilweise unterstützt (was meine bevorzugte Technik gewesen währe).

Damit Seafile mit MySQL betriebsfähig ist, muss ein MySQL-Server vor der Einrichtung von Seafile erstellt werden.

MySQL installieren

Installiert MySQL mit unten stehendem Befehl. Beim Installieren werdet ihr nach einem Passwort für den Root-User für MySQL gefragt.

sudo apt-get install mysql-server

Wenn obiger Befehl fehlschlägt könnt ihr noch folgendes ausprobieren:

sudo apt-get install mysql-server --fix-missing --fix-broken

Danach kann man überprüfen ob der SQL-Server erfolgreich installiert wurde und bereits in Betrieb ist.

mysqladmin -u root -p status

Optional (wenn benötigt) kann ein MySQL-Client für das Terminal installiert werden (wird nicht von Seafile gebraucht). Ich habe dies nicht getan.

sudo apt-get install mysql-client

MySQL Daten auf USB-Platte auslagern

Der MySQL-Server sollte sich nun auf die SD-Karte installiert haben. Zukünftige Datenbanken werden automatisch auch auf die SD-Karte gepackt. Ich bevorzuge es allerdings das Bewegungsdaten auf die USB-Platte kommen, da ich von dieser häufiger ein Backup durchführen werde (zudem steht dort mehr Speicherplatz zur Verfügung).

In folgenden Schritten wird MySQL mitgeteilt wohin Daten zukünftig gespeichert werden.

1. Zuerst muss der SQL-Server angehalten werden:

sudo service mysql stop

2. Erstellt auf der USB-Platte ein Verzeichnis in welchem in Zukunft die SQL-Daten liegen werden:

#Create new directory
cd /media/pidisk1
sudo mkdir mysql

#Set directory permission
sudo chown -R mysql:mysql /media/pidisk1/mysql

3. Nun müsst ihr die bestehenden Daten von mySQL in den neuen Ordner kopieren. Dafür sind Root-Rechte nötig. Außerdem müssen alle Dateien dem mysql-User zugewiesen sein:

sudo su -
cp -Rv /var/lib/mysql/* /media/pidisk1/mysql/
sudo chown -R mysql:mysql /media/pidisk1/mysql

Optional könnt ihr den alten Ordner umbenennen damit dieser nicht aus Versehen verwendet wird:

mv /var/lib/mysql /var/lib/mysql.backup

4. Ändert nun die Konfiguration von mySQL damit dieser auch weiß in welchen Ordner zukünftig gespeichert werden soll:

sudo nano /etc/mysql/my.cnf

Dort bitte den Eintrag suchen welcher mit datadir beginnt und folgend abändern:

#Before
datadir                = /var/lib/mysql

#After
datadir                = /media/pidisk1/mysql

5. Verlasst den root-Modus und startet den SQL-Server wieder:

exit
sudo service mysql start

MySQL-User für Seafile anlegen

Seafile bietet ein Setup, welches einen SQL-User und passende Tabellen anlegt. Ihr könnt diesem Setup allerdings auch mitteilen das Seafile bestehende Tabellen verwenden soll (dies wird z.B. benötigt wenn ein Backup eingespielt wird oder wenn mySQL ein zweites Seafile beherbergen soll).

Wenn Ihr keine bestehende Datenbank verwenden möchtet (sondern Seafile alles erledigen soll) könnt Ihr direkt zu Seafile installieren weitergehen und den mySQL-Part überspringen (klick dafür hier).

Wenn Ihr einen neuen User extra für Seafile in SQL anlegt, könnt Ihr genau definieren was Seafile darf. Seafile wird drei Tabellen benötigen und auf diese erhält es dann auch Vollzugriff. Alles Andere wird dem Tool verboten.

Dazu müssen wir uns erstmal als Root bei MySQL anmelden (mit dem Passwort welches bei der Installation von MySQL festgelegt wurde):

mysql -u root -p

Anschließen können wir auch schon den neuen User erzeugen (bitte das letzte Argument 'Password' mit dem echten austauschen):

CREATE USER 'seafile'@'localhost' IDENTIFIED BY 'Password';

Um zu prüfen welche User bereits hinterlegt sind reicht folgender Befehl.

SELECT User,Host FROM mysql.user;

Tabellen anlegen und Rechte zuweisen

Nun hat der User allerdings noch keine Rechte. Ich möchte dem User seafile auch gar keine Rechte außer Vollzugriff auf die Tabellen die Seafile benötigt geben. Um das zu realisieren müssen wir manuell die Tabellen für Seafile erstellen.

Erstellen der von Seafile benötigten Tabellen:

create database `ccnet-db` character set = 'utf8';
create database `seafile-db` character set = 'utf8';
create database `seahub-db` character set = 'utf8';

Dem User seafile Vollzugriff auf genau diese Tabellen geben:

GRANT ALL PRIVILEGES ON `ccnet-db`.* to `seafile`@localhost;
GRANT ALL PRIVILEGES ON `seafile-db`.* to `seafile`@localhost;
GRANT ALL PRIVILEGES ON `seahub-db`.* to `seafile`@localhost;

FLUSH PRIVILEGES;

Übrigens kann man dies auf der offiziellen Doku nachlesen: manual.seafile.com/deploy/using_mysql.html.

Um zu sehen welche Rechte ein bestehender SQL-User hat, kann man folgendes Kommando feuern:

SHOW GRANTS FOR 'seafile'@'localhost';

Seafile installieren und einrichten

Pakete installieren

Folgende Kommandos installieren alle nötigen Pakete die SeaFile benötigt.

sudo apt-get install python2.7 python-setuptools python-simplejson python-imaging python-mysqldb

User anlegen

Unter Linux ist es üblich je Programm einen separaten Linux-User anzulegen. Das Programm wird dann von diesem Benutzer ausgeführt (dadurch ist eine feinere Rechtesteuerung möglich). Zudem kann man die Programmdaten in dessen User's Home-Verzeichniss legen (womit es gut aufgeräumt ist).

sudo adduser seafile --disabled-login

Der eben erzeugte User kann sich nicht unter Linux anmelden, da dies mit --disabled-login deaktiviert wurde (beim Anmeldeversuch erscheint zwar die Passwortaufforderung aber es gibt kein gültiges Passwort). Da unter diesem User nur das Programm ausgeführt werden soll ist ein normaler Login unnötig und würde nur eine Sicherheitslücke darstellen.

Der Admin kann allerdings mit einem Trick zum Seafile-User wechseln. Dazu gibt er folgenden Befehl ein:

sudo su seafile

So kann man unter Linux gut steuern unter welchen Rechten ein Programm laufen darf.

SeaFile downloaden

Wechselt zuerst in das Home-Verzeichnis des seafile Users.

cd ~

Geht auf die offiziele Seite von SeaFile seafile.com/en/download und sucht euch den Link zum letzten Release. Ich hatte die Version 6.0.7.

// Download
wget https://github.com/haiwen/seafile-rpi/releases/download/v6.0.7/seafile-server_6.0.7_stable_pi.tar.gz
// Entpacken
tar -xvf seafile-server_6.0.7_stable_pi.tar.gz
// (optional) Löschen des Packets
rm seafile-server_6.0.7_stable_pi.tar.gz

Seafile installieren

Seafile bringt ein paar Setups mit die beim Installieren helfen. Mit ./setup-seafile.sh könnte man das Setup ausführen allerdings wird dort nur SqlLite untersützt. Wenn man MySQL verwenden möchte muss man ./setup-seafile-mysql.sh aufrufen.

Vor dem Setup muss die IP-Adresse notiert werden (mit ifconfig). Zudem muss überlegt werden wo die Daten von SeaFile später gespeichert werden sollen. Bei mir wird alles auf der externen Festplatte verewigt. Daher muss dort erstmal ein Verzeichnis angelegt werden.
Wenn ihr außerhalb des Home-Verzeichniss Seafile-daten anlegen möchtet muss der Kontext von Benutzer seafile mit dem Befehl exit verlassen werden.

exit
sudo mkdir /media/pidisk1/seafile
sudo mkdir /media/pidisk1/seafile/data
sudo chown -R seafile:seafile /media/pidisk1/seafile

Über einen Symlink im Home-Verzeichnis soll Seafile darauf verwiesen werden. Den Symlink legt man folgenderweiße an. Zuvor solltet ihr aber wieder zum User seafile und dessen Home-Verzeichnis wechseln.

sudo su seafile
cd ~
ln -s /media/pidisk1/seafile/data seafile-data

Der letzte Parameter (seafile-data) gibt den Symlink-Ordnernamen an.

Nun könnt ihr das Setup starten. Der einzige Punkt bei dem man aufpassen muss ist der ob eine Datenbank erstellt werden soll oder eine bestehende verwendet wird.
Ich hatte dem Script das Erstellen der Datenbank überlassen.

Meine Konfiguration des Assistenten sah folgend aus:

server name: seafile
server ip/domain: 192.168.***.***

seafile data dir: /home/seafile/seafile-data/data
fileserver port: 8082

database: create new
ccnet database: ccnet-db
seafile database: seafile-db
seahub database: seahub-db
database user: seafile

Das Script befindet sich in dem entpackten Verzeichnis (dessen Name ändert sich je Release). Also wechseln wir dort hin (mit ls -l könnt ihr prüfen wie euer Verzeichnis heißt):

cd seafile-server-6.0.7

Danach bitte euer Setup der Wahl aufrufen (ich habe das für mysql verwendet):

# Setup for sqlite
./setup-seafile.sh

# Setup for mysql
./setup-seafile-mysql.sh

Bitte entnehmt der obigen Tabelle die Konfiguration des Setups.

Nach dem Setup prüfen wir ob Seafile korrekt installiert wurde und starten sowohl Seafile als auch Seahub:

./seafile.sh start
./seahub.sh start-fastcgi

Das Raspberry sollte nun zeigen das beide Dienste erfolgreich gestartet wurden. Allerdings wird man beim starten von seahub.sh zusätzlich gebeten einen Seahub-Admin einzurichten.

Wenn Ihr Seafile beenden möchtet reichen folgende zwei Befehle:

./seafile.sh stop
./seahub.sh stop

Achtet darauf das Seafile immer vom User seafile gestartet wird und nicht vom pi-User. Ist man mit dem pi-User angemeldet kann man dies mit folgenden Kommandos realisieren:

sudo su seafile /home/seafile/seafile-server-latest/seafile.sh start
sudo su seafile /home/seafile/seafile-server-latest/seahub.sh start-fastcgi

Achtung: Bei  mir (das Raspberry B der ersten Generation) kann man nicht direkt mit Seafile arbeiten. Anscheinend dauert es nach dem Starten noch eine Zeit bis es funktionstüchtig ist.

Seafile verwenden

Nachdem Seafile nun erfolgreich installiert wurde kann vom Client aus über einen Browser mit der Adresse "http://Ip-Address:8000" zugegriffen werden.

Habt Ihr Probleme beim Zugriff auf Seafile dann versucht mal euer Pi neu zu starten und/oder das ./seahub.sh ohne fastcgi zu starten (./seahub sh start).
Ansonsten habt etwas Geduld und versucht mehrfach einen Page-Refresh.

Web-Server einrichten (Nginx)

Möchte man über das Internet via https auf Seafile zugreifen muss man einen Web-Server wie Nginx installieren (Nginx soll auf dem Pi eine bessere Performance liefern wie Apache). Da ich nur den Anspruch habe im lokalen Netzwerk damit zu arbeiten wird dieser bei mir nicht eingerichtet.

Bitte betreibt Seafile niemals ohne https über das Internet!

Hier die Anleitung des Herstellers: manual.seafile.com/deploy/deploy_with_nginx.html

Seafile beim boot starten

Soll Seafile automatisch beim Start des Raspberries verfügbar sein, hilft euch die Anleitung des Herstellers:

https://manual.seafile.com/deploy/start_seafile_at_system_bootup.html

 Weitere geht's ...

Die Artikelserie „Home Server mit dem Raspberry Pi“ geht jetzt mit dem Thema SourceControl mit git weiter.