Mein Projekt

In der heutigen Zeit wird im IT-Bereich immer öfter mit einer Cloud gearbeitet.
Egal ob Texte, Bilder, Musik oder Videos, alles wird nicht nur auf dem aktuellen Gerät gespeichert,
sondern zusätzlich automatisch auf einem externen Server, einer sogenannten Cloud.
Über die Sicherheit einer Cloud, bei einem Anbieter, kann man sicherlich geteilter Meinung sein.
Auch ich erkannte die Vorteile einer Cloud, allerdings wollte ich nicht irgendeinen Cloud-Anbieter nutzen.
Mein Cloud-Server soll in meiner Wohnung stehen und nur ich habe Zugriff auf dort gespeicherten Daten.
Ein normaler PC, als Server, verbraucht für meine Verhältnisse zu viel Strom und ist somit zu teuer.
Sehr preiswert wird es, wenn man einen Raspberry Pi nutzt.
So ein Gerät verbraucht nur minimalen Strom und ist auch in der Anschaffung erschwinglich.
Leider war mein Raspberry Pi 3b mit 1 GB Ram etwas zu schwach für einen Dauerbetrieb.
Mit einem Mini-PC der Firma ASUS fand ich das für mich passende Gerät.
Ein Arbeitsspeicher von 8 GB Ram sind zwar nicht wirklich viel, doch sie reichen vollkommen aus.
Das vorhandene DVD-Laufwerk wurde durch eine Festplatte ersetzt.
Somit sind im Gerät nun zwei Festplatten.
1.) 320 GB
2.) 1 TB
Zusätzlich sind noch 2 USB3-Platten (2 TB und 4 TB) angeschlossen.
 
Welche Software auf so einem privaten Server laufen soll, ist eine Frage des Geschmacks.
Man kann vieles machen, doch ich wollte mich auf grundlegende Funktionen beschränken.
Den Server als DNS-Server nutzen und eventuell sogar Internet-Werbung permanent per Pi-Hole blockieren,
geht mir etwas zu weit. Auch brauche ich keinen Mail-Server.
Mein Server soll als NAS, private Cloud und als Medien-Server fungieren.
Einen NAS-Server (Network Attached Storage) einrichten ist relativ leicht.
Unter fast jedem Betriebssystem gibt es die Möglichkeit einen Ordner für das heimischen Netzwerk freizugeben.
Etwas anderes ist ein NAS gar nicht.
***
Sucht man im Internet nach Cloud-Software, so findet man neben diversen relativ unbekannten,
die drei wohl bekanntesten (Owncloud, Nextcloud und Seafile) Programme.
Owncloud und Nextcloud sind fast identisch.
Bei Owncloud gibt es kostenpflichtige Funktionen, die aber nicht unbedingt benötigt werden.
Nextcloud kann komplett kostenlos genutzt werden.
Viele Nutzer freuen sich sich über Funktionen wie einen Kalender, einen eingebauten Viren-Scanner
oder Dateien gleichzeitig von mehreren Nutzern bearbeiten zu können.
Für mich sind das alles Luxusfunktionen, die ich nicht benötige.
Ich habe beide Programme ausprobiert.
Für mich sind sie relativ langsam, was vermutlich der Programmsprache PHP zu verdanken ist.
Seafile läuft unter Python und ist wesentlich flotter.
Allerdings bietet es nur die Grundfunktionen Dateien automatisch auf dem Server zu speichern
und sie für andere Geräte zur Verfügung zu stellen.
Also genau das, was ich mir von einer Cloud-Software wünsche.
Achtung !!!
Vom Seafile-Server gibt eine kostenlose und eine kostenpflichtige Pro- Version.
So erhält man bei der Pro-Version Support direkt vom Entwickler.
Bei Problemen mit der kostenlosen Version darf man sich an diverse Supportforen wenden.
***
Was ist eigentlich ein Medien-Server ?
Wer eine grössere Musik- oder Video- Sammlung auf seinem Computer besitzt, wird eine Möglichkeit suchen,
diese Dateien auf allen Geräten im Netzwerk, oder sogar über das Internet, abspielen zu können.
***
Externe Vorbereitungen
Der eigentliche Server ist noch längst nicht eingerichtet,
trotzdem sollte man bereits an anderer Stelle ein paar Dinge erledigen.
a) feste IP
Ein Server sollte möglichst eine feste IP-Adresse haben.
Nur so kann er immer unter der identischen Adresse gefunden werden.
Im angeschlossenen Router sollte es dazu eine recht einfache Möglichkeit geben.

