Seafile

Als Voraussetzung wird ein aktuelles Ubuntu-Server 20.4 erwartet.
Schritt 1
Irgendwo muss man ja anfangen, warum also nicht mit der benötigten Datenbank-Software beginnen ?
MariaDB-Server installieren

sudo apt update
sudo apt install mariadb-server -y

Anschließend wird Mariadb-Server etwas abgesichert
So wird zum Beispiel das Root-Passwort für den Zugang zu Datenbank angelegt.

sudo mysql_secure_installation

Hierbei sollten olgende Eingaben gemacht werden:

englisches Original deutsche Übersetzung Eingabe
Enter current password for root
(enter for none)
Bitte Root-Passwort eingeben.
Leer lassen und Return drücken,
wenn dieses Passwort nicht existiert.
RETURN
Set root password  ? [Y/N] Soll das Root-Passwort angelegt werden ? [Y] / [N] Y
New password: Bitte neues Passwort eingeben: PASSWORT
  Bitte neues Passwort erneut eingeben: PASSWORT
Remove anonymous users ? [Y/N] Soll der anonyme Nutzer entfernt werden ? [Y] / [N] Y
Disallow root login remotly ? [Y/N] Soll der remote-root-Zugang zur Datenbank verboten werden ? [Y] / [N] Y
Remove test database ? [Y/N] Soll die Test-Datenbank entfernt werden ? [Y] / [N] Y
Reload privilege tables now ? [Y/N] Sollen die Änderungen nun vorgenommen werden ? [Y] / [N] Y

Seafile nutzt für den Zugang zur Datenbank das "mysql_native_password"-Modul.
Dieses wird nun aktiviert.

sudo mysql -u root
UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE User = 'root';
FLUSH PRIVILEGES;
QUIT;

Nun kann MariaDB genutzt werden.
Man loggt sich als Root ein.
Dann werden drei Datenbanken angelegt, die Seafile später benötigt.
Außerdem wird ein Seafile-Nutzer für die Datenbanken angelegt.
Schließlich werden die Zugriffsrechte an den neuen Datenbanken diesem Nutzer zugeordnet.

sudo mysql -u root -p
enter password: PASSWORT
CREATE DATABASE seafile_db character set = 'utf8';
CREATE DATABASE ccnet_db character set = 'utf8';
CREATE DATABASE seahub_db character set = 'utf8';
CREATE USER 'SEAFILE-NUTZER'@'localhost' IDENTIFIED BY 'PASSWORT';
GRANT ALL ON seafile_db.* TO 'SEAFILE-NUTZER'@'localhost';
GRANT ALL ON ccnet_db.* TO 'SEAFILE-NUTZER'@'localhost';
GRANT ALL ON seahub_db.* TO 'SEAFILE-NUTZER'@'localhost';
FLUSH PRIVILEGES;
QUIT;

Bitte SEAFILE-NUTZER und PASSWORT entsprechend anpassen.
Jetzt sollte sich der neu angelegte Nutzer bei MariaDB anmelden können und sich die angelegten Datenbanken ansehen.

sudo mysql -u SEAFILE-NUTZER -p
password: PASSWORT
SHOW DATABASES;

Das Ergebnis sollte etwa so aussehen:

+--------------------+
| Database           |
+--------------------+
| ccnet_db           |
| information_schema |
| seafile_db         |
| seahub_db          |
+--------------------+
4 rows in set (0.001 sec)
quit;

Die für Seafile benötigten Datenbanken sind angelegt.
Ein neu angelegter Nutzer hat Zugriff darauf.
Schritt 2
Python-Abhängigkeiten
Seafile läuft unter Python, deshalb müssen einige Python-Module installiert werden.

sudo apt-get update
sudo apt-get install python3 python3-setuptools python3-pip libmysqlclient-dev memcached libmemcached-dev -y
sudo pip3 install --timeout=3600 Pillow pylibmc captcha jinja2 sqlalchemy==1.4.3 django-pylibmc django-simple-captcha python3-ldap mysqlclient

Ist diese Installation abgeschlossen, so sind die Python-Abhängigkeiten vorbereitet.
Schritt 3
Seafile-Installation
Die Macher meinen, für Seafile wäre keine Installation notwendig.
Na ja, ich würde die folgenden Schritte schon eine Installation nennen.
Zuerst wird ein Verzeichnis, wo Seafile laufen soll, angelegt.
Bei mir sollen die hochgeladenen Dateien später auf einer USB-Festplatte gespeichert werden.
Diese Festplatte wird unter /mnt/extern gemountet.
Auch dort kommt ein neuer Ordner hin.

sudo mkdir /opt/seafile
sudo mkdir /mnt/extern/seafile

Bei Verzeichnisse können auch an anderen Orten angelegt werden.
Dann müssten das weitere Script entsprechend angepasst werden.
 
Es ist üblich Seafile nicht als root zu nutzen.
Daher wird speziell ein SEAFILE_NUTZER angelegt.

