Seafile unter Windows Server mit Hyper-V betreiben

Endlich konnte ich mich durchringen, meinen ersten Blog-Beitrag zu verfassen - wohl auch etwas aus Eigennutz, um es ggfs. nachlesen zu können. Diese Anleitung wurde mit Seafile 6.2.2 erstellt und ist nicht für blutige Anfänger gedacht, man sollte schon erste Schritt mit Linux und Apache gemacht haben. Ich bin schon seit einigen Jahren Anhänger von Seafile. Wie die meisten hatte auch ich zuerst eine OwnCloud in Betrieb, habe jedoch aus folgenden Gründen das Lager gewechselt:

  • Langsame Synchronisation
  • Windows nicht mehr als Server OS unterstützt
  • Beruflicher Kontakt an der HU Berlin

Da ich mit Freunden bei Hetzner einen Root-Server für Spiele und TeamSpeak gemietet habe bin ich auf Windows Server als OS angewiesen, was mit Seafile lange funktioniert hat. Leider wurde auch hier Windows zuletzt vernachlässigt - die letzte Version ist 6.0.7, für Linux bietet man bereits 6.2.2 an.

Seafile Server Versionen

Als Alternative wurde vom Seafile-Team ein Docker-Container bereitgestellt, der jedoch nur mit Windows 10, nicht aber mit dem Server 2016 arbeitet. Als "Update-Fetischist" habe ich mich deshalb auf die Suche nach einer anderen Möglichkeit gemacht.

Da ich sowieso meine Kenntnisse in dem Bereich vertiefen wollte, entschied ich mich für eine Hyper-V VM mit Ubuntu 16.04 als Server. Auf unserem Server lief bereits ein aktueller Apache 2.4 von Apache Lounge zusammen mit PHP und MariaDB, da die bisherige Installation auch schon per FastCGI angesprochen wurde musste in der Theorie nicht viel verändert werden.

Schritt 1: Hyper-V Maschine anlegen

Logischerweise musste also erstmal eine Maschine angelegt werden. Hyper-V sollte auf Windows Servern bereits installiert sein, ist unter Windows 10 aber auch schnell nachinstalliert. Für Ubuntu habe ich eine "Generation 2"-VM mit 2 GB RAM und 120 GB HDD erstellt, weniger sollte bei einem reinen Seafile-Server aber natürlich auch reichen. Dazu benötigen wir noch ein Switch vom Typ "Intern", welches allerdings mit unserer physischen NIC die Internetverbindung teilt. Nach dem Setup muss in Ubuntu noch die passende statische IP gesetzt werden, dann kann es auch schon losgehen.
Anmerkung: Mit VirtualBox und einem NAT-Netzwerk sollte das Ganze theoretisch auch funktionieren.

Hyper-V & Netzwerkeinstellungen

Schritt 2: MariaDB-Server konfigurieren

Seafile braucht natürlich auch eine eigene MySQL-Datenbank, in meinem Fall lief auf unserem Windows-Host bereits eine Instanz. Ich musste lediglich eine Firewall-Freigabe für das Hyper-V Switch anlegen und den MariaDB-User "root" so konfigurieren, dass er sich von unserer VM aus einloggen kann. Alternativ kann unter Linux schnell und einfach MySQL nachinstalliert werden.

MariaDB-Users

Schritt 3: Seafile installieren

Als nächstes laden wir uns den Seafile-Server von seafile.com herunter und entpacken das Ganze in unserem Home-Verzeichnis in einen Ordner "seafile", den wir zuvor erstellt haben. In dem entpackten Ordner finden wir eine "setup-seafile-mysql.sh", die uns durch das Setup führt, nötige Ordner anlegt und die Datenbanken erstellt. Wenn alles erfolgreich gelaufen ist und man den Server mit seafile.sh start und seahub.sh start startet sollte man ihn bereits vom Hyper-V Host aus aufrufen können - wir wollen es jedoch von überall auf der Welt. Ich habe mir für die beiden Befehle übrigens Scripte erstellt, um den Server schnell zu starten und zu beenden.

MariaDB-Users

Schritt 4: Seafile konfigurieren

Nun kommt der Punkt an dem wir Seafile mitteilen, was wir gern hätten. Dazu müssen wir diverse Config-Datein ändern. Zuerst öffnen wir die Datei ccnet.conf und ändern die Service-URL so, wie wir sie später aufrufen wollen, z.B.:

  • SERVICE_URL = https://example.net/seafile

Alles weitere fügen wir in der seahub_settings.py hinzu:

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

An dieser Stelle kommt ein etwas schmutziger Trick zum Einsatz, der leider mit jeder neuen Seafile-Version wiederholt werden muss. Wir starten Seafile im FastCGI-Modus, standardmäßig ist das Interface dann aber nur vom localhost aus erreichbar - wir wollen jedoch von unserem Hyper-V Host mit Apache darauf zugreifen. Deshalb öffnen wir die seahub.sh, suchen die Funktion function start_seahub_fastcgi () und tragen in dem dortigen Python-Aufruf die IP der VM ein:

  • $PYTHON "${manage_py}" runfcgi host="192.168.137.10" port=$port pidfile=$pidfile

Wenn das abgeschlossen ist starten wir Seafile mit den Befehlen seafile.sh start und seahub.sh start-fastcgi.

Schritt 5: Samba-Share einrichten

Nun haben wir jedoch ein weiteres Problem: Unser Apache braucht die Dateien aus dem media-Ordner um CSS & JavaScript-Datein auszuliefern, aber wie kommen wir da ran? Ich entschied mich für einen Samba-Share, da es bei Hyper-V keinen Shared Folder wie bei VirtualBox gibt. Wir installieren also schnell einen Samba-Server und editieren anschließend die Datei /etc/samba/smb.conf:

  • [media]
  •   comment = Media
  •   browseable = yes
  •   path = /home/user/seafile/seafile-server-latest/seahub/media
  •   guest ok = yes
  •   read only = yes
  •   force user = sysop
  •   force group = sysop

Aber selbst nach dieser Maßnahme haben wir das Problem, dass die Avatare nicht korrekt eingesetzt werden, da Seafile sich dafür eines Symlinks bedient, dem Samba standardmäßig nicht folgen kann und will. Hier muss jeder für sich entscheiden, ob er die Inhalte der beiden Ordner in regelmäßigen Abständen synchronisieren will oder es Samba erlaubt, dem Symlink zu folgen.

Schritt 6: Apache auf dem Host konfigurieren

Nun wird es aufregend, es ist nämlich fast geschafft. Wir müssen nun lediglich unserem Apache mitteilen, wie er an unseren Seafile-Server herankommt. Dafür öffnen wir die Datei, in der unser VirtualHost definiert ist und fügen folgende Zeilen hinzu:

  • Alias /media //192.168.137.10/media
  • RewriteEngine On
  • <Location /media>
  •   Require all granted
  • </Location>
  • ProxyPass /seafhttp http://192.168.137.10:8082
  • ProxyPassReverse /seafhttp http://192.168.137.10:8082
  • RewriteRule ^/seafhttp - [QSA,L]
  • SetEnvIf Request_URI . proxy-fcgi-pathinfo=unescape
  • SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
  • ProxyPass /seafile fcgi://192.168.137.10:8000/seafile

Nach einem Neustart von Apache sollte der Seafile-Server nun unter der gewünschten Adresse erreichbar sein.

Aktueller Seafile-Server unter Windows