Eine feste IP-Adresse sollte möglichst immer im Router festgelegt werden.
Zwar geht es auch direkt am Rechner, doch das kann zu Adress-Konflikten führen
und der Rechner wäre dann gar nicht mehr erreichbar.
Schwieriger sieht es mit der eigenen IP-Adresse aus.
Bei jeder Anmeldung erhält man von seinem Provider (Internet-Anbieter) eine IP-Adresse.
Das kann, muss aber nicht, immer die gleiche IP-Adresse sein.
Wer keine feste IP-Adresse hat, der kann z.B. einen DynDNS-Service nutzen.
Dabei wird eine Internetadresse mit einer dynamischen IP-Adresse verbunden.
Bei jedem IP-Wechsel meldet der Router diese neue IP der Service-Seite
und so bleibt der heimische Server trotzdem immer über die Adresse erreichbar.
b) Port-Freigaben

Gerät / Name IP-Adresse Freigaben Port extern IPv4 Port extern IPv6
Servername Server-IP HTTP-Server 80  
    HTTPS-Server 443  
    Seafile 8000  
    Seafile 8002  
    HTTP-Server   80
    HTTPS-Server   443
    Seafile   8000
    Seafile   8002

***
Nachdem die Hardware feststeht und auch klar ist welche Software laufen soll, fehlt noch das Betriebssystem.
Beim Raspberry Pi habe ich es mit Raspian probiert.
Später beim ASUS-Computer wurden verschiedene Betriebssystem versucht.
Außer Debian und Ubuntu habe ich kaum ein Betriebssystem richtig zum Laufen gebracht.
Schließlich fiel meine Entscheidung auf Ubuntu-22.04-live-Server-Edition.
Bereits während der Installation wurden die beiden internen Festplatten eingerichtet.

Festplatte/Partition Einhängepunkt Größe
sda    
sda1 /boot 1 GB
sda2 / 30 GB
sda3 /home 30 GB
sda4 swap 8 GB
sda5 /mnt/intern1 250 GB
sdb    
sdb1 /mnt/intern2 1.000 GB

1.) Cloud-Init deaktivieren und entfernen
Die Ubuntu-live-Server-Edition bringt eine Cloud-Funktion mit.
Damit sollen irgendwelche Dinge wesentlich einfacher sein.
Sorry, aber mich nervt diese Funktion nur.
Unmittelbar nach der Ubuntu Installation wird sie entfernt.
Zunächst muss sie deaktiviert werden.

sudo nano /etc/default/grub

Die Zeile

GRUB_CMDLINE_LINUX=""

wird geändert zu

GRUB_CMDLINE_LINUX="cloud-init=disabled"

Mit strg+0 die Datei speichern
und mit strg+x nano beenden.

sudo update-grub

und schließlich noch ein Neustart des Rechners.

sudo reboot now

Nun kann die Cloud-Funktion entfernt werden.

sudo apt purge cloud-init -y

Noch ein paar Reste löschen

sudo rm -rf /etc/cloud
sudo rm -rf /var/lib/cloud

und es folgt wieder ein Neustart. Dieses Mal komplett ohne die Cloud-Funktion.

sudo reboot now

2.) Multipathing deaktivieren und entfernen
Auf richtig großen Servern kann es notwendig sein, dass das System eine Datei über verschiedene Wege finden kann.
Diese Funktion nennt sich Multipathing.
Auf einem kleinen Homeserver wird sie nicht gebraucht. Im Gegenteil, da kann sie zu Fehlern führen.
Also wird diese Funktion deaktiviert und gelöscht.