sudo adduser SEAFILE_NUTZER --gecos "" --no-create-home --disabled-login
Kurze Erläuterung  
Option Funktion
--gecos "" Die sonst üblichen Fragen nach realem Namen und weiteren Infos werden ausgelassen
Lediglich sein Passwort wird angelegt.
--no-create-home Ein Home-Verzeichnis wird nicht angelegt.
--disabled-login Der Nutzer kann sich nicht direkt am System anmelden.

Bei dieser Gelegenheit wird auch ein Passwort für diesen neuen Nutzer angelegt.
Diesem Nutzer werden die oben angelegten Ordner zugeordnet.

sudo chown -R SEAFILE_NUTZER: /opt/seafile
sudo chown -R SEAFILE_NUTZER: /mnt/extern/seafile

Die weiteren Schritte werden als SEAFILE_NUTZER gemacht.
Man wechselt in diesen Account und damit in den Seafile-Installations-Ordner.

sudo so SEAFILE_NUTZER
cd /opt/seafile

Von der Download-Seite von Seafile besorgt man sich den Link zur aktuellsten Version.
Bei mir ist es die Version 8.0.7.
Diese Datei wird nun herunter geladen

wget https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seafile-server_8.0.7_x86-64.tar.gz

und anschließend extrahiert

tar xf seafile-server_8.0.7_x86-64.tar.gz

Die herunter geladene Datei wird nicht weiter benötigt.
Man kann sie löschen, verschieben, oder einfach ignorieren.
 
Das Installationspaket bringt ein Script mit, das Seafile einrichtet.
Dieses wird nun gestartet.

cd ./seafile-server-8.0.7
./setup-seafile-mysql.sh

Folgende Eingaben werden dabei erwartet:

server name:  
server-IP oder domain:  
fileserver port ? (standard ist 8082) 8082
Neue Datenbank anlegen [1]
oder vorhandene Datenbank nutzen [2] ?
2
mysql server host ? (standard ist localhost) localhost
mysql server port ? (standard ist 3306) 3306
mysql Nutzer ? wie oben angelegt
mysql Nutzer-Passwort ? wie oben angelegt
ccnet Datenbank ? ccnet_db
seafile Datenbank ? seafile_db
seahub Datenbank ? seahub_db

Die Seafile Konfiguration ist gemacht um hinter einem Proxy zu laufen.
Das wird nun geändert.
Dazu müssen drei Dateien leicht verändert werden.

nano /opt/seafile/conf/ccnet.conf

Hinter der SERVICE_URL steht ein ":8000". Das sollte entfernt werden.
Beispiel: SERVICE_URL = http://1.2.3.4

nano /opt/seafile/conf/gunicorn.conf.py

Hier sollte bind angepasst werden.
Beispiel: bind = "0.0.0.0"

nano /opt/seafile/conf/seahub_settings.py

Hier wird ganz am Ende der Datei eine Zeile angehängt.

FILE_SERVER_ROOT = 'http://DOMAIN-DER-SEITE/seafhttp'

Nun kann Seafile gestartet werden.

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

Beim ersten Start von seahub wird ein Adminstratoren-Account angelegt.
Dazu wird dessen Email-Adresse und sein späteres Passwort abgefragt.
 
Hat das ohne Probleme funktioniert, so können seafile.sh und seahub.sh wieder gestoppt werden.

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

Schließlich kann der Datenordner verschoben und nur ein Link zum neuen Ort angelegt werden.

mv /opt/seafile/seafile-data/ /mnt/extern/seafile
ln -s /mnt/extern/seafile/seafile-data/ /opt/seafile/seafile-data

Die Arbeit als SEAFILE_NUTZER ist erledigt.
Sein Account kann wieder verlassen werden.

exit

Schritt 4
Nginx installieren

sudo apt install nginx -y

Damit nginx beim Systemstart direkt läuft sollte es gestartet und aktiviert werden.

sudo systemctl start nginx
sudo systemctl enable nginx

Nun wird eine leere Konfigurationsdatei für Seafile angelegt.

sudo touch /etc/nginx/sites-available/seafile.conf

danach können die Standard-Dateien gelöscht werden.

sudo rm -rf /etc/nginx/sites-enabled/default
sudo rm -rf /etc/nginx/sites-available/default

Außerdem wird noch ein Link benötigt.

sudo ln -s /etc/nginx/sites-available/seafile.conf /etc/nginx/sites-enabled/seafile.conf

Nun kann die leere Seafile Konfiguration mit Inhalt gefüllt werden.
Bitte anpassen !!!

log_format seafileformat '$http_x_forwarded_for $remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_response_time';

server {
    listen 80;
    server_name DOMAIN-DER-SEITE;

    proxy_set_header X-Forwarded-For $remote_addr;

    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 seafileformat;
         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_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_connect_timeout  36000s;
        proxy_read_timeout  36000s;
        proxy_send_timeout  36000s;

        send_timeout  36000s;

        access_log      /var/log/nginx/seafhttp.access.log seafileformat;
        error_log       /var/log/nginx/seafhttp.error.log;
    }
    location /media {
        root /opt/seafile/seafile-server-latest/seahub;
    }
}

