{"id":350,"date":"2016-09-22T10:19:31","date_gmt":"2016-09-22T08:19:31","guid":{"rendered":"http:\/\/blog.rollnut.com\/?p=350"},"modified":"2019-03-29T23:02:05","modified_gmt":"2019-03-29T21:02:05","slug":"cloud-seafile","status":"publish","type":"post","link":"http:\/\/blog.rollnut.com\/cloud-seafile\/","title":{"rendered":"File-Server mit Synchronisation einrichten (SeaFile)"},"content":{"rendered":"

Mit einem synchronisierenden Dateisystem erh\u00e4lt man das Beste aus einer zentralen und dezentralen Dateiverwaltung. Man muss kaum Kompromisse eingehen f\u00fcr Performance und Vef\u00fcgbarkeit. Dateien liegen sowohl auf dem Server und\u00a0auch als Kopie bei jedem Client bereit (womit offline arbeiten m\u00f6glich ist). Anwender verwenden Dateien wie gew\u00f6hnlich lokal und die Magie findet im Hintergrund statt.<\/p>\n

Ich ben\u00f6tige diese Art der Dateiverwaltung f\u00fcr 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\u00f6tigt die den Datenabgleich vollautomatisiert erledigt.<\/p>\n

Dieser Artikel ist Bestandteil der Artikelserie \"<\/strong>Home Server mit dem Raspberry Pi\"<\/strong>. Zum Inhaltsverzeichnis gelangt ihr hier<\/a>.<\/p>\n

Anforderung<\/h1>\n

Neben einem gew\u00f6hnlichen FileServer<\/a> (ohne Synchronisation) ben\u00f6tige ich einen FileServer der seine Daten zentral verwaltet und dezentral zu Verf\u00fcgung stellt. Damit meine ich das auf dem Server alle Daten zentral vorliegen. Die Clients sollen aber nicht wie bei einem zentralen Datei-Server \u00fcber das Netzwerk auf diese zugreifen, sondern lokal (wie bei Dropbox).
\nWenn auf dem eigenen PC eine Datei ver\u00e4ndert, gel\u00f6scht oder hinzugef\u00fcgt wird, soll dieser Zustand mit dem Server synchronisiert werden. Anschlie\u00dfend erhalten alle anderen PC's automatisch den aktuellen Stand vom Server mit den letzten \u00c4nderungen.<\/p>\n

F\u00fcr das Raspberry\u00a0 gibt es drei popul\u00e4re Dropbox-\u00e4hnliche Cloud-Dienste:\u00a0OwnCloud, NextCloud<\/strong> und Seafile\u00a0<\/strong>(NextCloud ist eine Weiterentwicklung von OwnCloud).<\/p>\n

Achtung:<\/strong> Die nachfolgenden Aussagen zu OwnCloud\/NextCloud habe ich ausschlie\u00dflich durch Recherche in Erfahrung gebracht. Ich habe nie einen Praxistest von diesen durchgef\u00fchrt.<\/em><\/p>\n

OwnCloud<\/strong> 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<\/strong> auf dem Raspberry sehr tr\u00e4ge und nicht resourcenschonend sein. Mein Entschluss war, das OwnCloud<\/strong> keine Alternative f\u00fcr mein Pi darstellt.<\/p>\n

Seafile<\/h1>\n

Seafile ist spezialisiert auf die Dateiverwaltung (wie Dropbox) und macht seine Aufgabe sehr gut, au\u00dferdem ben\u00f6tigt es nur wenig Resourcen auf dem Pi.<\/p>\n

Achtung:<\/strong> Da ich Seafile nur im lokalen Netz betreiben werde, ohne Zugang von au\u00dfen, verzichtet\u00a0auch diese Anleitung auf den Sicherheits-SchnickSchnack.<\/em><\/p>\n

SQL-Server\u00a0einrichten (MySQL)<\/h2>\n

Seafile ben\u00f6tigt als Datenbank\u00a0SQLite<\/strong> oder MySQL<\/strong>.
\nDie Entwickler empfehlen deutlich MySQL<\/strong> zu verwenden, da SQLite<\/strong>\u00a0Nachteile gegen\u00fcber MySQL<\/strong> hat (z.B. kann Seafile unter\u00a0MySQL<\/strong> w\u00e4hrend des Betriebs, ohne Pausierung, ein Upgrade erhalten, auch die Performance ist hier besser). Das Einrichten ist bei SQLite allerdings einfacher da\u00a0kein SQL-Server ben\u00f6tigt wird.<\/p>\n

Leider wird PostgreSQL<\/strong> offiziell\u00a0nicht\/teilweise unterst\u00fctzt<\/a>\u00a0(was meine bevorzugte Technik gewesen w\u00e4hre).<\/em><\/p>\n

Damit Seafile mit\u00a0MySQL<\/strong> betriebsf\u00e4hig ist, muss ein MySQL<\/strong>-Server vor der Einrichtung von Seafile erstellt werden.<\/p>\n

MySQL installieren<\/h3>\n

Installiert MySQL\u00a0mit unten stehendem Befehl. Beim Installieren werdet ihr nach einem Passwort f\u00fcr den Root-User f\u00fcr MySQL gefragt.<\/p>\n

sudo apt-get install mysql-server<\/pre>\n

Wenn obiger Befehl fehlschl\u00e4gt k\u00f6nnt ihr noch folgendes ausprobieren:
\n<\/em><\/p>\n

sudo apt-get install mysql-server --fix-missing --fix-broken<\/pre>\n

Danach kann man \u00fcberpr\u00fcfen ob der SQL-Server erfolgreich installiert wurde und bereits in Betrieb ist.<\/p>\n

mysqladmin -u root -p status<\/pre>\n

Optional (wenn ben\u00f6tigt)\u00a0kann ein MySQL-Client f\u00fcr das Terminal installiert werden (wird nicht von Seafile gebraucht). Ich habe dies nicht getan.<\/em><\/p>\n

sudo apt-get install mysql-client<\/pre>\n

MySQL Daten auf USB-Platte auslagern<\/h3>\n

Der MySQL<\/strong>-Server sollte sich nun auf die SD-Karte installiert haben. Zuk\u00fcnftige Datenbanken werden automatisch auch auf die SD-Karte gepackt.\u00a0Ich bevorzuge es allerdings das Bewegungsdaten auf die USB-Platte kommen, da ich von dieser h\u00e4ufiger ein Backup durchf\u00fchren werde (zudem steht dort mehr\u00a0Speicherplatz zur Verf\u00fcgung).<\/p>\n

In folgenden Schritten wird MySQL<\/strong> mitgeteilt\u00a0wohin Daten zuk\u00fcnftig gespeichert werden.<\/p>\n

1.<\/strong> Zuerst muss der SQL-Server angehalten werden:<\/p>\n

sudo service mysql stop<\/pre>\n

2.<\/strong> Erstellt auf der USB-Platte ein Verzeichnis\u00a0in welchem in Zukunft die SQL-Daten liegen werden:<\/p>\n

#Create new directory\r\ncd \/media\/pidisk1\r\nsudo mkdir mysql\r\n\r\n#Set directory permission\r\nsudo chown -R mysql:mysql \/media\/pidisk1\/mysql<\/pre>\n

3.<\/strong> Nun m\u00fcsst ihr\u00a0die bestehenden Daten von mySQL in den neuen Ordner kopieren. Daf\u00fcr sind Root-Rechte n\u00f6tig. Au\u00dferdem m\u00fcssen alle Dateien dem mysql<\/strong>-User zugewiesen sein:<\/p>\n

sudo su -\r\ncp -Rv \/var\/lib\/mysql\/* \/media\/pidisk1\/mysql\/\r\nsudo chown -R mysql:mysql \/media\/pidisk1\/mysql\r\n<\/pre>\n

Optional k\u00f6nnt ihr\u00a0den alten Ordner\u00a0umbenennen damit dieser nicht aus Versehen verwendet wird:<\/em><\/p>\n

mv \/var\/lib\/mysql \/var\/lib\/mysql.backup<\/pre>\n

4.<\/strong> \u00c4ndert nun die Konfiguration von mySQL damit dieser auch wei\u00df in welchen Ordner zuk\u00fcnftig gespeichert werden soll:<\/p>\n

sudo nano \/etc\/mysql\/my.cnf\r\n<\/pre>\n

Dort bitte den Eintrag suchen welcher mit datadir<\/strong> beginnt und\u00a0folgend ab\u00e4ndern:<\/p>\n

#Before\r\ndatadir                = \/var\/lib\/mysql\r\n\r\n#After\r\ndatadir                = \/media\/pidisk1\/mysql<\/pre>\n

5.<\/strong> Verlasst den root<\/strong>-Modus und startet den SQL-Server wieder:<\/p>\n

exit\r\nsudo service mysql start<\/pre>\n

MySQL-User f\u00fcr Seafile anlegen<\/h3>\n

Seafile bietet ein Setup, welches einen SQL-User und passende Tabellen anlegt.\u00a0Ihr k\u00f6nnt diesem Setup allerdings auch mitteilen das Seafile bestehende Tabellen verwenden soll (dies wird z.B. ben\u00f6tigt wenn ein Backup eingespielt wird oder wenn mySQL ein zweites Seafile beherbergen soll).<\/p>\n

Wenn Ihr keine bestehende Datenbank verwenden m\u00f6chtet (sondern Seafile alles erledigen soll) k\u00f6nnt Ihr direkt zu Seafile installieren<\/strong> weitergehen und den mySQL-Part \u00fcberspringen (klick daf\u00fcr hier<\/a>).<\/p>\n

Wenn Ihr einen neuen User extra f\u00fcr Seafile in SQL anlegt, k\u00f6nnt Ihr genau definieren was Seafile darf. Seafile wird drei Tabellen ben\u00f6tigen und auf diese erh\u00e4lt es dann auch Vollzugriff. Alles Andere wird dem Tool verboten.<\/p>\n

Dazu m\u00fcssen wir uns erstmal als Root bei MySQL<\/strong> anmelden (mit dem Passwort welches bei der Installation von MySQL festgelegt wurde):<\/p>\n

mysql -u root -p<\/pre>\n

Anschlie\u00dfen k\u00f6nnen wir auch schon den neuen User erzeugen (bitte das letzte Argument 'Password<\/em>' mit dem echten austauschen):<\/p>\n

CREATE USER 'seafile'@'localhost' IDENTIFIED BY 'Password';<\/pre>\n

Um zu pr\u00fcfen welche User bereits hinterlegt sind reicht folgender Befehl.<\/em><\/p>\n

SELECT User,Host FROM mysql.user;<\/pre>\n

Tabellen anlegen und\u00a0Rechte\u00a0zuweisen<\/h3>\n

Nun hat der User allerdings noch keine Rechte. Ich m\u00f6chte dem User seafile<\/em> auch gar keine Rechte au\u00dfer Vollzugriff auf die Tabellen die Seafile ben\u00f6tigt geben.\u00a0Um das zu realisieren m\u00fcssen wir manuell die Tabellen f\u00fcr Seafile erstellen.<\/p>\n

Erstellen der von Seafile ben\u00f6tigten Tabellen:<\/p>\n

create database `ccnet-db` character set = 'utf8';\r\ncreate database `seafile-db` character set = 'utf8';\r\ncreate database `seahub-db` character set = 'utf8';<\/pre>\n

Dem User seafile<\/strong> Vollzugriff auf genau diese Tabellen geben:<\/p>\n

GRANT ALL PRIVILEGES ON `ccnet-db`.* to `seafile`@localhost;\r\nGRANT ALL PRIVILEGES ON `seafile-db`.* to `seafile`@localhost;\r\nGRANT ALL PRIVILEGES ON `seahub-db`.* to `seafile`@localhost;\r\n\r\nFLUSH PRIVILEGES;<\/pre>\n

\u00dcbrigens kann man dies auf der offiziellen\u00a0Doku nachlesen: manual.seafile.com\/deploy\/using_mysql.html<\/a>.<\/em><\/p>\n

Um zu sehen welche Rechte ein bestehender SQL-User hat, kann man folgendes Kommando feuern:<\/p>\n

SHOW GRANTS FOR 'seafile'@'localhost';<\/pre>\n

Seafile installieren und einrichten<\/h2>\n

Pakete installieren<\/h3>\n

Folgende Kommandos installieren alle n\u00f6tigen Pakete die SeaFile ben\u00f6tigt.<\/p>\n

sudo apt-get install python2.7 python-setuptools python-simplejson python-imaging python-mysqldb<\/pre>\n

User anlegen<\/h3>\n

Unter Linux ist es \u00fcblich je Programm einen separaten Linux-User anzulegen. Das Programm wird dann von diesem Benutzer ausgef\u00fchrt (dadurch ist eine feinere Rechtesteuerung m\u00f6glich). Zudem kann man die Programmdaten in dessen User's Home-Verzeichniss legen (womit es gut aufger\u00e4umt ist).<\/p>\n

sudo adduser seafile --disabled-login<\/pre>\n

Der eben erzeugte User kann sich nicht unter Linux anmelden, da dies mit --disabled-login<\/strong>\u00a0deaktiviert wurde (beim Anmeldeversuch erscheint\u00a0zwar die Passwortaufforderung aber es gibt kein g\u00fcltiges Passwort). Da unter diesem User nur das Programm ausgef\u00fchrt werden soll ist ein normaler Login unn\u00f6tig und w\u00fcrde nur eine Sicherheitsl\u00fccke darstellen.<\/p>\n

Der Admin kann allerdings mit einem Trick\u00a0zum Seafile-User wechseln. Dazu gibt er folgenden Befehl ein:<\/p>\n

sudo su seafile<\/pre>\n

So kann man\u00a0unter Linux gut steuern\u00a0unter welchen Rechten ein Programm laufen darf.<\/p>\n

SeaFile downloaden<\/h3>\n

Wechselt zuerst in das Home-Verzeichnis des seafile<\/strong> Users.<\/p>\n

cd ~<\/pre>\n

Geht auf die offiziele Seite von SeaFile seafile.com\/en\/download<\/a> und sucht euch den Link zum letzten Release. Ich hatte die Version 6.0.7<\/strong>.<\/p>\n

\/\/ Download\r\nwget https:\/\/github.com\/haiwen\/seafile-rpi\/releases\/download\/v6.0.7\/seafile-server_6.0.7_stable_pi.tar.gz\r\n\/\/ Entpacken\r\ntar -xvf seafile-server_6.0.7_stable_pi.tar.gz\r\n\/\/ (optional) L\u00f6schen des Packets\r\nrm seafile-server_6.0.7_stable_pi.tar.gz<\/pre>\n

Seafile installieren<\/h3>\n

Seafile bringt ein paar Setups mit die beim Installieren helfen. Mit .\/setup-seafile.sh<\/strong> k\u00f6nnte man das Setup ausf\u00fchren allerdings wird dort nur SqlLite<\/strong> unters\u00fctzt. Wenn man MySQL<\/strong> verwenden m\u00f6chte muss man .\/setup-seafile-mysql.sh<\/strong> aufrufen.<\/p>\n

Vor dem Setup muss die IP-Adresse notiert werden (mit ifconfig). Zudem muss \u00fcberlegt werden wo die Daten von SeaFile sp\u00e4ter gespeichert werden sollen. Bei mir wird alles auf der externen Festplatte verewigt. Daher muss dort erstmal ein Verzeichnis angelegt werden.
\nWenn ihr au\u00dferhalb des Home-Verzeichniss Seafile-daten anlegen m\u00f6chtet muss der\u00a0Kontext von Benutzer seafile<\/strong>\u00a0mit dem Befehl exit<\/strong> verlassen werden.<\/p>\n

exit\r\nsudo mkdir \/media\/pidisk1\/seafile\r\nsudo mkdir \/media\/pidisk1\/seafile\/data\r\nsudo chown -R seafile:seafile \/media\/pidisk1\/seafile<\/pre>\n

\u00dcber einen Symlink im Home-Verzeichnis soll Seafile darauf verwiesen werden. Den Symlink legt man folgenderwei\u00dfe an. Zuvor solltet ihr aber wieder zum User seafile<\/strong>\u00a0und dessen Home-Verzeichnis wechseln.<\/p>\n

sudo su seafile\r\ncd ~\r\nln -s \/media\/pidisk1\/seafile\/data seafile-data<\/pre>\n

Der letzte Parameter (seafile-data) gibt den Symlink-Ordnernamen an.<\/p>\n

Nun k\u00f6nnt 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.
\nIch hatte\u00a0dem Script das Erstellen der Datenbank \u00fcberlassen.<\/em><\/p>\n

Meine Konfiguration des Assistenten sah folgend aus:<\/strong><\/p>\n

server name: seafile<\/em>
\n server ip\/domain: 192.168.***.***<\/em><\/p>\n

seafile data dir: \/home\/seafile\/seafile-data\/data<\/em>
\n fileserver port: 8082<\/em><\/p>\n

database: create new<\/em>
\n ccnet database: ccnet-db<\/em>
\n seafile database: seafile-db<\/em>
\n seahub database: seahub-db<\/em>
\n database user: seafile<\/em><\/p>\n

Das Script befindet sich in dem entpackten Verzeichnis (dessen Name \u00e4ndert sich je Release). Also wechseln wir dort hin (mit ls -l<\/strong> k\u00f6nnt ihr pr\u00fcfen wie euer Verzeichnis hei\u00dft):<\/p>\n

cd seafile-server-6.0.7<\/pre>\n

Danach bitte euer Setup der Wahl aufrufen (ich habe das f\u00fcr mysql verwendet):<\/p>\n

# Setup for sqlite\r\n.\/setup-seafile.sh\r\n\r\n# Setup for mysql\r\n.\/setup-seafile-mysql.sh<\/pre>\n

Bitte entnehmt der obigen Tabelle\u00a0die Konfiguration des Setups.<\/p>\n

Nach dem Setup pr\u00fcfen wir ob Seafile korrekt installiert wurde und starten sowohl Seafile als auch Seahub:<\/p>\n

.\/seafile.sh start\r\n.\/seahub.sh start-fastcgi<\/pre>\n

Das Raspberry sollte nun zeigen das beide Dienste erfolgreich gestartet wurden. Allerdings wird man beim starten von seahub.sh<\/strong> zus\u00e4tzlich gebeten einen Seahub-Admin einzurichten.<\/p>\n

Wenn Ihr Seafile beenden m\u00f6chtet reichen folgende zwei Befehle:<\/p>\n

.\/seafile.sh stop\r\n.\/seahub.sh stop<\/pre>\n

Achtet darauf das Seafile immer vom User\u00a0seafile<\/strong> gestartet wird und nicht vom pi-User. Ist man mit dem pi-User angemeldet kann man dies mit folgenden Kommandos realisieren:<\/p>\n

sudo su seafile \/home\/seafile\/seafile-server-latest\/seafile.sh start\r\nsudo su seafile \/home\/seafile\/seafile-server-latest\/seahub.sh start-fastcgi<\/pre>\n

Achtung: Bei\u00a0 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\u00fcchtig ist.<\/em><\/p>\n

Seafile\u00a0verwenden<\/h2>\n

Nachdem Seafile nun erfolgreich installiert wurde kann vom Client aus \u00fcber einen Browser mit der Adresse \"http:\/\/Ip-Address:8000<\/strong>\" zugegriffen werden.<\/p>\n

Habt Ihr Probleme beim Zugriff auf Seafile dann versucht mal euer Pi neu zu starten und\/oder das .\/seahub.sh<\/strong> ohne fastcgi<\/strong> zu starten (.\/seahub sh start<\/strong>).
\nAnsonsten habt etwas\u00a0Geduld und versucht mehrfach einen Page-Refresh.<\/p>\n

Web-Server einrichten (Nginx)<\/h2>\n

M\u00f6chte man \u00fcber das Internet via https<\/strong> auf Seafile zugreifen muss man einen Web-Server wie Nginx<\/strong> installieren (Nginx<\/strong> soll auf dem Pi eine bessere Performance liefern wie Apache<\/strong>). Da ich nur den Anspruch habe\u00a0im lokalen Netzwerk damit zu arbeiten wird dieser bei mir nicht eingerichtet.<\/p>\n

Bitte betreibt Seafile<\/strong> niemals ohne https<\/strong> \u00fcber das Internet!<\/p>\n

Hier die Anleitung des Herstellers: manual.seafile.com\/deploy\/deploy_with_nginx.html<\/a><\/p>\n

Seafile beim boot starten<\/h2>\n

Soll Seafile automatisch beim Start des Raspberries verf\u00fcgbar sein, hilft euch die Anleitung des Herstellers:<\/p>\n

https:\/\/manual.seafile.com\/deploy\/start_seafile_at_system_bootup.html<\/a><\/p>\n

\u00a0Weitere\u00a0geht's ...<\/h2>\n

Die Artikelserie \u201eHome Server mit dem Raspberry Pi<\/a>\u201c geht jetzt mit dem Thema\u00a0SourceControl mit git<\/a>\u00a0<\/strong>weiter.<\/p>\n","protected":false},"excerpt":{"rendered":"

Mit einem synchronisierenden Dateisystem erh\u00e4lt man das Beste aus einer zentralen und dezentralen Dateiverwaltung. Man muss kaum Kompromisse eingehen f\u00fcr Performance und Vef\u00fcgbarkeit. Dateien liegen sowohl auf dem Server und\u00a0auch als Kopie bei jedem Client bereit (womit offline arbeiten m\u00f6glich ist). Anwender verwenden Dateien wie gew\u00f6hnlich lokal und die Magie findet im Hintergrund statt.<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[19],"_links":{"self":[{"href":"http:\/\/blog.rollnut.com\/wp-json\/wp\/v2\/posts\/350"}],"collection":[{"href":"http:\/\/blog.rollnut.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.rollnut.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.rollnut.com\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.rollnut.com\/wp-json\/wp\/v2\/comments?post=350"}],"version-history":[{"count":94,"href":"http:\/\/blog.rollnut.com\/wp-json\/wp\/v2\/posts\/350\/revisions"}],"predecessor-version":[{"id":731,"href":"http:\/\/blog.rollnut.com\/wp-json\/wp\/v2\/posts\/350\/revisions\/731"}],"wp:attachment":[{"href":"http:\/\/blog.rollnut.com\/wp-json\/wp\/v2\/media?parent=350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.rollnut.com\/wp-json\/wp\/v2\/categories?post=350"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.rollnut.com\/wp-json\/wp\/v2\/tags?post=350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}