sudo systemctl stop multipathd.service
sudo systemctl disable multipathd.service
sudo apt remove multipath-tools -y
sudo apt purge multipath-tools -y

3.) System aktualisieren
Klar, Ubuntu wurde gerade eben erst installiert, trotzdem wird es verschiedene Updates geben.
Die herunter geladene ISO-Datei enthält ja das komplette Betriebssystem und wird nicht bei jedem Update erneuert.

sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y

Das kann schon ein paar Minuten dauern.
4.) WOL (Wake-up On Lan) einrichten
Ein Server soll zwar rund um die Uhr an 365 Tagen im Jahr laufen,
trotzdem braucht man eine Möglichkeit ihn aus der Ferne starten zu können.
Zuerst werden Netzwerktools installiert.

sudo apt install ethtool -y

Möglicherweise wurden diese Tools bereits mit Ubuntu installiert.
Dann wird man freundlich darauf hingewiesen, dass es bereits vorhanden ist.
Mit dem Befehl

ip link

lässt man sich alle vorhandenen Netzwerkschnittstellen anzeigen.
Mindestens eine sollte aktiv sein. Deren Bezeichnung merkt man sich.
Bei mir ist es enp4s0, aber das muss nicht immer so sein.
Nun kann WOL einmalig gestartet werden.

sudo ethtool -s enp4s0 wol g

Würde der Rechner nun heruntergefahren, so könnte er über das Netzwerk neu gestartet werden.
Das funktioniert allerdings immer nur ein Mal.
Die Funktion muss also nach jedem Neustart neu aktiviert werden.
Man legt also eine Autostart-Funktion an, die genau diese Funktion beinhaltet.
Dazu wird zunächst eine Datei angelegt.

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

Deren Inhalt:

[Unit]
Description=Configure Wake-up On LAN
[Service]
Type=oneshot
ExecStart=/sbin/ethtool -s enp4s0 wol g
[Install]
WantedBy=basic.target

Bitte wieder mit strg+o abspeichern und mit strg+x nano beenden.
Schließlich muss die neue Funktion noch im System aktiviert werden.

sudo systemctl enable wol.service
sudo systemctl daemon-reload

Achtung !!!
Wake-up On Lan muss auch im BIOS des Rechners aktiviert werden.
Wie das genau funktioniert ist vom Gerät abhängig und kann hier nicht erklärt werden.
Beispiel:
BIOS -> Power -> Power On By PME (Enabled)

5.) Grundeinstellungen
- feste IP <- sollte immer im Router gemacht werden
- SSH Zugang <- kann während der Ubuntu-Installation bereits angelegt werden, oder später per

sudo apt install openssh-server -y

- Sprachen
Mit dem Befehl

sudo dpkg-reconfigure locales

gelangt man in die Einstellungen für die Sprachen des Systems.
de_DE.UTF-8 <- Sprache des Nutzers Deutsch
en_US.UTF-8 <- wird später von Seafile benötigt
Beide Sprachpakete sollten aktiviert werden.
- Zeitzone
Ähnlich wie bei den Sprachen gelangt man mit einem Befehl in die Einstellungen.

sudo dpkg-reconfigure tzdata

Für Deuschland sollte Europa -> Berlin gewählt werden.
- Tastatur
Wurde bei der Ubuntu-Installation versehentlich die Tastatur falsch eingerichtet, so kann man es nachträglich korrigieren.
Ist die Tastatur am Server angeschlossen

sudo dpkg-reconfigure keyboard-configuration

Wird der Server hingegen per SSH bedient

sudo nano /etc/default/keyboard

6.) USB-Festplatten einbinden
Wird eine USB-Festplatte mit dem Computer verbunden, während dieser läuft, so wird sie von Ubuntu nicht erkannt.
Bitte das Gerät herunterfahren,

sudo shutdown now

dann die USB-Festplatten mit dem Computer verbinden und diesen wieder starten.
Für meine zwei USB-Festplatten werden zwei neue Ordner angelegt.

sudo mkdir /mnt/extern1
sudo mkdir /mnt/extern2

