Seafile mit HTTPS

Anleitung, wie man den cloudbasierten Fileserver Seafile (pendant zu OwnCloud, NextCloud etc.) installiert und via HTTPS-Proxy zugänglich macht.

Die Dokumentation basiert auf RedHat Enterprise Linux (RHEL) Clones der Version 9, konkret AlmaLinux 9.1, funktioniert aber auch auf EL8.x. Andere Linux-Distributionen haben allenfalls abweichende Paketmanager und Repositories und abweichende Speicherorte der Dateinamen, die grundsätzlichen Konfigurationsanpassungen gelten aber auch hier.

Die Dokumentation ist in drei Teile gegliedert, falls sich jemand nur für einen Teil interessiert:

  • Installation von Seafile
  • Installation von Apache mit SSL
  • Seafile via HTTPS-Proxy in Apache einrichten

Installation von Seafile unter EL8/EL9

Seafile basiert auf Python und benötigt einige Pakete, welche als erstes installiert werden müssen

dnf install --enablerepo=crb curl freetype-devel fribidi-devel gcc gcc-c++ harfbuzz-devel lcms2-devel libffi-devel libjpeg-devel libmemcached libmemcached-devel libtiff-devel libwebp-devel libxcb-devel memcached openjpeg2-devel python3 python3-devel python3-ldap python3-pip python3-setuptools sqlite tar tcl-devel tk-devel zlib-devel

Unter EL8 heisst das PowerTools Repository "powertools" statt "crb", ansonsten ist der Befehlsaufruf identisch.

Danach müssen über den Python-Paketmanager noch einige Python-Module installiert werden:

pip3 install --timeout=3600 Pillow captcha jinja2 sqlalchemy psd-tools django-simple-captcha gunicorn

Nun kann das TAR-Archiv von Seafile heruntergeladen und entpackt werden. Ich verwende als Installationsverzeichnis /opt/seafile. Andere Verzeichnisse sind auch möglich, die Dokumentation bezieht sich aber stets auf dieses Verzeichnis. Allenfalls existiert auch schon ein neueres TAR-File, ggf. kurz auf der Download-Seite von Seafile kontrollieren.

cd /opt
mkdir seafile
cd seafile
wget https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seafile-server_9.0.9_x86-64.tar.gz
tar -zxvf seafile-server_9.0.9_x86-64.tar.gz
mv seafile-server-9.0.9 seafile
rm -f seafile-server_9.0.9_x86-64.tar.gz

Mit neueren Python-Versionen ergaben sich Anpassungen in der Pilow Image Library. Darum müssen die Skripte gepatcht werden:

/usr/bin/find /opt/seafile -type f -name "*.py" -print0 | xargs -0 sed -i '' -e 's/Image\.ANTIALIAS/Image.Resampling.LANCZOS/g'

Die Installation von Seafile erfolgt dann via Setup-Script:

cd /opt/seafile/seafile
./setup-seafile.sh

Der server name kann beliebig benannt werden und wird im Client dargestellt, kurze Bezeichnung verwenden. This server's ip or domain kann man IP oder Domain des Servers eingeben. Da für SSL später sowieso eine Domain erforderlich ist erfasst man am besten hier schon einen Domain-Namen. Port kann man auf 8082 belassen.

Nun kann man Seafile mal starten

./seafile.sh start
./seahub.sh start

Beim Start von Seahub muss der Admin-Benutzer erstellt werden. Ist dies erfolgt kann man die Dienste gleich wieder stoppen, es sind noch einige Konfigurationsanpassungen erforderlich.

./seahub.sh stop
./seafile.sh stop

Damit der Server öffentlich zugänglich ist muss die Listener-IP noch geändert werden. Dies ist bei einem Betrieb via SSL-Proxy dann nicht mehr notwendig und kann wieder rückgängig gemacht werden. Ebenfalls muss Port 8000 auf einer allfällig installierten Firewall freigegeben werden. Die Listener IP ist in der Datei /opt/seafile/conf/gunicorn.conf.py konfiguriert. Dort die Bind-Adresse auf 0.0.0.0 anpassen:

bind = "0.0.0.0:8000"

Damit Seafile als Daemon beim Boot gestartet werden kann müssen wir noch ein Init-Script erstellen und aktivieren:

/etc/systemd/system/seafile.service mit folgendem Inhalt erstellen:

[Unit]
Description=Seafile
After=network.target

[Service]
Type=forking
ExecStart=/opt/seafile/seafile/seafile.sh start
ExecStartPost=/opt/seafile/seafile/seahub.sh start
ExecStop=/opt/seafile/seafile/seafile.sh stop
ExecStopPost=/opt/seafile/seafile/seahub.sh stop
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target

Nun die Daemons neu laden, aktivieren und Seafile starten:

