Aktionen

Seafile Server - Installation auf Ubuntu 24.04.x LTS

Aus znilwiki

ACHTUNG-BAUSTELLE.png

Dieses Thema ist noch nicht vollständig! Es wird noch daran gearbeitet!


Changelog:

  • 13.06.2024 erste Version
  • 13.10.2024 ping und pong ergänzt, automatisches laden der Python Umgebung

Installation Ubuntu Server 24.04.x LTS (Long Term Support)



Einstellungen für die VM

Falls Ihr den Seafile-Server als virtuelle Maschine (VM) installiert so könnt Ihr Beispielsweise folgenden Einstellungen nehmen. Diese berücksichtigen auch die Mindestanforderungen von Ubuntu 24.04

  • Konfiguration: Typisch
  • Name und Speicherort: Nach eigener Wahl
  • Speicher: Nach eigener Wahl
  • Gastbetriebssystem: (*) Linux --> Ubuntu (64-Bit)
  • Netzwerk:
    • Wie viele Netzwerkkarten möchten Sie anschließen: 1
    • Netzwerk: Nach Wahl (VM Network?)
    • Adapter: VMXNET 3
  • Größer der virtuellen Festplatte:
    • Hängt von der Anzahl der überwachten Geräte / Items ab.
    • Ich empfehle min 32GB für das Betriebssystem des Servers. Für die Datenpartition hängen wir später noch eine zweite Festplatte an.
    • Die Festplatte kann bei einer VM nachträglich vergrößert werden - siehe dazu den Abschnitt in diesem Artikel weiter unten
    • Thick-Provision Lazy-Zeroed

Danach Einstellungen der VM bearbeiten: Reiter Hardware:

  • Arbeitsspeicher:
    • 4GB oder mehr
  • CPUs:
    • Anzahl der virtuellen Sockets
      • 4 oder mehr
    • Anzahl der Cores pro Socket: 1 (Immer Anzahl der Sockets erhöhen)

Reiter Optionen

  • ...




Grundinstallation

Important.png
Hinweis: Ich habe die offizielle ISO verwendet: https://ubuntu.com/download/server


CD einlegen und los,
die Fragen beantwortet Ihr wie folgt (sind ggf. die Überschriften der Dialoge):

ClipCapIt-240527-140258.PNG Try or Install Ubuntu Server
ClipCapIt-240527-140440.PNG Deutsch
ClipCapIt-220427-115808.PNG German / German
Wenn er einen neueren Installer findet und fragt ob er auf diesen aktualisieren soll - Ja!
Install Ubuntu2204 Pic2.png Ubuntu Server
ClipCapIt-220427-120131.PNG Jetzt könnt Ihr schon die gewünschte feste IP-Adresse einstellen. Wählt dazu mit den Pfeiltasten den ens160 Eintrag aus und drückt Enter:
ClipCapIt-200521-152546.PNG ens192 => Bearbeite IPv4
ClipCapIt-200521-152642.PNG Manuell
ClipCapIt-200521-152742.PNG Bei Subnetz kommt nicht die Subnetzmaske sondern das Netzwerk mit Suffix. Bei einer 24 Maske (= 255.255.255.0) ist das die IP 0 mit Suffix /24
ClipCapIt-200521-153302.PNG Erledigt
ClipCapIt-220427-120259.PNG Bei Bedarf, sonst leer lassen
ClipCapIt-220427-120335.PNG Erledigt
ClipCapIt-220427-120400.PNG Nutzt die ganze Festplatte ohne LVM (also Haken entfernen). Die Festplatte lässt sich später trotzdem leicht vergrößern
ClipCapIt-220427-120443.PNG Erledigt
ClipCapIt-220427-120505.PNG Fortfahren
ClipCapIt-220427-120827.PNG Den Servernamen festlegen. Ich lege hier den Benutzer installadmin an. Wählt euren Benutzer und Passwort nach Wunsch (Aufschreiben!)

Der Benutzer sollte NICHT seafile sein, den legen wir separat an für den Dienst

ClipCapIt-240527-140937.PNG Falls Ihr Ubuntu Pro habt, könnet Ihr es hier aktiveren, ansonsten einfach [Fortfahren]
ClipCapIt-240527-141106.PNG OpenSSH-Server auswählen => Erledigt (für Zugriff z.B. mit Putty)
ClipCapIt-240527-141137.PNG Erledigt

Ab jetzt heißt es abwarten. Wenn er kann lädt er gleich ein paar Sicherheitsupdates nach:

ClipCapIt-220427-121943.PNG Jetzt neustarten
ClipCapIt-220427-122036.PNG ISO aus der VM entfernen und Enter drücken
ClipCapIt-220427-122152.PNG Nach dem Reboot wartet ab bis diverse Meldungen abgelaufen sind

PuTTY

Ab dieser Stelle könnt Ihr PuTTY oder den SSH Client eurer Wahl nutzen - was ich dringend empfehle. Denn dann könnt Ihr hier vorgeschlagenen Befehle einfach per Copy&Paste übernehmen.
Die IP-Adresse habt Ihr zu diesem Zeitpunkt ja bereits festgelegt:

ClipCapIt-200521-155245.PNG ClipCapIt-200521-155339.PNG ClipCapIt-200521-160706.PNG

Nach der Anmeldung nutze ich immer gerne ein

sudo -i

Damit wechselt man dauerhaft zum root Benutzer und muss nicht vor jedem Befehl ein sudo stellen.


root wieder freischalten

Important.png
Hinweis: Ob nun wie ich immer als root arbeiten wollt oder aber als einfacher Benutzer und dann immer sudo verwendet müsst Ihr selbst wissen
  • Mit Benutzer installadmin anmelden
sudo -i
  • Kennwort des Benutzer installadmin eintippen
passwd root
  • neues Kennwort für "root" 2x eintippen