Mit dem Befehl

sudo blkid

lässt man sich alle angeschlossenen Festplatten und deren Partitionen anzeigen.
Die PARTUUIDs der USB-Festplatten werden notiert.
Das kann so aussehen:

PARTUUID="f10d43e9-01"
PARTUUID="fc104aae-f985-47bb-bee3-d6259bd115b6"

Damit die USB-Festplatten immer im gleichen Ordner zur Verfügung stehen, wird die Datei fstab editiert.

sudo nano /etc/fstab

Für jede der Festplatten wird dort, ganz am Ende der Datei, eine neue Zeile eingefügt.

# USB-Festplatten
PARTUUID=f10d43e9-01 /mnt/extern1 auto nosuid,nodev,nofail,x-gvfs-show 0 0
PARTUUID=fc104aae-f985-47bb-bee3-d6259bd115b6 /mnt/extern2 auto nosuid,nodev,nofail,x-gvfs-show 0 0

Nach einem Neustart sollten die Festplatten in den Ordnern zur Verfügung stehen.

sudo reboot now

Mit

cd /mnt/intern1
ls -l

lässt man sich den Inhalt vom Ordner intern1, also von einer Partition anzeigen.
Sollte es dort eine Datei lost+found geben, so kann diese entfernt werden.

sudo rm -rf ./lost+found

Für intern2, extern1 und extern2 wiederholen.
7.) Seafile Vorbereitung
Bevor Seafile installiert werden kann, müssen ein paar andere Dinge erledigt werden.
Seafile benötigt eine Datenbank, daher wird mariadb installiert.

sudo apt update
sudo apt install mariadb-server mariadb-client -y

Die Datenbanksoftware sollte vor der ersten Nutzung etwas abgesichert werden.

sudo mysql_secure_installation

Hier sollten folgende Eingaben gemacht werden:

Englisches Original Deutsche Übersetzung Eingabe
Enter current password for root
(enter for none)
Bitte Root-Passwort eingeben, oder leer lassen und "Return" drücken, wenn das Passwort nicht existiert RETURN
Switch to unix socket
authentication ? [Y/N]
  N
Change root password ? [Y/N] Root-Passwort anlegen ? [Y/N] Y
New password ? neues Passwort eingeben ? PASSWORT
Remove anonymous users ? [Y/N] Anonyme Nutzer entfernen ? [Y/N] Y
Disallow root login remotly ? [Y/N] Remote-root-Zugriff zur Datenbank verbieten ? [Y/N] Y
Remove test database ? [Y/N] Entfernen der Test-Datenbank ? [Y/N] Y
Reload privilege tables now ? [Y/N] Änderungen nun übernehmen ? [Y/N] Y

Leider reicht die Datenbank-Software nicht.
Seafile benötigt auch drei Datenbanken und einen Nutzer, der diese Datenbanken verwalten darf.
Man meldet sich als root bei der Datenbank an.
Dann legt man 3 Datenbanken und einen Nutzer an.
Schließlich werden die Nutzungsrechte der Datenbanken an den Nutzer übergeben.

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-USER'@'localhost' IDENTIFIED BY 'PASSWORT';
GRANT ALL ON seafile_db.* TO 'SEAFILE-USER'@'localhost';
GRANT ALL ON ccnet_db.* TO 'SEAFILE-USER'@'localhost';
GRANT ALL ON seahub_db.* TO 'SEAFILE-USER'@'localhost';
FLUSH PRIVILEGES;
QUIT;

Bitte SEAFILE-USER und PASSWORT anpassen und sicher notieren.
Beide Angaben werden später nur an genau einer Stelle benötigt.
Der später anzulegende SEAFILE-USER muss (bzw. sollte) nicht mit dem Datenbanknutzer übereinstimmen.
Ob die Datenbanken ordentlich angelegt wurden und der SEAFILE-USER auch Zugriff darauf hat kann leicht getestet werden.
Man meldet sich als SEAFILE-USER bei der Datenbank an.

sudo mysql -u SEAFILE-USER -p

Mit dem Befehl

SHOW DATABASES;

