Seafile mit Nginx unter Ubuntu einsetzen

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/

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.