Update 1/2018: Der Artikel wurde grundlegend überarbeitet. Seit Seafile 6.2 wird empfohlen nicht mehr FastCGI für die Kommunikation mit Seafile zu nutzen. Dadurch ergeben sich ein paar Änderungen in der Konfiguration von Nginx und WebDAV. Außerdem zeigt die Anleitung jetzt nicht mehr, wie man Seafile in einem Unterverzeichnis betreibt.
Seafile ist eine leistungsfähige Alternative zu Dropbox mit Clients für alle gängigen Betriebssysteme (auch mobil). Der Server kann mit wenig Resourcen recht viele Clients bedienen. Für kleine Arbeitsgruppen reicht schon ein Raspberry Pi. Mit rund 100 Intensivnutzern läuft das ganze bei mir auf einem kleinen VServer. Ich betreibe Seafile nun seit Jahren im Dauereinsatz und hatte nie Probleme (ganz im Gegensatz zu anderen populären Lösungen).
Seafile basiert auf Git mit Erweiterungen, die den Umgang mit Binärdaten beschleunigen (Git ist auf Textdateien optimiert). Seafile selbst ist in C/C++ geschrieben, die Weboberfläche kommt als Python/Django Anwendung. Zudem hat Seafile eine vollständige API, so dass es relativ leicht ist Seafile-Funktionalität in eigene Anwendungen zu integrieren.
Ich habe in der Vergangenheit bereits einen Artikel zu Seafile geschrieben. In diesem Artikel Dokumentiere ich meine aktuelle (einfachere) Konfiguration.
Dies sind die Ziele des Setups:
- eine mit Letsencrypt verschlüsselte (Sub-)Domain
- Ein separater User für Seafile
- ein Nginx proxy, der Seafile aufruft
- eine Nginx-Regel die Letsencrypt weiterhin ermöglicht
- Wir wollen auch per WebDAV auf Seafile zugreifen
- Seafile soll mit dem System starten
TLS-Verschlüsselung
Da es so einfach ist, empfehle ich für die gewünschte Domain ein Zertifikat bei Letsencrypt zu bestellen. Letsencrypt braucht einen laufenden Webserver, um die Zertifikate automatisch zu erneuern. Da unter der Domain Seafile ausgeliefert wird und nicht ein Webserver-Verzeichnis muss eine separate Nginx-Konfiguration dafür angelegt werden (siehe unten).
Alternativ kann man in nginx natürlich jedes beliebige andere Zertifikat nutzen, zum Beispiel StartSSL. Wenn die (Sub-)Domain korrekt unter Nginx mit TLS-Verschlüsselung läuft, geht es weiter. Details dazu sprengen leider den Rahmen dieses Artikels.
Server vorbereiten
Zuerst legen wir uns einen User für Seafile an:
sudo adduser --gecos ',,,' --disabled-password --home /opt/seafile seafile
Nun erstellen wir die benötigten Datenbanken.
sudo -i apt-get install mysql-server # falls nötig mysql --defaults-extra-file=/etc/mysql/debian.cnf
Die referenzierte Datei enthält Zugangsdaten für MySQL, damit wir sie nicht eingeben müssen. Nun erstellen wir die Datenbanken und den User seafile mit dem Passwort klartextpasswort:
create database `ccnet-db` character set = 'utf8'; create database `seafile-db` character set = 'utf8'; create database `seahub-db` character set = 'utf8'; create user 'seafile'@'localhost' identified by 'seafile'; SET PASSWORD FOR 'seafile'@'localhost' = PASSWORD('klartextpasswort'); 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;
Nun noch ein paar benötigte Pakete für Seafile installieren:
sudo apt-get install python2.7 python-setuptools python-imaging python-mysqldb python-flup python-memcache
Seafile einrichten
Nun legen wir die benötigten Verzeichnisse an und installieren Seafile. Die aktuelle Server-Version gibt es im Download-Bereich der Seafile Seite. Aktuell ist es 6.2.5.
# zum Seafile user wechseln sudo -i -u seafile pwd # wir sollten uns in /opt/seafile befinden # Download u. Installation wget https://download.seadrive.org/seafile-server_6.2.5_x86-64.tar.gz tar -xf seafile-server_* mkdir installed mv seafile-server_* installed cd seafile-server-* ./setup-seafile-mysql.sh
Den Installationsanweisungen folgen, bei der Frage nach MySQL wählen, dass man eine existierende Datenbanken nutzen möchte und die oben gewählten Daten angeben. Details dazu finden sich in der offiziellen Anleitung.
Testlauf
Um zu gucken, ob alles geklappt hat, kann man Seafile schon mal im integrierten Webserver unter domain.com:9999 testen.
Hinweis: Seafile niemals als root starten sondern nur als der Seafile-Benutzer.
sudo -i -u seafile # starten ./seafile.sh start ./seahub.sh start 9999 # stoppen ./seahub.sh stop ./seafile.sh stop
Läuft alles wie erwartet geht es weiter mit der Konfiguration von Nginx.
Nginx konfigurieren
Zu der bestehenden Nginx-Konfiguration der Domain, müssen einige Einstellungen für Seafile hinzugefügt werden. Für ein vollständiges Beispiel, siehe die Dokumentation. Ist Plesk im Einsatz kann man das ganz einfach in Einstellungen der Domain unter Apache & Nginx Einstellungen ganz unten seine eigenen Nginx-Einstellungen anfügen. Die Einstellungen unten können dann exakt so übernommen werden (aufgrund eines Bugs muss man u.U. 2x auf Speichern drücken).
server_tokens off; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_read_timeout 1200s; # used for view/edit office file via Office Online Server client_max_body_size 0; access_log /var/log/nginx/seahub.access.log; error_log /var/log/nginx/seahub.error.log; } location /seafhttp { rewrite ^/seafhttp(.*)$ $1 break; proxy_pass http://127.0.0.1:8082; client_max_body_size 0; proxy_connect_timeout 36000s; proxy_read_timeout 36000s; proxy_send_timeout 36000s; send_timeout 36000s; proxy_request_buffering off; } location /seafdav { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_read_timeout 1200s; client_max_body_size 0; proxy_request_buffering off; access_log /var/log/nginx/seafdav.access.log; error_log /var/log/nginx/seafdav.error.log; } location /media { root /opt/seafile/seafile-server-latest/seahub; } location /.well-known/acme-challenge/ { # hier das Verzeichnis angeben, in welches der letsencrypt-bot seine Verifikations-Dateien ablegt. alias /var/www/vhosts/seafile.domain.tld/.well-known/acme-challenge/; }
Wichtig: Damit die automatische Erneuerung der Letsencrypt-Zertifikate klappt,
ist es wichtig, dass /.well-known/acme-challenge/ auf das passende Verzeichnis zeigt.
Nun muss die Seafile-Konfiguration noch für TLS und den Betrieb unter einer eigenen Domain angepasst werden. In der Datei /opt/seafile/conf/ccnet.conf muss die SERVICE_URL angepasst werden:
SERVICE_URL = https://seafile.domain.tld
In der /opt/seafile/conf/seahub_settings.py müssen mindestens die Wert von FILE_SERVER_ROOT und SITE_BASE angepasst werden.
FILE_SERVER_ROOT = 'https://seafile.domain.tld/seafhttp' SITE_BASE = 'https://seafile.domain.tld/'
Dort können bei der Gelegenheit noch andere praktische Werte gesetzt werden (siehe Config-Dokumentation):
TIME_ZONE = 'Europe/Berlin' LANGUAGE_CODE = 'de' CLOUD_MODE = False # Nutzer können sich gegenseitig "sehen" ENABLE_SIGNUP = False # Nutzer können sich selbst registrieren SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER = True SEND_EMAIL_ON_RESETTING_USER_PASSWD = True SITE_BASE = 'https://seafile.domain.tld/' SITE_NAME = 'My Site' SITE_TITLE = 'My Site'
Mit dieser Konfiguration kann man Seafile nun wieder starten:
./seafile.sh start ./seahub.sh start
Nun sollte Seafile über https://seafile.domain.tld zugänglich sein. Wenn man möchte, dass der Server beim Start automatisch Seafile läd, kann man ein einfaches Startskript erstellen. Dort muss das passende Seafile-Verzeichnis hinterlegt sein und als user seafile genutzt werden.
WebDAV
Damit die WebDAV-Erweiterung aktiviert wird muss noch eine Konfigurations-Datei angepasst werden:
[WEBDAV] enabled = true port = 8080 fastcgi = false share_name = /seafdav
Danach muss Seafile natürlich noch mal neu gestartet werden
service seafile-server restart
Nun kann man bspw. unter Nautilus über die Adresse davs://seafile.domain.tld/seafdav
auf Seafile zugreifen.
Upgrades
Für Upgrades läd man die neue Version nach /opt/seafile und entpackt sie dort. Beispielhaft zeige ich wie man z.B. von Seafile 4.4.3 auf 5.1 aktualisiert.
service seafile-server restart wget https://bintray.com/artifact/download/seafile-org/seafile/seafile-server_5.1.1_x86-64.tar.gz tar xf seafile-server_5.1.1_x86-64.tar.gz ./seafile-server_5.1.1/upgrade/upgrade_4.4_5.0.sh
Das ist alles. In dem Upgrade-Verzeichnis liegen Skripte für alle Major-Upgrades Bei s.g. Point-Releases (4.4.1 -> 4.4.3) führt man nur die Datei minor-upgrade.sh aus. Hat man einige Versionen ausgelassen, muss man alle verpassten Upgrade-Skripte nacheinander ausführen.
Weiteres
Danke noch mal an Jens Tautenhahn. Ich habe seine Kommentare aus diesem Artikel mittlerweile in den Artikel einfliessen lassen.
Hat man Seafile zu Hause auf einem eigenen Rechner (z.B. Raspberry Pi) laufen, kann man mit einem CNAME-Eintrag auf dem Webserver eine eigene Subdomain auf den Eintrag des genutzten DynDns-Anbieters zeigen lassen. Kombiniert mit dem Tip von TauSys ist auch das verschlüsselt möglich.
Fazit
Ich setze Seafile seit Version 2 ein und habe es keinen Tag bereut. Noch Fragen? https://forum.seafile.com/
Sehr gute Zusammenfassung! Zwei kleine Hinweise hätte ich: 1. Alle Seafile-Clients wurden seit einiger Zeit dahingehend korrigiert, dass sie über einen HTTPS-Nginx-Proxy korrekt mit Seafile kommunizieren. Eine direkte Kommunikation ist nicht mehr notwendig. Um das System noch etwas abzusichern empfiehlt es sich, Seafile nur noch auf localhost lauschen zu lassen. Dazu muss in seafile.conf unter [httpserver] „host = 127.0.0.1“ eingetragen werden. 2. Seafile kann auch mit Lets Enctypt Zertifikaten im Webroot laufen. Lets Encrypt benutzt nur das Verzeichnis /.well-known/acme-challenge/ was man dank Nginx leicht woanders hin mappen kann. Das Verahren habe ich hier beschrieben: https://blog.tausys.de/2016/02/02/lets-encrypt-nginx-und-viele-hosts/
Hallo Jens. Vielen Dank für die hilfreichen Hinweise. Ich werde das direkt mal umsetzen. So muss ich dann auch Gogs nicht weiter auf ein Unterverzeichnis mappen. ;)
Hallo dakira,
cooler Artikel. Ich persönlich finde es noch cooler, wenn Seafile nicht in einem Unterverzeichnis sondern über eine Subdomain z.B. https://cloud.meinedomain.de erreichbar ist. Zusätzlich verkürzt das die einzutippende Domain.
Mit einem V-Server und nginx ist dies auch ja auch denkbar einfach umgesetzt.
Mit deiner Erlaubnis würde ich gerne auf meinen Artikel verweisen, der weniger die Seafile eigene Konfiguration sondern das Drumherum (also Router, SPDNS-Eintrag etc) zu Seafile hinter einer Subdomain beschreibt. Meiner Meinung nach ergänzen sich die Artikel somit sehr gut.
Den Artikel findet man unter:
https://www.ionas-server.com/blog/seafile-mit-der-eigenen-subdomain-verbinden/
Viele Grüße
Hi Christioph, tatsächlich mach ich das für mein lokales Seafile, das auf einem Raspberry Pi läuft, genau so. Mit dem Tip im Kommentar von Jens Tautenhahn kann man es mit nginx ja auch so hinbekommen, dass die Letsencrypt-Zertifikate trotzdem ordentlich generiert werden können.