lassen sich eingerichtete Datenbanken anzeigen.
Das sollte etwa so aussehen:

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

Mit dem Befehl

quit;

wird die Datenbank-Software verlassen.
Wie an anderer Stelle bereits erwähnt läuft Seafile unter Python.
Deshalb müssen neben den drei Datenbanken auch ein paar Python-Module installiert werden.

sudo apt update
sudo apt 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

Das kann einen Moment dauern, doch danach ist man auch schon mit der Seafile-Vorbereitung fertig.
8.) Endlich Seafile installieren
Jede installierte Software besitzt auf der Systempartition einen Ordner in dem alle notwendigen Dateien abgelegt werden.
Dort ist allerdings in der Regel nicht wirklich viel Platz.
Die von Seafile kopierten und gespeicherten Bilder, Musik-Dateien oder Filme gehören dort nicht hin.
Also wird extra für diese Dateien ein zweiter Ordner angelegt.

sudo mkdir /opt/seafile
sudo mkdir /mnt/extern1/seaf

Es ist üblich Software, wie Seafile, nicht als root zu nutzen.
Deshalb wird ein spezieller SEAFILE-NUTZER (seafile) angelegt.

Befehl
sudo adduser seafile --gecos "" --no-create-home --disabled-login
Erläuterung
--gecos "" Die sonst üblichen Fragen nach Name, Wohnort usw werden übersprungen
--no-create-home Der neue Nutzer benötigt kein home-Verzeichnis
--disabled-login Der neue Nutzer darf sich nicht direkt beim System anmelden

Als nächstes werden die Eigentumsrechte der erstellten Ordner an den Nutzer seafile übergeben.

sudo chown -R seafile:seafile /opt/seafile
sudo chown -R seafile:seafile /mnt/extern1/seaf

Nun wechselt man zum Nutzer seafile und geht in den Ordner /opt/seafile

sudo su seafile
cd /opt/seafile

Im Internet, z.B. auf der Seite von Seafile, sucht man nach der aktuellen Versionsnummer.
Es folgt der Download der aktuellen Seafile-Server-Datei.
Anschließend wird dieses Archiv extrahiert.

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

Danach wird der Ordner ./seafile-server-8.0.8 betreten und die eigentliche Installation gestartet.

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

Folgende Eingaben werden erwartet:

Server Name:  
Server-IP oder Domain:  
Fileserver Port: (standard ist 8082) 8082 oder RETURN
Neue Datenbanken anlegen (1)
oder vorhandene nutzen (2) ?
2
mysql server host: (standard ist localhost) localhost oder RETURN
mysql server port: (standard ist 3306) 3306 oder RETURN
mysl Nutzer: SEAFILE-NUTZER wie oben angelegt
mysql Nutzer Passwort: PASSWORT, wie oben angelegt
ccnet Datendank: 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 die Seafile-Server-Software gestartet werden.

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

Beim ersten Start von seahub wird ein Administratoren-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/extern1/seaf
ln -s /mnt/extern/seaf/seafile-data/ /opt/seafile/seafile-data

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

exit

9.) Webserver nginx installieren
Damit Seafile auch über eine Webseite erreichbar wird, benötigt man einen Webserver.

sudo apt install nginx -y

Nginx sollte gestartet und als Systemfunktion aktiviert werden.

sudo systemctl start nginx
sudo systemctl enable nginx

Für jede per nginx erreichbare Webseite gibt es mindestens eine Konfigurationsdatei.
Die Konfiguration der Standardseite kann gelöscht werden.

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

Schließlich wird eine neue Konfigurationsdatei für Seafile angelegt.

sudo nano /etc/nginx/conf.d/seafile.conf

Inhalt:

server {
    listen 80;
    listen [::]:80;
    server_name  SERVER-DOMAIN;
    autoindex off;
    client_max_body_size 100M;
    access_log /var/log/nginx/seafile.com.access.log;
    error_log /var/log/nginx/seafile.com.error.log;

     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;
        }

     location /seafhttp {
            rewrite ^/seafhttp(.*)$ $1 break;
            proxy_pass http://127.0.0.1:8082;
            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;
        }

    location /media {
            root /opt/seafile/seafile-server-latest/seahub;
        }
}

