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:
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!).
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.
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.