systemctl daemon-reload
systemctl enable seafile.service
systemctl start seafile

Nun müsste die Weboberfläche von Seafile via http://seafileserver.meinedomain.ch:8000/ zugänglich sein (Achtung: http und nicht https!).

Installation von Apache mit SSL-Support

Auf vielen Servern ist wohl schon ein Webserver mit SSL Unterstützung im Einsatz. Falls nicht kann dieser mit

dnf install httpd mod_ssl

installiert werden. Apache muss dann noch aktiviert und gestartet werden:

systemctl enable httpd.service
systemctl start httpd

Dadurch sollte der Webserver via HTTP und HTTPS zugänglich sein. Bei HTTPS kommt mangels Zertifikat eine Browser-Warnung.

Für einen späteren Betrieb als HTTPS Proxy erstellen wir für die Seafile Konfiguration eine eigene Konfigurationsdatei unter /etc/httpd/conf.d/seafile.conf. Diese kann natürlich auch anders heissen oder in die bereits existierende ssl.conf integriert werden.

<VirtualHost *:443>

 ServerName test.home.local
 DocumentRoot /var/www/html

 SSLengine on
 SSLCompression off
 SSLProtocol -all +TLSv1.3 +TLSv1.2
 SSLHonorCipherOrder On
 SSLCipherSuite TLSv1.3 TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256
 SSLCipherSuite SSL ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:EECDH+AESGCM:EDH+AESGCM
 SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1

 SSLCertificateFile /etc/httpd/conf/home.crt
 SSLCertificateKeyFile /etc/httpd/conf/home.key
 SSLCACertificateFile /etc/httpd/conf/home.chain

 RewriteEngine On
 RewriteCond %{HTTPS} !=on
 RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
 <If "%{SERVER_PORT} == '443'">
   Header always set Strict-Transport-Security "max-age=31536000; preload; includeSubDomains"
 </If>
 Header set X-Content-Type-Options "nosniff"
 Header append X-Frame-Options "SAMEORIGIN"
 Header always edit Set-Cookie (.*) "$1; HttpOnly; SameSite=Strict; Secure"
 Header set X-XSS-Protection "1; mode=block"
 Header unset X-Powered-By

</VirtualHost>

Die fett gedruckten Zeilen müssen angepasst werden und natürlich ein gültiges (oder self-signed) SSL-Zertifikat mit Key, Cert und allenfalls Chain installiert werden. Danach den Apache-Server neu starten:

systemctl restart httpd

Nun sollte man via HTTP und HTTPS auf den Server zugreifen können.

Seafile via HTTPS-Proxy betreiben

Damit Seafile über einen HTTPS-Proxy betrieben werden kann müssen einige Konfigurationsdateien angepasst werden. Danach muss noch der Apache als Proxy konfiguriert werden. test.home.local ist hierbei die gewünschte Domain, unter der der Server betrieben wird.

In der Datei /opt/seafile/conf/ccnet.conf muss am Ende (nach [General]) noch folgende Zeile eingefügt werden:

SERVICE_URL = https://test.home.local

Die Datei /opt/seafile/conf/seahub_settings.py muss unterhalb der SERVICE_URL noch ergänzt werden (SERVICE URL auf http:// belassen, FILE_SERVER_ROOT ist https://):

FILE_SERVER_ROOT = 'https://test.home.local/seafhttp'

Falls Seafile auch via WebDAV zugänglich sein soll noch die Datei /opt/seafile/conf/seafdav.conf anpassen:

[WEBDAV]
enabled = true
port = 8080
share_name = /seafdav

Bei Bedarf kann die BIND-Adresse in der /opt/seafile/conf/gunicorn.conf.py wieder auf 127.0.0.1 geändert werden und Port 8000 kann auch auf der Firewall wieder blockiert werden.

Nun muss die Apache-Konfiguration noch angepasst werden. Da haben wir ja bereits eine Konfiguration /etc/httpd/conf.d/seafile.conf erstellt, welche nun am Ende, vor </VirtualHost> um folgende Zeilen ergänzt werden muss (127.0.0.1 unverändert belassen: Apache Proxy und Seafile laufen ja auf dem selben Server):

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

# seahub
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/

# webdav
<Location /seafdav>
 ProxyPass "http://127.0.0.1:8080/seafdav"
</Location>

webdav ist nur bei aktiviertem WebDAV erforderlich. Nun Seafile und Apache noch neu starten

systemctl restart seafile
systemctl restart httpd

Nun steht Seafile unter https://test.home.local zur Verfügung. Natürlich kann Seafile als eigener VirtualHost parallel zu einer Webseite auf dem selben Server unter einer eigenen Subdomain betrieben werden.

Weitere Infos und Download