Jetzt noch nginx neu starten

sudo nginx -s reload

und die neue Seite sollte erreichbar sein.
10.) Seafile als Systemservice mit Autostart
Es werden zwei neue Dateien angelegt.

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

Inhalt:

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

[Service]
User=seafile
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

und

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

Inhalt:

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

[Service]
User=seafile
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

Anmerkung:
In der offiziellen Anleitung von Seafile sieht der Inhalt dieser Datei etwas anders aus.
Die Zeilen

After=seafile.service
ExecStartPre=/bin/sleep 10

fehlen dort. Ich musste sie einfügen damit die Software bei mir ordentlich funktioniert.
Nun noch alle Systemfunktionen neu starten, seafile und seahub starten und als Systemfunktion aktivieren.

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

Hurra !!! Hurra !!! Seafile läuft.
11.) Jellyfin Installation
Zuerst wird eine möglicherweise vorhandene alte sources-list für Jellyfin entfernt.

sudo rm /etc/apt/sources.list.d/jellyfin.list

Dann wird noch fehlende Software installiert

sudo apt install apt-transport-https

und das Software Repositorium universe hinzugefügt.

sudo add-apt-repository universe

Die nächsten beiden Befelszeilen verstehe ich selbst nicht genau, aber sie sind wohl wichtig:

curl -fsSL https://repo.jellyfin.org/ubuntu/jellyfin_team.gpg.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/debian-jellyfin.gpg
echo "deb [arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/ubuntu $( lsb_release -c -s ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list

Dann kann Jellyfin normal installiert werden.

sudo apt update
sudo apt install jellyfin -y

Wie bei Seafile wird auch für Jellyfin eine Konfigurationsdatei für Nginx erstellt.

sudo nano /etc/nginx/conf.d/jellyfin.conf

Inhalt:

server {
      listen 80;
      server_name SERVER-DOMAIN;

      access_log /var/log/nginx/jellyfin.access;
      error_log /var/log/nginx/jellyfin.error;

      set $jellyfin 127.0.0.1;

      location / {
          proxy_pass http://127.0.0.1:8096;
          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-Proto $scheme;
          proxy_set_header X-Forwarded-Protocol $scheme;
          proxy_set_header X-Forwarded-Host $http_host;

          # Disable buffering when the nginx proxy gets very resource heavy upon streaming
          proxy_buffering off;
      }

      # location block for /web - This is purely for aesthetics so /web/#!/ works instead of having to go to /web/index.html/#!/
      location ~ ^/web/$ {
          # Proxy main Jellyfin traffic
          proxy_pass http://$jellyfin:8096/web/index.html/;
          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-Proto $scheme;
          proxy_set_header X-Forwarded-Protocol $scheme;
          proxy_set_header X-Forwarded-Host $http_host;
      }

      location /socket {
          # Proxy Jellyfin Websockets traffic
          proxy_pass http://$127.0.0.1:8096;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          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-Proto $scheme;
          proxy_set_header X-Forwarded-Protocol $scheme;
          proxy_set_header X-Forwarded-Host $http_host;
      }

        # Security / XSS Mitigation Headers
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Content-Type-Options "nosniff";

}

Das war es schon fast.
11.) aus HTTP wird HTTPS
Will man Seafile und/oder Jellyfin über das Internet erreichbar machen,
so sollte ein Sicherheitszertifikat eingebunden werden.
Wie üblich wird etwas Software benötigt.

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

Anschließend kann diese Software, unter Angabe der Server-Domain, gestartet werden.
Mit Server-Domain ist die Internetadresse gemeint, unter der die Seafile-Seite erreichbar ist.

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

Folgende Angaben müssen gemacht werden:

Email-Adresse des Administrators:  
AGBs annehmen ?  
Darf die Emailadresse für Werbung genutzt werden ? n
(1) Keine Änderungen vornehmen
(2) alle notwendigen Änderungen an den Seiteneinstellungen vornehmen ?
2

