Dropbox-Alternative Seafile mit TLS unter Apache einrichten

Ich setze nun schon seit ein paar Jahren erfolgreich Seafile zur Dateisynchronisation ein. Dabei ist Seafile mehr als ein Dropbox-Ersatz und deutlich performanter als Owncloud. Selbst ein schwachbrüstiger Server kann 100 Intensivnutzer gut vertragen. Nicht dabei sind Kontakt- und Kalendersynchronisation. Dazu folgt noch ein Artikel (GMail-Ersatz mit Roundcube, Baikal u. Fullcalendar).

Zunächst ein mal sei hier auf die fantastische Dokumentation von Seafile verwiesen. Hier werden sehr ausführlich alle möglichen Konfigurationen erläutert. Eigentlich wäre dieser Artikel damit überflüssig. Bei meinem Setup gibt es aber ein paar Sonderfälle, die ich hier zum schnellen Nachlesen dokumentieren möchte:

  • es läuft Plesk (nicht meine Entscheidung)
  • Seafile soll unter https://domain.com/seafile laufen
  • das ganze soll in Apache und TLS-verschlüsselt laufen

TLS-Zertifikat besorgen und einrichten

Erst mal erstellt man sich folgendermassen einen Certificate Signing Request (CSR):

openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr

Die geforderten Angaben füllt man entspr. aus, gibt als common name die domain an und wählt ein Passwort. Man erhält eine .key und eine .csr Datei. Mit letzterer beantragt man bei StartSSL ein kostenloses Zertifikat. Am Ende erhält man noch das CA- und ein Unterzertifikat von StartSSL, die man ebenfalls speichern sollte.

Unter der Domain in Plesk kann man nun das Zertifikat hinzufügen. Dazu am besten den Inhalt von Schlüssel (key), Zertifikat (crt) und CA-Zertifikaten in die entspr. Textfelder kopieren. ca.pem und sub.class1.server.ca.pem kommen beide in das gleiche Feld (CA). Danach kann man das Zertifikat für die Domain in den Hosting-Einstellungen auswählen. Der Prozess lässt sich übrigens für beliebig viele Subdomains wiederholen.

Server vorbereiten

Ich nehme eine MySQL-Datenbank, analog geht es aber auch mit SQLite oder PostgreSQL. Ich installiere nach /opt unter der Benutzerkennung des Domain-Users, also dem Benutzer-Account der Domain in Plesk (unter welchem Seafile später auch läuft).

Erst mal erstellen wir von Hand die Datenbanken. Dazu als root in MySQL einloggen:

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;

Wir brauchen noch ein paar Pakete und müssen Apache vorbereiten. FastCGIExternalServer sollte auf das webroot der Domain zeigen, die Datei seahub.fcgi existiert dabei aber nicht in Wirklichkeit.

apt-get install python2.7 python-setuptools python-imaging python-mysqldb python-flup libapache2-mod-fastcgi
a2enmod rewrite
a2enmod fastcgi
a2enmod proxy_http
echo "FastCGIExternalServer /var/www/vhosts/domain.com/httpdocs/seahub.fcgi -host 127.0.0.1:8000" >> /etc/apache2/apache2.conf
service apache2 restart

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 4.4.3.

# als root
mkdir /opt/seafile
chown -R domainuser: /opt/seafile
# zum Benutzer wechseln
su domainuser
cd /opt/seafile
# Download u. Installation
wget https://bitbucket.org/haiwen/seafile/downloads/seafile-server_4.4.3_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 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 der Domain und nie als root starten!

su domainuser
# starten
./seafile.sh start
./seahub.sh start 8001
# stoppen
./seahub.sh stop
./seafile.sh stop

Und nun Apache

Zunächst müssen wir für die Domain eine eigene SSL-Konfiguration anlegen mit ein paar Regeln für Seafile. Die Datei befindet sich unter /var/www/vhosts/system/domain.com/conf/vhost_ssl.conf. Wenn sie nicht existiert, muss sie angelegt werden. Folgender Inhalt muss mindestens darin stehen:

<Location /media>
	Require all granted
</Location>
Alias /media /opt/seafile/seafile-server-latest/seahub/media
RewriteEngine On

# seafile httpserver
ProxyPass /seafhttp http://127.0.0.1:8082
ProxyPassReverse /seafhttp http://127.0.0.1:8082
RewriteRule ^/seafhttp - [QSA,L]

# seahub
RewriteRule ^/(media.*)$ /$1 [QSA,L,PT]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(seafile.*)$ /seahub.fcgi/$1 [QSA,L,E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Um Plesk dazu zu bringen, diese Datei auch zu nutzen, muss man die Konfiguration neu lesen:

/usr/local/psa/admin/bin/httpdmng --reconfigure-all
service apache2 restart

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

SERVICE_URL = https://domain.com/seafile

In der /opt/seafile/seahub_settings.py muss der Wert von FILE_SERVER_ROOT angepasst werden.

FILE_SERVER_ROOT = 'https://domain.com/seafhttp'

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'
SERVE_STATIC = False 
MEDIA_URL = '/media/'
SITE_ROOT = '/seafile/'

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

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

Nun sollte Seafile über https://domain.com/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 muss der user der entspr. Domain angegeben werden.

Ich setze Seafile so seit Version 2 problemlos ein. Auch Upgrades auf die jeweils aktuellen Versionen liefen immer problemlos durch.

Noch Fragen?

5 Gedanken zu „Dropbox-Alternative Seafile mit TLS unter Apache einrichten

  1. Moritz S.

    Vielen Dank für die Anleitung, die ich befolgt habe. Jedoch erscheint bei der Eingabe der URL stets eine 404 Fehlermeldung. Woran kann das liegen?

    Antworten
    1. dakira Beitragsautor

      An welcher Stelle? Man kann ja an mehreren Stellen schauen, ob schon alles läuft. Läuft Seafile, wenn du es wie im Bereich Testlauf genannt startest? Benutzt du Apache oder Nginx? Wenn Apache, welche Version?

      Antworten
        1. dakira Beitragsautor

          Das klingt danach, dass der Apache Proxy nicht wie beschrieben konfiguriert wurde. Aktuell würde ich das ganze eh eher unter nginx laufen lassen. Dazu findest du hier auch eine Anleitung.

          Antworten
  2. Pingback: Seafile mit Nginx unter Ubuntu einsetzen | YuMDaP.net Blog

Schreibe einen Kommentar

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