Seafile mit Nginx unter Ubuntu einsetzen

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
  • Seafile soll in einem Unterverzeichnis laufen
  • 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. Aus diesem Grund können wir Seafile nicht im Wurzelverzeichnis laufen lassen (siehe unten), sondern nutzen es unter domain.tld/seafile.

Alternativ kann man in nginx natürlich jedes beliebige andere Zertifikat nutzen, zum Beispiel StartSSL (siehe dazu meinen alten Artikel). 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 5.1.1.

# zum Seafile user wechseln
sudo -i -u seafile
pwd
# wir sollten uns in /opt/seafile befinden
# Download u. Installation
wget https://bintray.com/artifact/download/seafile-org/seafile/seafile-server_5.1.1_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. Dabei Seafile nur (!) als Benutzer seafile und nie als root starten!

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 exakt so übernommen werden.

server_tokens off;
location /seafile {
    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }
    fastcgi_pass    127.0.0.1:8000;
    fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
    fastcgi_param   PATH_INFO           $fastcgi_script_name;

    fastcgi_param   SERVER_PROTOCOL     $server_protocol;
    fastcgi_param   QUERY_STRING        $query_string;
    fastcgi_param   REQUEST_METHOD      $request_method;
    fastcgi_param   CONTENT_TYPE        $content_type;
    fastcgi_param   CONTENT_LENGTH      $content_length;
    fastcgi_param   SERVER_ADDR         $server_addr;
    fastcgi_param   SERVER_PORT         $server_port;
    fastcgi_param   SERVER_NAME         $server_name;
    fastcgi_param   HTTPS               on;
    fastcgi_param   HTTP_SCHEME         https;
    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 {
    fastcgi_pass    127.0.0.1:8080;
    fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
    fastcgi_param   PATH_INFO           $fastcgi_script_name;

    fastcgi_param   SERVER_PROTOCOL     $server_protocol;
    fastcgi_param   QUERY_STRING        $query_string;
    fastcgi_param   REQUEST_METHOD      $request_method;
    fastcgi_param   CONTENT_TYPE        $content_type;
    fastcgi_param   CONTENT_LENGTH      $content_length;
    fastcgi_param   SERVER_ADDR         $server_addr;
    fastcgi_param   SERVER_PORT         $server_port;
    fastcgi_param   SERVER_NAME         $server_name;
    fastcgi_param   HTTPS               on;
    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;
}

Nun muss Seafile noch für FastCGI und den Betrieb im Unterverzeichnis angepasst werden. In der Datei /opt/seafile/conf/ccnet.conf muss die SERVICE_URL angepasst werden:

SERVICE_URL = https://domain.tld/seafile

In der /opt/seafile/conf/seahub_settings.py müssen mindestens die Wert von FILE_SERVER_ROOT und LOGIN_URL angepasst werden.

FILE_SERVER_ROOT = 'https://domain.tld/seafhttp'
LOGIN_URL = '/seafile/accounts/login/'
SERVE_STATIC = False
MEDIA_URL = '/media/'
COMPRESS_URL = MEDIA_URL
STATIC_URL = MEDIA_URL + 'assets/'
SITE_ROOT = '/seafile/'

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://domain.com/seafile'
SITE_NAME = 'My Site'
SITE_TITLE = 'My Site'

Mit dieser Konfiguration muss Seafile nun anders gestartet werden, damit es über Nginx läuft:

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

Nun sollte Seafile über https://domain.tld/seafile 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 = true
share_name = /seafdav

Danach muss Seafile natürlich noch mal neu gestartet werden

service seafile-server restart

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.

Update

Mit dank an die Kommentatoren möchte ich noch ein paar Hinweise ergänzen. Man kann Seafile auch mit Letsencrypt im Root laufen lassen, in dem man mit nginx dafür sorgt, dass das .well-known Verzeichnis weiterhin erreichbar ist. Wie das geht wird im TauSys Blog erklärt.

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/

4 Gedanken zu „Seafile mit Nginx unter Ubuntu einsetzen

  1. Jens Tautenhahn

    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/

    Antworten
    1. dakira Beitragsautor

      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. ;)

      Antworten
  2. Christoph Dyllick-Brenzinger

    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

    Antworten
    1. dakira Beitragsautor

      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.

      Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.