ClipCapIt-200521-161108.PNG
  • Lokal Anmelden kann man sich nun mit root - aber eine Anmeldung über SSH funktioniert dann immer noch nicht.
  • Damit diese auch funktioniert müsst ihr die sshd_config bearbeiten:
nano /etc/ssh/sshd_config

sucht nach der Zeile (STRG + W ist Suchen) nach

#PermitRootLogin without-password

und stellt den Cursor in die Zeile.
Drückt nun einmal F9 und 2x F10 - damit erstellt Ihr eine Kopie der Zeile.
Ändert die Kopie wie folgt ab:

PermitRootLogin yes
ClipCapIt-200521-161435.PNG

Speichert die Datei (STRG + x, dann y und Enter) und startet den ssh Dienst neu:

systemctl restart ssh.service

Ab dann klappt es auch mit dem SSH-Login für den Benutzer root, z.B. über puTTY
Jetzt 2x

exit

eintippen wodurch sich das PuTTY Fenster schließt - der (eingeschränkte) Benutzer installadmin hat sich somit abgemeldet

Important.png
Hinweis:

Ja, ich persönlich arbeite gerne als root und habe diesen für die Anmeldung freigeschaltet. Was ich nicht mache ist das Login per SSH mit Passwort zu erlauben. Ich hinterlege also immer einen SSH-Key für die Anmeldung und nutze diesen statt des Kennwortes. Die Lösung hier ist einfach gehalten, der Profi mögen anpassen wie er es braucht. Ein Anmeldung als eingeschränkter Benutzer geht natürlich auch, das erste was ich dann immer mache ist ein sudo -i um dauerhaft zum root zu wechseln

Anmelden als root

Startet PuTTY wieder und meldet euch diesmal gleich als Benutzer root an.


nano & Co auf Deutsch

nano war eben z.B. noch auf Englisch, mit

apt install -y language-pack-de

ist es (und vieles andere) auf deutsch.


root farbiger Prompt

Als root anmelden:

nano ~/.bashrc

Zeile 39 (Alt + C aktiviert Zeilennummernanzeige):

#force_color_prompt=yes