Die Syntax prüfen und falls keine Fehler vorhanden sind nginx neu starten.

sudo nginx -t
sudo nginx -s reload

An dieser Stelle läuft Seafile und ist auch im Browser unter der DOMAIN-DER-SEITE zu erreichen.
Doch das funktioniert nur bis zum nächsten Neustart des Servers.
Es muss noch ein Autostart angelegt werden.
Schritt 5
Autostart
Zuerst geht man kurz in den SEAFILE-NUTZER Account und beendet Seafile.

sudo su SEAFILE-NUTZER
cd /opt/seafile/seafile-server-8.0.04
./seafile.sh stop
./seahub.sh stop
exit

Weiter geht es im normalen Account.
Der Seafile-Service wird angelegt.

sudo nano /etc/systemd/system/seafile.service

Inhalt:

[Unit]
Description=Seafile
After= mysql.service
After=network.target

[Service]
User=SEAFILE-NUTZER
Type=forking
ExecStartPre = /bin/sleep 10
ExecStart=/opt/seafile/seafile-server-latest/seafile.sh start
ExecStop=/opt/seafile/seafile-server-latest/seafile.sh stop

[Install]
WantedBy=multi-user.target

weiter geht es mit dem Seahub-Service

sudo nano /etc/systemd/system/seahub.service

Inhalt:

[Unit]
Description=Seafile
After= mysql.service
After=network.target
After=seafile.service

[Service]
User=SEAFILE-NUTZER
Type=forking
ExecStartPre=/bin/sleep 10
ExecStart=/opt/seafile/seafile-server-latest/seahub.sh start
ExecStop=/opt/seafile/seafile-server-latest/seahub.sh stop

[Install]
WantedBy=multi-user.target

Achtung !!!
In der ursprünglichen Beschreibung von Seafile sehen diese beiden Datei leicht anders aus.
Die Zeile User=SEAFILE-NUTZER fehlt in beiden Dateien.
Zusätzlich musste ich in der seahub.service-Datei die Zeilen
"Ater=seafile.service" und "ExecStartPre=/bin/sleep 10" einfügen.
Ohne diese Änderungen läuft es, zumindest bei mir, nicht.
 
Schließlich müssen seafile.service und seahub.service noch gestartet und aktiviert werden.

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

Von nun an läuft Seafile auf dem Server.
Auch ein Neustart des Gerätes ist kein Problem mehr.
Seafile ist unter der DOMAIN-DER-SEITE in jedem Browser erreichbar.
Na ja, so ganz stimmt das leider noch nicht.
Auch im heimischen Router sind noch ein paar Einstellungen notwendig.
1. Der Server benötigt eine feste IP.
In den Einstellungen einer Fritz!Box
Heimnetz -> Netzwerk -> Einstellungen des Server bearbeiten ->
Diesem Gerät immer die gleiche IP-Adresse zuweisen.
2. Portfreigaben einrichten
In den Einstellungen einer Fritz!Box
Internet -> Freigaben -> Gerät für Freigaben hinzufügen - Server auswählen

Freigabe Port extern vergeben IPv4 Port extern vergeben IPv6
HTTP-Server 80 80
HTTPS-Server 443 443
Seafile 8000 8000
Seafile 8082 8082

Schritt 6
Wenn Seafile auch über das Internet erreichbar sein soll,
so sollte man unbedingt vom unsicheren HTTP auf das sichere HTTPS umstellen.
Zuerst werden seafile.service und seahub.service beendet.

sudo systemctl stop seafile.service
sudo systemctl stop seahub.service

Nun wird ein Python3 Modul installiert.

sudo apt update
sudo apt install python3-certbot-nginx -y

Welches dann gestartet wird.

sudo certbot --authenticator standalone --installer nginx -d DOMAIN-DER-SEITE --pre-hook "service nginx stop" --post-hook "service nginx start"

Bitte anpassen !!
Man muß ein paar Fragen beantworten:

Email-Adresse des Administrators:  
AGBs annehmen ? a
Darf die Email-Adresse für Werbung genutzt werden ? n
[1] keine Änderungen vornehmen
[2] alle notwendigen Änderungen an den Seiteneinstellungen vornehmen
2

Damit auch der Upload von Dateien funktioniert muss leider noch die FILE_SERVER_ROOT in der Datei seahub_settings.py angepasst werden.
Kurzer Wechsel in den SEAFILE-NUTZER Account,
die Datei anzeigen lassen
und aus dem FILE_SERVER_ROOT = http... ein FIE_SERVER_ROOT = https... machen.
Schließlich den SEAFILE-NUTZER Account wieder verlassen.

sudo su SEAFILE-NUTZER
cd /opt/seafile/conf
nano ./seahub_settings.py
FILE_SERVER_ROOT = https...
exit

Zum Schluß noch seafile.service und seahub.service neu starten.

sudo systemctl start seafile.service
sudo systemctl start seahub.service

Hurra !!! Hurra !!!
Es ist geschafft,