Da auch Jellyfin über eine Webseite verfügt wird der obige Befehl erneut eingegeben.
Allerdings wird dieses Mal als SERVER-DOMAIN eben die Adresse von Jellyfin genutzt.

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

Die Fragen brauchen nicht erneut beantwortet werden.
Schließlich muss auch der seahub-Service auf https umgestellt werden.
Man stoppt seafile und seahub,

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

wechselt dann erneut zum SEAFILE-Nutzer seafile,

sudo su seafile

geht in den seafile-Ordner

cd /opt/seafile/conf

öffnet dort die seahub_settings.py Datei

nano ./seahub_settings.py

und ändert in der Zeile

FILE_SERVER_ROOT = http...

das http zu https. Dann kann der Nutzer seafile wieder verlassen werden.

exit

und sowohl seafils als auch seahub werden wieder gestartet.

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

Wieder ist ein Teil der Server-Installation erledigt. Hurra !!!
12.) Einfaches Network Attached Storage per Samba einrichten
Na, womit wird angefangen ?
Richtig !!! Es wird Software installiert.

sudo apt install samba -y

Damit ein Nutzer auf Samba-Freigaben zugreifen kann, muss er zur Gruppe der Samba-Nutzer gehören.
Der einfachste Weg dies zu erledigen ist ihm ein Passwort für Samba zu geben.

sudo smbpasswd -a NUTZER

Bevor irgendwelche Ordner freigegeben werden können, müssen sie erst erstellt werden.
Außerdem sollten die Eigentums- und Zugriffsrechte stimmen.

sudo mkdir /mnt/intern1/freigabe
sudo chmod 0777 /mnt/intern1/freigabe
sudo chown -R NUTZER:NUTZER /mnt/intern1/freigabe

sudo mkdir /mnt/intern2/freigabe
sudo chmod 0777 /mnt/intern2/freigabe
sudo chown -R NUTZER:NUTZER /mnt/intern2/freigabe

sudo mkdir /mnt/extern2/jelly
sudo chmod 0777 /mnt/extern2/jelly
sudo chown -R jellyfin:jellyfin /mnt/extern2/jelly

Der Nutzer jellyfin wurde bei der Installation von Jellyfin automatisch angelegt.
Die Eigentums- und Zugriffsrechte für /mnt/extern1 wurden bereits an anderer Stelle festgelegt.
Diese Partition dient ausschließlich der Speicherung der Daten von Seafile.
Die samba-Freigaben werden in der Datei smb.conf eingerichtet.
Man kann diese Datei editieren, oder eine neue erstellen

sudo nano /etc/samba/smb.conf

strg+o zum Abspeichern, dabei Name ändern z.B. smb-alt.conf
strg+x nano beenden
Datei erneut öffnen

sudo nano /etc/samba/smb.conf

Nun den kompletten Inhalt löschen (F9 hilft etwas)
neuer Inhalt

[global]
 workgroup = WORKGROUP
 server string = cloud (Samba, Ubuntu)
 wins support = yes
 security = user
 map to guest = Bad Password
[freigabe-1]
 comment = private Dateien
 path = /mnt/intern1/freigabe
 public = no
 writeable = yes
 guest ok = no
 force create mode = 0777
 force directory mode = 0777
 force user = NUTZER
 force group = NUTZER
[freigabe-2]
 comment = Norton-Backup
 path = /mnt/intern2/freigabe
 public = no
 writeable = yes
 guest ok = yes
 force create mode = 0777
 force directory mode = 0777
 force user = NUTZER
 force group = NUTZER
[jelly]
 comment = Filme und Musik von Jellyfin
 path = /mnt/extern2/jelly
 public = yes
 writeable = yes
 guest ok = yes
 force create mode = 0777
 force directory mode = 0777
 force user = jellyfin
 force group = jellyfin

Für /mnt/extern1/seaf wurde keine Freigabe erstellt.
Dort werden die Dateien von Seafile gespeichert.
 
Ein Neustart kann nicht schaden

sudo reboot now