ändern zu (# entfernen):

force_color_prompt=yes


nun wieder Abmelden - ab der nächsten Anmeldung ist der neue Prompt aktiv.

ClipCapIt-200521-162422.PNG

Wer den sofort haben will (ohne neu Anmelden):

source ~/.bashrc

Feste IP-Adresse vergeben

Der Server hat dank des neuen Setupdialoges nun bereits eine feste IP-Adresse.
Solltet Ihr an dieser etwas ändern müssen so müssen wir erst das Cloud-Init deaktivieren:

nano /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

Inhalt:

network: {config: disabled}

Dann könnte Ihr in der folgenden Datei etwas ändern, die Warnungen das es einen reboot nicht übersteht könnt Ihr ignorieren, dafür haben wir die andere Datei angelegt.

nano /etc/netplan/50-cloud-init.yaml
ClipCapIt-200521-162802.PNG

Updates einspielen

  • wieder anmelden als root bzw. zum root wechseln
  • Updates suchen für Betriebssystem: (aktualisiert den Katalog aus den Update-Quellen)
apt update
  • Updates einspielen:
apt upgrade -y
  • Nach Update überflüssige Pakete entfernen:
apt autoremove -y


Ich mache das normalerweise immer als Einzeiler:

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




Multipathing deinstallieren (wenn der Server eine VM ist)

Ab Werk wird nun das

/var/log/syslog

mit Multipath-Meldungen vollgemüllt:

2024-05-27T12:32:47.571374+00:00 ubuntu2404 systemd[1]: Started multipathd.service - Device-Mapper Multipath Device Controller.
2024-05-27T12:32:47.592304+00:00 ubuntu2404 kernel: systemd[1]: Listening on multipathd.socket - multipathd control socket.
2024-05-27T12:32:47.592385+00:00 ubuntu2404 kernel: systemd[1]: Starting multipathd.service - Device-Mapper Multipath Device Controller...
2024-05-27T12:32:48.141146+00:00 ubuntu2404 multipathd[467]: sda: failed to get udev uid: No data available
2024-05-27T12:32:48.141212+00:00 ubuntu2404 multipathd[467]: sda: failed to get path uid
2024-05-27T12:32:48.141278+00:00 ubuntu2404 multipathd[467]: uevent trigger error
2024-05-27T12:32:57.634912+00:00 ubuntu2404 multipathd[467]: sda: triggering change event to reinitialize
2024-05-27T12:32:57.667862+00:00 ubuntu2404 multipathd[467]: sda: failed to get udev uid: No data available
2024-05-27T12:32:57.667930+00:00 ubuntu2404 multipathd[467]: sda: failed to get path uid
2024-05-27T12:32:57.667959+00:00 ubuntu2404 multipathd[467]: uevent trigger error
2024-05-27T12:33:07.637080+00:00 ubuntu2404 multipathd[467]: sda: triggering change event to reinitialize
2024-05-27T12:33:07.676773+00:00 ubuntu2404 multipathd[467]: sda: failed to get udev uid: No data available
2024-05-27T12:33:07.676839+00:00 ubuntu2404 multipathd[467]: sda: failed to get path uid
2024-05-27T12:33:07.676865+00:00 ubuntu2404 multipathd[467]: uevent trigger error
2024-05-27T12:33:17.641466+00:00 ubuntu2404 multipathd[467]: sda: triggering change event to reinitialize
2024-05-27T12:33:17.709843+00:00 ubuntu2404 multipathd[467]: sda: failed to get sysfs uid: No such file or directory
2024-05-27T12:33:17.709915+00:00 ubuntu2404 multipathd[467]: sda: failed to get sgio uid: No such file or directory
2024-05-27T12:33:17.709942+00:00 ubuntu2404 multipathd[467]: sda: failed to get path uid
2024-05-27T12:33:17.709969+00:00 ubuntu2404 multipathd[467]: uevent trigger error
2024-05-27T12:33:28.134951+00:00 ubuntu2404 multipathd[467]: sda: not initialized after 3 udev retriggers
2024-05-27T12:33:29.139933+00:00 ubuntu2404 multipathd[467]: sda: add missing path
2024-05-27T12:33:29.140037+00:00 ubuntu2404 multipathd[467]: sda: failed to get sysfs uid: No such file or directory
2024-05-27T12:33:29.140063+00:00 ubuntu2404 multipathd[467]: sda: failed to get sgio uid: No such file or directory
2024-05-27T12:33:29.140086+00:00 ubuntu2404 multipathd[467]: sda: no WWID in state "undef
2024-05-27T12:33:29.140109+00:00 ubuntu2404 multipathd[467]: ", giving up
2024-05-27T12:33:29.140181+00:00 ubuntu2404 multipathd[467]: sda: check_path() failed, removing

Unter Ubuntu 24.04/22.04 scheint es nicht mehr ganz so schlimm wie unter 20.04 - aber in einer VM macht Multipath keinen Sinn, also deaktivieren und deinstallieren um das Syslog von den Meldungen befreien:

systemctl stop multipathd.service && systemctl disable multipathd.service
apt install kpartx libsgutils2-1.46-2 sg3-utils sg3-utils-udev
apt remove -y multipath-tools && apt purge -y multipath-tools

Die apt install Zeile ist da drin weil diese Pakete ggf. von anderen Anleitung vorausgesetzt werden. Die Pakte werden dadurch auf manuell installiert gesetzt und dann nicht bei einem apt autoremove deinstalliert


Cloud-Init deinstallieren (Wenn es keine VM bei einem Cloudanbieter ist)

Wenn Ihr die VM reboootet und die Console betrachtet tauchen kurz nach dem Reboot (Fehler-)Meldungen zum Cloud-init auf:

ClipCapIt-200521-163633.PNG

Das Cloud-Init ist dafür da falls eure VM z.B. bei Amazon AWS, Azure oder andere Anbieter läuft um z.B. die Netzwerkinformationen vom Hoster/Provider zu erhalten.
Auch bei Proxmox kann man das nutzen. Trifft das alles nicht zu - dann weg damit:

echo 'datasource_list: [ None ]' | tee /etc/cloud/cloud.cfg.d/90_dpkg.cfg
apt purge -y cloud-init
rm -rf /etc/cloud/ && sudo rm -rf /var/lib/cloud/
apt install eatmydata libeatmydata1 python-babel-localedata python3-babel python3-jinja2 python3-json-pointer python3-jsonpatch python3-jsonschema python3-markupsafe python3-pyrsistent python3-tz -y
reboot

Die apt install Zeile ist da drin weil diese Pakete ggf. von anderen Anleitung vorausgesetzt werden. Die Pakte werden dadurch auf manuell installiert gesetzt und dann nicht bei einem apt autoremove deinstalliert


Zeitzone setzen

In meiner VM ist die Uhrzeit zu diesem Zeitpunkt falsch (gebt mal probeweise date ein) - weil der ESXi-Host auf UTC Zeit läuft und die Ubuntu in der VM die richtige Zeitzone nicht eingestellt hat.
Wir korrigieren das mit

timedatectl set-timezone Europe/Berlin

ein

date

sollte dann die richtige Uhrzeit ausspucken.


Zeitserver setzen

Important.png
Hinweis: Wenn Ihr diesen Schritt überspringt, wird ntp.ubuntu.com als Zeitserver verwendet

Für die Zeitsynchronisierung ist der Dienst systemd-timesyncd.service zuständig, dieser wird über die Datei

nano /etc/systemd/timesyncd.conf

konfiguriert:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it under the
#  terms of the GNU Lesser General Public License as published by the Free
#  Software Foundation; either version 2.1 of the License, or (at your option)
#  any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file (or a copy of it placed in
# /etc/ if the original file is shipped in /usr/), or by creating "drop-ins" in
# the /etc/systemd/timesyncd.conf.d/ directory. The latter is generally
# recommended. Defaults can be restored by simply deleting the main
# configuration file and all drop-ins located in /etc/.
#
# Use 'systemd-analyze cat-config systemd/timesyncd.conf' to display the full config.
#
# See timesyncd.conf(5) for details.

[Time]
NTP=192.168.1.81
FallbackNTP=192.168.1.198 de.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
#ConnectionRetrySec=30
#SaveIntervalSec=60

Sowohl die Liste der NTP= als auch der FallbackNTP= erwartet eine per Leerzeichen getrennte Liste der möglichen Server.
Laut Anleitung hört der Dienst aber beim ersten Treffer auf zu suchen. In der Praxis setzt also einen NTP-Server und ggf. die Fallback. Setzt Ihr einen Wert nicht, lasst diesen also auskommentiert, so gilt der Default-Wert, beim Fallback gilt dann FallbackNTP=ntp.ubuntu.com.
Nach der Änderung müsst Ihr den Dienst einmal neu starten:

systemctl restart systemd-timesyncd.service

und mit folgenden Befehl könnt Ihr den Status abfragen:

timedatectl show-timesync

Beispielausgabe:

LinkNTPServers=fd00::1eed:6fff:fe71:f1c0
SystemNTPServers=192.168.1.81
FallbackNTPServers=192.168.1.198 de.pool.ntp.org
ServerName=192.168.1.81
ServerAddress=192.168.1.81
RootDistanceMaxUSec=5s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=2min 8s
NTPMessage={ Leap=0, Version=3, Mode=4, Stratum=3, Precision=-23, RootDelay=20.324ms, RootDispersion=28.579ms, Reference=C0A801C6, OriginateTimestamp=Tue 2024-06-04 08:22:24 CEST, 
ReceiveTimestamp=Tue 2024-06-04 08:22:24 CEST, TransmitTimestamp=Tue 2024-06-04 08:22:24 CEST, DestinationTimestamp=Tue 2024-06-04 08:22:24 CEST, Ignored=no, PacketCount=2, Jitter=239us }
Frequency=1158037

Automatische Updates deaktivieren

Ich persönlich möchte nicht das der Zabbix-Server automatisch Updates einspielt.
Die automatischen Updates aktualisieren - soweit ich das beobachten konnte - nur den Kernel. Aber auch das möchte ich nicht. Ich möchte das geplant durchführen.
Die automatischen Updates verhindern wir mit

apt remove -y unattended-upgrades

Zusätzliche Festplatte einbinden

Warning.png
Warnung: In früheren Versionen dieser Anleitung wurde eine MBR Partition erstellt die maximal 2TiB groß werden darf. Wie man diese in einen GPT Datenträger umwandeln würde findet ihr hier: Linux Ubuntu MBR Datenträger in GPT Datenträger umwandeln kein LVM

Die Daten von Seafile sollen auf einer 2. Festplatte gespeichert werden - exklusive der SQL-Datenbank, diese wird auf der Festplatte mit dem Betriebssystem liegen.
Dazu habe ich der VM einfach eine weitere Festplatte mit 50GiB hinzugefügt. Diese können wir später bei bedarf einfach vergrößern.
Nach dem hinzufügen startet Ihr den Server einmal neu.

Zuerst müssen wir herausfinden wie die 2. Festplatte unter Ubuntu heißt:

ls -l /dev/sd*

Ausgabe:

brw-rw---- 1 root disk 8,  0 Jan 29 10:46 /dev/sda
brw-rw---- 1 root disk 8,  1 Jan 29 10:46 /dev/sda1
brw-rw---- 1 root disk 8,  2 Jan 29 10:46 /dev/sda2
brw-rw---- 1 root disk 8, 16 Jan 29 10:46 /dev/sdb

/dev/sda ist die erste Festplatte, sda1 und sda2 sind Partitionen auf dieser.
Unsere Zielfestplatte Platte ist die /dev/sdb
Da wir hier keine /dev/sdb1 sehen hat diese Festplatte noch keine Partitionen.

Ich arbeite hier ohne LVM, die Festplatte können wir später trotzdem leicht vergrößern.

Warning.png
Warnung: Das müsst Ihr nur machen falls Ihr noch keine Partition habt, also kein /dev/sda1 sondern nur /dev/sda


Wir tippen ein:

fdisk /dev/sdb

Da kommt dann etwas Text und die Aufforderung

Willkommen bei fdisk (util-linux 2.39.3).
Änderungen werden vorerst nur im Speicher vorgenommen, bis Sie sich
entscheiden, sie zu schreiben.
Seien Sie vorsichtig, bevor Sie den Schreibbefehl anwenden.

Gerät enthält keine erkennbare Partitionstabelle.
Created a new DOS (MBR) disklabel with disk identifier 0xa720af51.

Befehl (m für Hilfe):

Wir drücken

g

um auf den GPT-Partitionsstil zu wechseln, es sollte eine Zeile wie

Eine neue GPT-Festplattenbezeichnung wurde erstellt (GUID: E27F99AE-C130-4D72-A392-8CD8A9E933B1).

erscheinen. Dann drücken wir

n

um eine neue Partition zu erstellen und dann

1

für die erste Partition.
Dann drückt 2x Enter um die vorgeschlagenen Werte zu übernehmen.

Partitionsnummer (1-128, Vorgabe 1): 1
Erster Sektor (2048-2147483614, Vorgabe 2048):
Letzter Sektor, +/-Sektoren oder +/-Größe{K,M,G,T,P} (2048-2147483614, Vorgabe 2147481599):

Eine neue Partition 1 des Typs „Linux filesystem“ und der Größe 1024 GiB wurde erstellt.

Jetzt sollte da wieder

Befehl (m für Hilfe):

stehen und wir drücken

w

um das ganze auf die Platte zu schreiben.

Das sollte also etwas so aussehen:

root@cloud:~# fdisk /dev/sdb

Willkommen bei fdisk (util-linux 2.39.3).
Änderungen werden vorerst nur im Speicher vorgenommen, bis Sie sich
entscheiden, sie zu schreiben.
Seien Sie vorsichtig, bevor Sie den Schreibbefehl anwenden.

Gerät enthält keine erkennbare Partitionstabelle.
Created a new DOS (MBR) disklabel with disk identifier 0xa720af51.

Befehl (m für Hilfe): g
Eine neue GPT-Festplattenbezeichnung wurde erstellt (GUID: E27F99AE-C130-4D72-A392-8CD8A9E933B1).

Befehl (m für Hilfe): n
Partitionsnummer (1-128, Vorgabe 1): 1
Erster Sektor (2048-2147483614, Vorgabe 2048):
Letzter Sektor, +/-Sektoren oder +/-Größe{K,M,G,T,P} (2048-2147483614, Vorgabe 2147481599):

Eine neue Partition 1 des Typs „Linux filesystem“ und der Größe 1024 GiB wurde erstellt.

Befehl (m für Hilfe): w
Die Partitionstabelle wurde verändert.
ioctl() wird aufgerufen, um die Partitionstabelle neu einzulesen.
Festplatten werden synchronisiert.



Prima, jetzt haben wir eine Partition /dev/sdb1, diese formatieren wir nun mit dem ext4 Dateisystem:

mkfs.ext4 /dev/sdb1

Ausgabe:

mke2fs 1.47.0 (5-Feb-2023)
Ein Dateisystem mit 268434944 (4k) Blöcken und 67108864 Inodes wird erzeugt.
UUID des Dateisystems: bebdb24b-0a38-40bf-bac5-9172c7f4c1cf
Superblock-Sicherungskopien gespeichert in den Blöcken:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

beim Anfordern von Speicher für die Gruppentabellen: erledigt
Inode-Tabellen werden geschrieben: erledigt
Das Journal (262144 Blöcke) wird angelegt: fertig
Die Superblöcke und die Informationen über die Dateisystemnutzung werden
geschrieben: erledigt

Nun müssen wir die Festplatte noch mounten. Seafile werden wir nach

/home/seafile/haiwen

installieren. Deshalb hängen wir die neue Festplatte unterhalb von /home ein. Dort liegt aber noch ggf. das Verzeichnis unseres installadmin, das verschieben wir so lange:

mv /home/installadmin /tmp/installadmin

Mounten wir unsere neue Partition an diesen Pfad:

mount /dev/sdb1 /home/

Prüfen wir ob das geklappt hat:

root@cloudserver:~# df -h
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
tmpfs           391M    1,2M  390M    1% /run
/dev/sda2        32G    7,5G   23G   26% /
tmpfs           2,0G       0  2,0G    0% /dev/shm
tmpfs           5,0M       0  5,0M    0% /run/lock
tmpfs           391M    4,0K  391M    1% /run/user/1000
/dev/sdb1        49G     24K   47G    1% /home

In der letzten Zeile sehen wir das es geklappt hat.
Nun müssen wir dafür sorgen das dies auch beim nächsten Booten automatisch gemacht wird. Dazu brauchen wir die UUID die wir wie folgt herausbekommen:

ls -l /dev/disk/by-uuid/ | grep sdb

Ergebnis bei mir:

lrwxrwxrwx 1 root root 10 Jan 29 11:10 2ead4117-e280-4ac4-8038-f41ef64c1e70 -> ../../sdb1

Nun bearbeiten wir die fstab:

nano /etc/fstab

und hängen unten folgende Zeile an:

/dev/disk/by-uuid/2ead4117-e280-4ac4-8038-f41ef64c1e70 /home ext4 defaults 0 1

Die Werte bedeuten:

/dev/disk/by-uuid/2ead4117-e280-4ac4-8038-f41ef64c1e70   : Pfad mit UUID des Datenträgers
/home                                                    : Das Verzeichnis in das gemountet werden soll
ext4                                                     : Welches Dateisystem soll gemountet werden, ggf. auch mit auto probieren
defaults                                                 : Mit Standardeinstellungen / Rechten mounten, Detail siehe z.B. hier: https://wiki.archlinux.de/title/Fstab
0                                                        : Für den Befehl Dump, 0 bedeutet "keine Systempartition"
0                                                        : Für Dateisystemprüfung, 1 bedeutet "mit Prüfung" einbinden


Bevor wir nun neu Starten verschieben wir noch das installadmin Verzeichnis zurück:

mv /tmp/installadmin /home/installadmin

Als Test nun einen Reboot - danach sollte die Platte weiterhin/wieder eingehängt sein. Das könnte ihr wieder mit df -h kontrollieren:

Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
tmpfs           391M    1,2M  390M    1% /run
/dev/sda2        32G    7,5G   23G   26% /
tmpfs           2,0G       0  2,0G    0% /dev/shm
tmpfs           5,0M       0  5,0M    0% /run/lock
/dev/sdb1        49G     40K   47G    1% /home
tmpfs           391M    4,0K  391M    1% /run/user/1000

Benötigte Pakete installieren

Folgende Programmpakte sollten Installiert sein (ermöglicht sowohl die Community als auch die Professionell Version):

apt install -y apache2 mariadb-server
apt install -y python3 python3-dev python3-setuptools python3-pip libmysqlclient-dev ldap-utils libldap2-dev python3-venv
apt install -y memcached libmemcached-dev

Da ist auch gleich der Apache-Webserver (wird als Reverse-Proxy genutzt) und MariaDB (MySQL-Alternative) für die Datenbanken dabei.


Datenbanken anlegen

Das Setup kann uns auch gleich die Datenbanken anlegen - will dazu aber das Passwort des Benutzers root. Leider hat der kein Passwaort für MySQL/MariaDB also scheitert das Installationsskript.
Deshalb legen wir die 3 Datenbanken + den Benutzer vorher von Hand an:
MySQL-Console öffnen:

mysql

und nacheinander folgende Befehle ausführen:

create database `ccnet-db` character set = 'utf8';
create database `seafile-db` character set = 'utf8'; 
create database `seahub-db` character set = 'utf8';
create user 'seafile'@'localhost' identified by 'seafile';
GRANT ALL PRIVILEGES ON `ccnet-db`.* to `seafile`@`localhost`;
GRANT ALL PRIVILEGES ON `seafile-db`.* to `seafile`@`localhost`;
GRANT ALL PRIVILEGES ON `seahub-db`.* to `seafile`@`localhost`;
FLUSH PRIVILEGES;

und Konsole wieder beenden:

exit

Seafile Benutzer und Verzeichnisse anlegen

Wir erstellen einen Benutzer seafile dessen Home-Verzeichnis gleichzeitig unser Seafile-Installationsordner ist. Den Pfad müsst Ihr ggf. an eure Wünsche oder Verhältnisse anpassen, bei mir ist der ganze freie Speicherplatz unter /home - dort habe ich auch die zusätzliche Festplatte eingehängt.

adduser --disabled-login --gecos "Seafile" seafile --home /home/seafile/

Wir wechseln auf diesen eben neu erstellten Benutzer:

sudo -u seafile /usr/bin/bash

und wechseln in das Heimatverzeichnis des Benutzers - also in

cd /home/seafile/
cd ~

Nun noch schnell 3 Sprachanpassungen damit es nachher keine Fehlermeldungen gibt:

echo "export LC_ALL=de_DE.UTF-8" >>~/.bashrc
echo "export LANG=de_DE.UTF-8" >>~/.bashrc
echo "export LANGUAGE=de_DE.UTF-8" >>~/.bashrc
source ~/.bashrc

Wir erstellen nun einen neuen Ordner haiwen und wechseln in diesen:

mkdir haiwen
cd haiwen

Warum haiwen? Der Ordner heisst "haiwen" weil Seafile wohl so im Chinesischen genannt wird. Ihr könnte auch jeden anderen Namen nehmen, müsst dann aber die Pfade anpassen
Eigentlich soll statt haiwen dann der Name eurer Organisation / Firma verwendet werden.

Important.png
Hinweis: Mit su - seafile wechselt Ihr ja zum Benutzer seafile - mit exit landet Ihr wieder in eurer ursprünglichen Sitzung




Python virtual environment erstellen

Wir sind als Benutzer seafile angemeldet und befinden uns im Ordner /home/seafile/haiwen!

python3 -m venv python-venv
source python-venv/bin/activate

Der Prompt sollte sich auf

(python-venv) seafile@cloud:/home/seafile/haiwen$

ändern.
Und nun die nötigen Python Programme installieren:

pip3 install --timeout=3600 django==4.2.* future==0.18.* mysqlclient==2.1.* pymysql pillow==10.2.* pylibmc captcha==0.5.* markupsafe==2.0.1 jinja2 sqlalchemy==2.0.18 psd-tools django-pylibmc django_simple_captcha==0.6.* djangosaml2==1.5.* pysaml2==7.2.* pycryptodome==3.16.* cffi==1.16.0 lxml python-ldap==3.4.3
Important.png

Hinweis: Anstatt das Enviroment zu erstellen könnte man die Python-Pip-Pakete auch mit dem Schalter --break-system-packages trotzdem installieren.

Aber ich finde das mit den Enviroments gar nicht so schlecht. Läuft Seafile alleine auf einem Server so ist das vermutlich egal

Seafile herunterladen

Important.png
Hinweis:Wir sind zum Benutzer seafile gewechselt und befinden uns im Unterordner /home/seafile/haiwen


Die Dateien die wir herunterladen müssen wir nur entpacken und sind sofort lauffähig.
Also laden wir die Dateien für den Server herunter und entpacken einfach direkt in das Zielverzeichnis.

Version 11.0.12:

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


Entpacken und archivieren:

tar xzfv seafile-server_11.0.12_x86-64.tar.gz
mkdir installed
mv seafile-server_* installed

Die ganze Verzeichnisstruktur sollte nun so aussehen:

/home/
├── installadmin
├── lost+found
└── seafile
    └── haiwen
        ├── installed
        ├── python-venv
        │   ├── bin
        │   ├── include
        │   ├── lib
        │   └── lib64 -> lib
        └── seafile-server-11.0.12
            ├── pro
            ├── runtime
            ├── seafile
            ├── seahub
            ├── sql
            └── upgrade

Seafile Setup ausführen

Wir arbeiten weiter in der Anmeldung als Benutzer seafile (sudo -u seafile /usr/bin/bash) und führen das Setup von Seafile mit MySQL aus:

cd /home/seafile/haiwen/seafile-server-*
./setup-seafile-mysql.sh

Die Dialoge beantwortet Ihr wie folgt:

Checking python on this machine ...

-----------------------------------------------------------------
This script will guide you to setup your seafile server using MySQL.
Make sure you have read seafile server manual at

        https://download.seafile.com/published/seafile-manual/home.md

Press ENTER to continue
-----------------------------------------------------------------


What is the name of the server? It will be displayed on the client.
3 - 15 letters or digits
[ server name ] cloud

What is the ip or domain of the server?
For example: www.mycompany.com, 192.168.1.101
[ This server's ip or domain ] cloud.znil.org

Which port do you want to use for the seafile fileserver?
[ default "8082" ]

-------------------------------------------------------
Please choose a way to initialize seafile databases:
-------------------------------------------------------

[1] Create new ccnet/seafile/seahub databases
[2] Use existing ccnet/seafile/seahub databases

[ 1 or 2 ] 2

What is the host of mysql server?
[ default "localhost" ]

What is the port of mysql server?
[ default "3306" ]

Which mysql user to use for seafile?
[ mysql user for seafile ] seafile

What is the password for mysql user "seafile"?
[ password for seafile ]

verifying password of user seafile ...  done

Enter the existing database name for ccnet:
[ ccnet database ] ccnet-db

verifying user "seafile" access to database ccnet-db ...  done

Enter the existing database name for seafile:
[ seafile database ] seafile-db

verifying user "seafile" access to database seafile-db ...  done

Enter the existing database name for seahub:
[ seahub database ] seahub-db

verifying user "seafile" access to database seahub-db ...  done

---------------------------------
This is your configuration
---------------------------------

    server name:            cloud
    server ip/domain:       cloud.znil.org

    seafile data dir:       /home/seafile/haiwen/seafile-data
    fileserver port:        8082

    database:               use existing
    ccnet database:         ccnet-db
    seafile database:       seafile-db
    seahub database:        seahub-db
    database user:          seafile



---------------------------------
Press ENTER to continue, or Ctrl-C to abort
---------------------------------

Generating ccnet configuration ...

Generating seafile configuration ...

done
Generating seahub configuration ...

----------------------------------------
Now creating seafevents database tables ...

----------------------------------------
----------------------------------------
Now creating ccnet database tables ...

----------------------------------------
----------------------------------------
Now creating seafile database tables ...

----------------------------------------
----------------------------------------
Now creating seahub database tables ...

----------------------------------------

creating seafile-server-latest symbolic link ...  done




-----------------------------------------------------------------
Your seafile server configuration has been finished successfully.
-----------------------------------------------------------------

run seafile server:     ./seafile.sh { start | stop | restart }
run seahub  server:     ./seahub.sh  { start <port> | stop | restart <port> }

-----------------------------------------------------------------
If you are behind a firewall, remember to allow input/output of these tcp ports:
-----------------------------------------------------------------

port of seafile fileserver:   8082
port of seahub:               8000

When problems occur, Refer to

        https://download.seafile.com/published/seafile-manual/home.md

for information.


Im Moment lauscht der Seafile Server nur lokal auf 127.0.0.1:8000 - das müssen wir noch anpassen:

cd ../seafile-server-latest
./seahub.sh stop
nano ../conf/gunicorn.conf.py

und dann die Zeile

bind = "127.0.0.1:8000"

auf

bind = "0.0.0.0:8000"

ändern. Nun können wir Seafile das erste mal starten:

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

Es beginnt die Erstkonfiguration für den Zugriff, ihr müsst einen Benutzer und Passwort festlegen. Der Benutzer muss eine Emailadresse sein:>br>

(python-venv) seafile@cloud:/home/seafile/haiwen/seafile-server-latest$ ./seahub.sh start

Starting seahub at port 8000 ...

----------------------------------------
It's the first time you start the seafile server. Now let's create the admin account
----------------------------------------

What is the email for the admin account?
[ admin email ] AdminX@znil.org

What is the password for the admin account?
[ admin password ]

Enter the password again:
[ admin password again ]



----------------------------------------
Successfully created seafile admin
----------------------------------------




Seahub is started

Done.

Mit der Email-Adresse und dem Passwort könnt Ihr euch nun am Seafile Server anmelden:

http://192.168.1.1:8000
ClipCapIt-240613-155330.PNG




Seafile beim Systemstart automatisch starten

Falls Seafile noch läuft stoppen wir es nun:

sudo -u seafile /usr/bin/bash
/home/seafile/haiwen/seafile-server-latest/seahub.sh stop
/home/seafile/haiwen/seafile-server-latest/seafile.sh stop
exit
Important.png
Hinweis:Wir sind zum stoppen zum Benutzer seafile gewechselt. Für die nächsten Schritte sollten wir wieder der Benutzer root sein



Das Problem ist nun, das vor dem Start von Seafile (bzw. Seahub) immer das Python Eviroment geladen werden muss.
Das geht einfach wenn wir und zunächst ein Hilfsskript bauen, die Lösung stammt von hier: https://forum.seafile.com/t/how-to-setup-and-start-seafile-with-a-python-virtual-environment/16328/2

nano /home/seafile/haiwen/service-wrapper.sh

Inhalt:

#!/usr/bin/env bash
[ $# -ne 2 ] && exit
[[ "$1" == "seafile.sh" || "$1" == "seahub.sh" ]] || exit
[[ "$2" == "start" || "$2" == "stop" || "$2" == "restart" ]] || exit
BASE=/home/seafile/haiwen
source $BASE/python-venv/bin/activate
$BASE/seafile-server-latest/$1 $2

Dann

chmod +x /home/seafile/haiwen/service-wrapper.sh
chown seafile:seafile /home/seafile/haiwen/service-wrapper.sh

Für den Start als Dienst schreibe wir folgende systemd Dienst-Start-Skripte:
Seafile-Service:

nano /etc/systemd/system/seafile.service

Inhalt:

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

[Service]
Type=oneshot
ExecStart=/home/seafile/haiwen/service-wrapper.sh seafile.sh start
ExecStop=/home/seafile/haiwen/service-wrapper.sh seafile.sh stop
RemainAfterExit=yes
User=seafile
Group=seafile

[Install]
WantedBy=multi-user.target


Seahub-Service:

nano /etc/systemd/system/seahub.service

Inhalt:

[Unit]
Description=SeaHub
After=network.target seafile.service

[Service]
# change start to start-fastcgi if you want to run fastcgi
ExecStart=/home/seafile/haiwen/service-wrapper.sh seahub.sh start
ExecStop=/home/seafile/haiwen/service-wrapper.sh seahub.sh stop
User=seafile
Group=seafile
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target


Nun noch aktivieren:

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

Nun können wir Seafile als Dienst starten:

systemctl start seafile.service seahub.service


Ihr könnt den Server auch rebooten - danach sollte wieder auf Port 8000 die Webseite von Seafile erreichbar sein.


Server mit SSL / HTTPS über Apache absichern

Auf meinem Server ist als Webserver der Apache 2 installiert.
Seafile arbeitet im Moment noch an allem vorbei, also müssen wir im ersten Schritt das ganze auf Apache 2 umbauen.



Schritt 1: Umbau auf http Port 80

So, zunächst biegen wir den Zugriff von Port 8000 auf Port 80 um - man kann den Seafile-Server dann also unter seiner Subdomain oder Domain erreichen ohne den Port angeben zu müssen - allerdings noch per http ohne Verschlüsselung. Wenn das funktioniert können wir im Anschluss auf https umbauen.
Als Vorlage habe ich mich an dieser Anleitung orientiert: https://manual.seafile.com/deploy/deploy_with_apache.html

Ich verwende nachfolgenden den Servernamen seafile.znil.net - da muss zum einen euer Servername rein. Zum anderen sollte es eine DNS-Adresse dafür geben, der Name sollte also an-ping-bar sein und auf die IP-Adresse eures Seafileservers reagieren. Ansonsten nehmt die IP-Adresse.

Wir Konfigurieren den Apache für die Verwendung von ReWrite und dem Proxy Modul (SSL ist schon mal für den nächsten Abschnitt mit drin):

a2enmod rewrite
a2enmod proxy_http
a2enmod ssl

und dann müssen wir den Apache Webserver einmal neu starten:

systemctl restart apache2.service


Jetzt ändern wir die Konfigurationsdatei der Default Webseite von Apache:

nano /etc/apache2/sites-enabled/000-default.conf

Löscht den GANZEN Inhalt (F9 benutzen) und fügen statt dessen folgendes ein:

<VirtualHost *:80>
    # ServerName euer.server.name
    DocumentRoot /var/www/html
    Alias /media  /home/seafile/haiwen/seafile-server-latest/seahub/media

    AllowEncodedSlashes On
    RewriteEngine On

    <Location /media>
        Require all granted
    </Location>

    #
    # 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/
</VirtualHost>

Den ServerName habe ich auskommentiert, ansonsten reagiert er nur auf diesen genauen Namen. Den müsst und solltet Ihr anpassen.

Jetzt haben wir alles und müssen nur noch die Dienste neu starten:

systemctl restart apache2.service && systemctl stop seahub.service seafile.service && systemctl start seafile.service seahub.service


JETZT solltet Ihr euren Seafile-Server unter

http://subdomain.domain.suffix
http://192.168.1.123

erreichen können.


Schritt 2: Umbau von http auf https

So, wenn der Zugriff über http:// läuft ist das Schlimmste geschafft.


Zertifikat erstellen

Wir bauen uns hier nun ein selbstsigniertes Zertifikat. Wenn Ihr ein richtiges habt dann legt es einfach an entsprechender Stelle ab.
Wir wechseln ins Seafile Verzeichnis und legen einen neuen Ordner an:

cd /home/seafile/haiwen
mkdir certificates
cd certificates/

Dann erstellen wir mit openssl den Schlüssel und das Zertifikat:

openssl genrsa -out privkey.pem 2048
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 3650
chmod +r *

Er stellt euch nach dem 2. Befehl ein paar Fragen, wichtig ist aber nur die Antwort auf die folgende:

Common Name (e.g. server FQDN or YOUR name) []:seafile.znil.net

Hier müsst ihr unbedingt den Domänennamen angeben wie Ihr diesen auch im Webbrowser eintippt!

Nun müsstest Ihr 2 Dateien haben im Ordner certificates:

/home/seafile/haiwen/certificates/
├── cacert.pem
└── privkey.pem



Apache konfiguration anpassen

Zunächst muss - wen noch nicht geschehen - die SSL Unterstützung in Apache aktiviert werden:

a2enmod ssl

Dann bearbeiten wir noch mal die Datei

nano /etc/apache2/sites-available/default-ssl.conf

und löscht wieder den ganzen Inhalt (F9) und ersetzt diesen wie folgt:

<VirtualHost *:443>
  ServerName www.myseafile.com
  DocumentRoot /var/www

  SSLEngine On
  SSLCertificateFile /home/seafile/haiwen/certificates/cacert.pem
  SSLCertificateKeyFile /home/seafile/haiwen/certificates/privkey.pem

  Alias /media  /home/seafile/haiwen/seafile-server-latest/seahub/media

  <Location /media>
    Require all granted
  </Location>

  RewriteEngine On

  #
  # 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/
</VirtualHost>

Denkt an die Anpassung des Servernamens!
Ggf. muss die Seite noch aktiviert werden:

a2ensite default-ssl.conf



Seafile Konfiguration anpassen

Jetzt muss Seafile selbst noch wissen das wir https:// nutzen:

nano /home/seafile/haiwen/conf/ccnet.conf

und dort die Zeile

SERVICE_URL = http://seafile.znil.net

auf

SERVICE_URL = https://seafile.znil.net

ändern.
Und noch in der

nano /home/seafile/haiwen/conf/seahub_settings.py

die Zeile

HTTP_SERVER_ROOT = 'http://seafile.znil.net/seafhttp'

in

HTTP_SERVER_ROOT = 'https://seafile.znil.net/seafhttp'

ändern.

Wieder alle Dienste neu starten:

systemctl restart apache2.service && systemctl stop seahub.service seafile.service && systemctl start seafile.service seahub.service

und nun erreichen wir Seafile unter

https://subdomain.domain.suffix
https://192.168.1.123

Bei einem selbst erstellten Zertifikat bekommt Ihr nun eine Sicherheitswarnung (ich habe es bei mir in die Vertrauenswürdigen Stammzertifizierungsstellen importiert, dann ist Ruhe)



Python Enviroment automatisch laden wenn zum Benutzer Seafile gewechselt wird

Wir wechseln zum Benutzer seafile:

sudo -u seafile /usr/bin/bash

und bearbeiten dessen .bashrc

nano /home/seafile/.bashrc

und hängen nachfolgende Zeilen ganz unten an:

export LC_ALL=de_DE.UTF-8
export LANG=de_DE.UTF-8
export LANGUAGE=de_DE.UTF-8
source /home/seafile/haiwen/python-venv/bin/activate
cd /home/seafile/haiwen

Wenn Ihr nun zum Benutzer seafile wechselt, wird die Python-Umgebung automatisch geladen und in das Programmverzeichnis von Seafile gewechselt.


Notifications erlauben (ping und pong)

In den Logs von Seafile fand ich Fehlermeldungen zu einem einer fehlenden Notification / Benachrichtigungen.
Seit Version 10 gibt es so eine Art Lebenszeichen-Dienst der - unter anderem - unter

https://euer.seafile.server/notification/ping

mit einem

{"ret": "pong"}

Antworten soll.
Das richten wir wie folgt ein:

nano /home/seafile/haiwen/conf/seafile.conf

und ganz unten folgendes ergänzen / anpassen:

[notification]
enabled = true
host = 0.0.0.0
port = 8083
log_level = info
jwt_private_key = jpcQI8YPgK1quk7jnlB+N1HnXUVXUIDsRyPpcZ4zgeg=

Den host habe ich von 127.0.0.1 auf 0.0.0.0 geändert das mein Apache Reverse Proxy auf einem anderen System läuft, den jwt_private_key könnte Ihr bei Bedarf per

openssl rand -base64 32

erstellen lassen.

Speichern und die Seafiele-Dienste einmal neu durchstarten.
Nun die Apache-Konfigurationsdatei anpassen:

nano /etc/apache2/sites-available/default-ssl.conf

und folgendes Einbauen:

    #
    # notifications
    #
    ProxyPass /notification/ping  http://127.0.0.1:8083/ping/
    ProxyPassReverse /notification/ping  http://127.0.0.1:8083/ping/

    ProxyPass /notification  ws://127.0.0.1:8083/
    ProxyPassReverse /notification ws://127.0.0.1:8083/

Den Apache2 einmal neu starten / reloaden

systemctl reload apache2

Wenn Ihr nun die URL eures Seafile-Server aufruft sollte unter

https://euer.seafile.server/notification/ping

die pong Antwort kommen


Kommentare

Loading comments...