Aktionen

Seafile Server - Installation auf Ubuntu 20.04.x LTS

Aus znilwiki

Important.png
Hinweis: Es gibt eine neuere Version dieser Anleitung: Seafile Server - Installation auf Ubuntu 24.04.x LTS

Changelog:

  • 24.05.2020: Erste Version mit Seafile 7.1.4
  • 18.08.2022: Upgrade Anleitung ergänzt

Installation Ubuntu Server

Mein Server ist eine VMware VM die ich wie folgt installiert habe:


Hardware

  • HDD1 mit 16GB (Boot)
  • HDD2 mit 1,8TB unter /home (Seafile Daten) per LVM
  • 2 CPU
  • 2 GB RAM

Grundinstallation

Important.png
Hinweis:Ich habe die offizielle ISO verwendet: https://ubuntu.com/download/server (ubuntu-20.04-live-server-amd64.iso). Es gibt zur Zeit keine Minimalversion mit LAMP Installer.


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

ClipCapIt-200521-151537.PNG Taste drücken um in den Installationsmodus zu kommen (so könnt Ihr gleich mit deutscher Tastatur starten)
ClipCapIt-200521-151958.PNG Deutsch
ClipCapIt-200521-152023.PNG Ubuntu Server installieren
ClipCapIt-200521-152203.PNG Deutsch
ClipCapIt-200521-152238.PNG Aktualisieren auf neuen Installer (ggf. erscheint der Dialog nicht)
ClipCapIt-200521-152401.PNG Erledigt

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 ens160 => 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-200521-153329.PNG Bei Bedarf, sonst leer lassen
ClipCapIt-200521-153401.PNG Erledigt (Vorgabe übernehmen)
ClipCapIt-200521-153910.PNG Erledigt => Nutzt die ganze Festplatte ohne LVM. Die Festplatte lässt sich später trotzdem leicht vergrößern
ClipCapIt-200521-154045.PNG Erledigt
ClipCapIt-200521-154111.PNG Fortfahren
ClipCapIt-200521-154233.PNG Ich lege hier den Benutzer installadmin an. Wählt euren Benutzer und Passwort nach Wunsch (Aufschreiben!). Names eueres Server müsste ihr anpassen (Da steht Zabbix weil ich den Screenshot recycelt habe)
ClipCapIt-200521-154401.PNG OpenSSH-Server auswählen => Erledigt (für Zugriff z.B. mit Putty)
ClipCapIt-200521-154458.PNG Erledigt

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

ClipCapIt-200521-154520.PNG
ClipCapIt-200521-154604.PNG
ClipCapIt-200521-154648.PNG Neustart
ClipCapIt-200521-154720.PNG ISO aus der VM entfernen und Enter drücken
ClipCapIt-200521-154913.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 die noch folgenden Befehle einfach per Copy&Paste übernehmen.
Die IP-Adresse habt Ihr zu diesem Zeitpunkt ja bereits festgelegt.
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

  • 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 sshd.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


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


Installadmin löschen

Den installadmin entfernen wir mit

deluser --remove-home installadmin

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 bearbeitet die Datei

nano /etc/netplan/00-installer-config.yaml
ClipCapIt-200521-162802.PNG

Multipathing deinstallieren

Ab Werk wird nun das

/var/log/syslog

mit Multipath-Meldungen vollgemüllt:

May 21 14:28:19 zabbix multipathd[674]: sda: add missing path
May 21 14:28:19 zabbix multipathd[674]: sda: failed to get udev uid: Invalid argument
May 21 14:28:19 zabbix multipathd[674]: sda: failed to get sysfs uid: Invalid argument
May 21 14:28:19 zabbix multipathd[674]: sda: failed to get sgio uid: No such file or directory

bei mir passiert das im 5 Sekundentakt.
In dieser VM macht Multipath keinen Sinn, also deaktivieren und deinstallieren und das Syslog von den Meldungen befreien:

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

Cloud-Init deinstallieren

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 - wenn ich mich recht erinnere - 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.
Brauchen wir nicht, also 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 autoremove -y
reboot

Zeitzone setzen

In meiner VM ist die Uhrzeit zu diesem Zeitpunkt falsch (gebt mal 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.
Der automatische Sync mit dem Internet sollte auch aktiv sein, mit

timedatectl set-ntp true

ist er es auf jedem Fall.


Updates einspielen

  • wieder anmelden als root
  • Updates suchen für Betriebssystem: (aktualisiert den Katalog aus den Update-Quellen)
apt update
  • Updates einspielen:
apt dist-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




Automatische Updates deaktivieren

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

apt remove -y unattended-upgrades

Zusätzliche Festplatte einbinden

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

ls -l /dev/sd*

Ausgabe:

brw-rw---- 1 root disk 8,  0 Mai 22 16:41 /dev/sda
brw-rw---- 1 root disk 8,  1 Mai 22 16:41 /dev/sda1
brw-rw---- 1 root disk 8,  2 Mai 22 16:41 /dev/sda2
brw-rw---- 1 root disk 8, 16 Mai 22 16:41 /dev/sdb

/dev/sda ist die erste Festplatte, sda1 und sda2 sind Partitionen auf dieser.
Unsere Zielfestplatte Platte ist die /dev/sdb

Wir arbeiten mit dem LVM - der erleichtert uns eine spätere Vergrößerung der Festplatte, die Befehle für das einbinden der neuen Festplatte sind wie folgt:

pvcreate /dev/sdb
vgcreate seafile-data /dev/sdb
lvcreate -n home -l100%VG seafile-data
mkfs.ext4 /dev/seafile-data/home

Das kann je nachdem wie schnell und groß euere Platte ist einen Moment dauern (auch mal Minuten).
Damit haben wir

  • Das PV - Physical Volume - angelegt pvcreate
  • Die VG - Volume Group - angelegt mit dem PV als Inhalt vgcreate und dem Namen seafile-data
  • Ein LV - Logisches Volume - mit dem Name home welches 100% des Platzes in der VG seafile-data nutzt
  • Und das neue LV mit dem EXT4 Dateisystem formatiert


Fehlt noch das mounten bzw. das automatische mounten beim booten:

nano /etc/fstab

und folgende Zeile anhängen:

/dev/mapper/seafile--data-home /home ext4 defaults 0 1

Damit wird die 2. Festplatte auf das /home Verzeichnis gemappt. Das klappt nur wenn

  • Das Verzeichnis leer ist (weil Ihr den installadmin wieder gelöscht habt
  • als root angemeldet seit und es noch keine anderen Benutzer gibt

Alternativ müsstet Ihr den Pfad anpassen, z.B. ein Unterordner unterhalb von /home
Um das Mounten zu testen könnt Ihr rebooten oder folgenden Befehl eintippen:

mount -a

Wir überprüfen das ganze z.B. mit

df -h

Ausgabe:

Dateisystem                    Größe Benutzt Verf. Verw% Eingehängt auf
udev                            952M       0  952M    0% /dev
tmpfs                           199M    1,1M  198M    1% /run
/dev/sda2                        16G    4,3G   11G   29% /
tmpfs                           994M       0  994M    0% /dev/shm
tmpfs                           5,0M       0  5,0M    0% /run/lock
tmpfs                           994M       0  994M    0% /sys/fs/cgroup
/dev/loop0                      9,2M    9,2M     0  100% /snap/canonical-livepatch/95
/dev/loop1                       94M     94M     0  100% /snap/core/9066
/dev/loop2                       55M     55M     0  100% /snap/core18/1705
/dev/loop3                       69M     69M     0  100% /snap/lxd/14804
/dev/loop4                       28M     28M     0  100% /snap/snapd/7264
tmpfs                           199M       0  199M    0% /run/user/0
/dev/mapper/seafile--data-home  1,8T     77M  1,7T    1% /home

Benötigte Pakete installieren

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

apt install -y python3 python3-setuptools python3-pip python3-setuptools python3-urllib3 python3-ldap ffmpeg python3-mysqldb python3-pylibmc python3-memcache python3-pil apache2 mariadb-server

und im Anschluß den pip3 Befehl:

pip3 install --timeout=3600 Pillow captcha jinja2 sqlalchemy django-pylibmc django-simple-captcha 

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

Warning.png
Warnung: Es funktioniert zur Zeit nur mit MariaDB! Mit MySQL habe ich es nicht zum laufen bekommen! Wenn man die Authentifizierung für den Seafile-Datenbank-Benutzer auf das alte Basic verfahren ändert verschwinden zwar viele Fehlermeldungen, seahub konnte ich aber trotzdem nicht starten.

MySQL 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/

Nun legen wir noch einen symbolischen Link an (Warum steht am Ende dieses Abschnittes):

ln -s /home/seafile /var/lib/seafile

Wir wechseln auf diesen eben neu erstellten Benutzer:

su - seafile

und sind dann automatisch im Heimatverzeichnis des Benutzers - also in

/home/seafile/

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? Und warum der symbolische Link nach /var/lib/seafile? Nun, dann halten wir uns an das vorgeschlagene Schema der Seafile-Entwickler - und alle Beispiele und Anleitungen aus dem Internet sollte ohne Änderungen funktionieren. Der Ordner heisst "haiwen" weil Seafile wohl so im Chinesischen genannt wird.
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




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 enpacken einfach direkt in das Zielverzeichnis.

Version 7.1.4:

wget https://download.seadrive.org/seafile-server_7.1.4_x86-64.tar.gz


Entpacken und archivieren:

tar xzfv seafile-server_7.1.4_x86-64.tar.gz
mkdir installed
mv seafile-server_* installed

Die ganze Verzeichnisstruktur sollte nun so aussehen:

/home
├── lost+found
└── seafile
    └── haiwen
        ├── installed
        │   └── seafile-server_7.1.4_x86-64.tar.gz
        └── seafile-server-7.1.4
            ├── check_init_admin.py
            ├── reset-admin.sh
            ├── runtime
            ├── seaf-fsck.sh
            ├── seaf-fuse.sh
            ├── seaf-gc.sh
            ├── seafile
            ├── seafile.sh
            ├── seahub
            ├── seahub.sh
            ├── setup-seafile-mysql.py
            ├── setup-seafile-mysql.sh
            ├── setup-seafile.sh
            ├── sql
            └── upgrade


Seafile Setup ausführen

Wir arbeiten weiter in der Anmeldung als Benutzer seafile (su - seafile) 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" ] localhost

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

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

What is the password for mysql user "seafile"?
[ password for seafile ] 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 ...

done
Successly create configuration dir /home/seafile/haiwen/ccnet.
Generating seafile configuration ...

Done.
done
Generating seahub configuration ...

----------------------------------------
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.

Das Passwort für den MySQL-Benutzer seafile ist seafile,den Servernamen name of server und ip or domain müsst ihr gemäß eurer Umgebung festlegen

Danach starten wir die Dienste als Test und um die Konfiguration ganz abzuschließen:

cd ..
cd seafile-server-latest
./seafile.sh start
./seahub.sh start

Nun kommen wieder ein paar Fragen umd den ersten Benutzer (=Admin) einzurichten:

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 ] eure@emailaddresse.de

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.


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

./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. ./seahub.sh start

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

http://192.168.1.123:8000
ClipCapIt-200522-215445.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


Für den Start als Dienst nutzt man seit Ubuntu 16.04.x den systemd Dienst:
Seafile-Service:

nano /etc/systemd/system/seafile.service

Inhalt:

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

[Service]
Type=oneshot
ExecStart=/home/seafile/haiwen/seafile-server-latest/seafile.sh start
ExecStop=/home/seafile/haiwen/seafile-server-latest/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/seafile-server-latest/seahub.sh start
ExecStop=/home/seafile/haiwen/seafile-server-latest/seahub.sh stop
User=seafile
Group=seafile
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target


Nun noch aktivieren:

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

    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.

Dann ändern wir die

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

und entfernen bei

SERVICE_URL = http://seafile.znil.net:8000

die :8000 am Ende:

SERVICE_URL = http://seafile.znil.net


Als nächsten die

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

Dort hängen wir als letzte Zeile diese hier an:

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



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.
Und zwar könnt Ihr euren Server jetzt nur noch über diese Adresse erreichen - der Zugriff über Port 8000 funktioniert nicht mehr.


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)



Upgrade von Seafile

Das habe ich schon mal hier beschrieben: Seafile Server - Update/Upgrade des Servers auf neuere Version
Die Kurzversion:

  • Das Changelog lesen und beachten! Hier steht z.B. ob noch zusätzliche Pakte nachinstalliert werden müssen:
https://manual.seafile.com/changelog/server-changelog/
  • Ggf., gerade bei einem Versionssprung, die notwendigen Voraussetzungen installieren
  • Seafile läuft als virtuelle Maschine? Snapshot machen! Bei größeren Upgrades ggf. die VM dafür vorher runterfahren.
  • Seafile stoppen!
 systemctl stop seahub.service seafile.service
  • Zum Benutzer seafile wechseln !!!!
su - seafile
  • in das Seafile-Stammverzeichnis wechseln (das Verzeichnis in dem es den seafile-server-latest Ordner als Unterordner gibt
  • neue Version herunterladen, entpacken, Archiv löschen/verschieben (Versionsnummern anpassen)
wget https://s3.eu-central-1.amazonaws.com/download.seadrive.org/seafile-server_9.0.7_x86-64.tar.gz
tar xzfv seafile-server_9.0.7_x86-64.tar.gz
mkdir installed
mv seafile-server_* installed
  • In das Upgradeverzeichnis der neuen, gerade heruntergeladenen Version wechseln:
cd seafile-server-9.0.5/upgrade/

und dann - je nachdem von welcher Version wir kommen, entweder die mit der Versionsnummer benannte Datei oder die minor-Datei ausführen:

.\minor-upgrade.sh

oder z.B.

.\upgrade_8.0_9.0.sh

Ggf. den Cache löschen (gerade bei Upgrades von 7 auf 8 oder 8 auf 9)

 rm -R /tmp/seahub_cache/*

danach wieder zum root wechseln (exit) und seafile wieder starten und prüfen

systemctl start seafile.service seahub.service
  • Testen ob alles wieder wie gewünscht läuft.



Migration Seafile auf neuen Server

So habe ich meine Seafile-Installation von einem Ubuntu 18.04.x auf 20.04.x migriert bekommen:

  • Die Seafile-Installation auf dem alten Server ggf. updaten so das diese mit der geplanten Version auf dem neuen Server übereinstimmt
  • Vorbereitung des neuen Servers wie zuvor beschrieben - einschließlich dem Punkt "Seafile Setup ausführen" - danach(!) folgendes machen:
  • Die 3 MySQL Datenbanken auf dem alten Server exportieren:
mysqldump -useafile -pseafile ccnet-db | gzip > /tmp/ccnet-db.sql.gz
mysqldump -useafile -pseafile seafile-db | gzip > /tmp/seafile-db.sql.gz
mysqldump -useafile -pseafile seahub-db | gzip > /tmp/seahub-db.sql.gz
  • auf den neuen Server kopieren mit scp (Befehl kopiert vom alten zum neuen Server)
scp /tmp/*-db.sql.gz 192.168.1.123:/tmp/
  • auf dem neuen Server in die vorhandenen Datenbanken importieren:
zcat /tmp/ccnet-db.sql.gz | mysql -useafile -pseafile ccnet-db
zcat /tmp/seafile-db.sql.gz | mysql -useafile -pseafile seafile-db
zcat /tmp/seahub-db.sql.gz | mysql -useafile -pseafile seahub-db
  • Die folgenden Ordner auf den neuen Server in den gleichen Pfad kopieren
/home/seafile/haiwen/seafile-data
/home/seafile/haiwen/seahub-data

Das hab ich mit rsync gemacht weil es bei mir fast 800GB sind und ich so bei einem Abbruch das Kopieren fortsetzen konnte:

rsync -raz -e ssh --update --progress -h /home/seafile/haiwen/seafile-data 192.168.45.21:/home/seafile/haiwen/
rsync -raz -e ssh --update --progress -h /home/seafile/haiwen/seahub-data 192.168.45.21:/home/seafile/haiwen/

Der dicke Fisch ist der seafile-data Ordner, das kann schon mal ein paar Stunden dauern je nach Größe.

  • Den Besitzer der Dateien wieder anpassen:
chown -R seafile:seafile /home/seafile/haiwen/*
  • Den Rest dann weiter wie beschrieben. Also erst einmal manuell starten und schauen ob es auf Port 8000 läuft, dann Umbau auf Port 80 und dann zusätzlich Port 443.



Datensicherung unter VMware, z.B. mit Veeam

Bei dieser Methode passiert folgendes:

  • Die Datenbank wird vor einem Snapshot auf "READ ONLY" gesetzt - zuvor werden noch alle Daten geschrieben ("FLUSH TABLES")
  • Der Snapshot wird erstellt
  • Die Datenbank wird wieder für Schreibzugriffe freigegeben


Unter VMware funktioniert das mit 2 Skripten die wir wie folgt anlegen:

nano /usr/sbin/pre-freeze-script

mit folgendem Inhalt:

Warning.png
Warnung: Vergesst nicht das Passwort in Zeile 9 zu setzen (steht auf Leer was per Default passen sollte)
#!/bin/sh
# 2018-04-20 Bernhard Linz
# Original script by Pascal Di Marco, check https://www.veeam.com/wp-consistent-protection-mysql-mariadb.html for more information
# Log will be write to syslog and(!) to /tmp/snapshot.log
echo "$0 pre-freeze start" | logger
echo "-------------------------------------------------------------------------------------" >> /tmp/snapshot.log
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') pre-freeze start" >> /tmp/snapshot.log
# Set Username and Passwort for MySQL Access. Set mysql_password="" if no password needed
mysql_username="root"
mysql_password=""
timeout=300

# ************************************************************************************************
# No Changes behind this line!
# ************************************************************************************************
# Check if username + password is used
if [ -n "$mysql_password" ]; then
    use_credentials="-u$mysql_username -p$mysql_password"
else
    use_credentials=""
fi

# Name of the Lockfile
lock_file=/tmp/mysql_tables_read_lock

sleep_time=$((timeout+10))
rm -f $lock_file
echo "$0 executing FLUSH TABLES WITH READ LOCK" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') executing FLUSH TABLES WITH READ LOCK" >> /tmp/snapshot.log

# Start READ LOCK - Process will send to background (and will still run after script is completed. Lock will stop if process is stopped
# After READ ONLY mode is entered the lockfile will be created. Process will stop when getting stop signal from post-thaw-script or timeout reached
mysql $use_credentials -e "FLUSH TABLES WITH READ LOCK; system touch $lock_file; system nohup sleep $sleep_time; system echo lock released|logger; " > /dev/null &
# get the PID of the mysql process
mysql_pid=$!

echo "$0 child pid $mysql_pid" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') child pid $mysql_pid" >> /tmp/snapshot.log

# Waiting for the lockfile ...
c=0
while [ ! -f $lock_file ]
do
    # check if mysql is running
    if ! ps -p $mysql_pid 1>/dev/null ; then
        echo "$0 mysql command has failed (bad credentials?)" | logger
        echo "$0 $(date '+%Y-%m-%d %H:%M:%S') mysql command has failed (bad credentials?)" >> /tmp/snapshot.log
        exit 1
    fi
    sleep 1
    c=$((c+1))
    # check if the script run into timeout
    if [ $c -gt $timeout ]; then
        echo "$0 timed out waiting for lock" | logger
        echo "$0 $(date '+%Y-%m-%d %H:%M:%S') timed out waiting for lock" >> /tmp/snapshot.log
        touch $lock_file
        kill $mysql_pid
    fi
done
# write PID into the lockfile
echo $mysql_pid > $lock_file

echo "$0 pre-freeze stop" | logger
echo "$0 $(date '+%Y-%m-%d %H:%M:%S') pre-freeze stop" >> /tmp/snapshot.log

exit 0


und

nano /usr/sbin/post-thaw-script
#!/bin/sh
# 2018-04-20 Bernhard Linz
# Original script by Pascal Di Marco, check https://www.veeam.com/wp-consistent-protection-mysql-mariadb.html for more information
# Log will be write to syslog and(!) to /tmp/snapshot.log
echo "$0 post-thaw start" | logger
echo "$0  $(date '+%Y-%m-%d %H:%M:%S') post-thaw start" >> /tmp/snapshot.log

lock_file=/tmp/mysql_tables_read_lock

# get PID from lockfile
mysql_pid=$(cat $lock_file)
echo "$0 sending sigterm to $mysql_pid" | logger
echo "$0  $(date '+%Y-%m-%d %H:%M:%S') sending sigterm to $mysql_pid" >> /tmp/snapshot.log
# and send stop to process
pkill -9 -P $mysql_pid
rm -f $lock_file

echo "$0 post-thaw stop" | logger
echo "$0  $(date '+%Y-%m-%d %H:%M:%S') post-thaw stop" >> /tmp/snapshot.log

exit 0


Jetzt müssen wir die beiden Skripte noch ausführbar machen und dem root zuordnen:

chmod 0700 /usr/sbin/pre-freeze-script
chmod 0700 /usr/sbin/post-thaw-script
chown root:root /usr/sbin/pre-freeze-script
chown root:root /usr/sbin/post-thaw-script


Voraussetzung ist das die VMware-Tools installiert sind!
Dabei ist es egal ob es sich um die Original VMware-Tools oder um die Open-VM-Tools aus den Repositories handelt.
Nun können wir die Skripts testen indem wir einen Snapshot mit den folgenden Einstellungen erstellen:

ClipCapIt-200521-204401.PNG


Beispielausgabe aus der

cat /tmp/snapshot.log
-------------------------------------------------------------------------------------
/usr/sbin/pre-freeze-script 2022-08-18 11:37:12 pre-freeze start
/usr/sbin/pre-freeze-script 2022-08-18 11:37:12 executing FLUSH TABLES WITH READ LOCK
/usr/sbin/pre-freeze-script 2022-08-18 11:37:12 child pid 10992
/usr/sbin/pre-freeze-script 2022-08-18 11:37:13 pre-freeze stop
/usr/sbin/post-thaw-script  2022-08-18 11:37:16 post-thaw start
/usr/sbin/post-thaw-script  2022-08-18 11:37:16 sending sigterm to 10992
/usr/sbin/post-thaw-script  2022-08-18 11:37:16 post-thaw stop


Falls es mit dem Passwort mal hakt so müsste das auch dort stehen:

/usr/sbin/pre-freeze-script 2022-08-22 12:01:04 mysql command has failed (bad credentials?)

Mehr Details stehen ggf. im syslog'

tail -f -n 500 /var/log/syslog

Für seafile würde dann ein Schreibvorgang in die Datenbank länger dauern. In den meisten Umgebungen geht das so schnell das die Applikation das gar nicht bemerkt (4 bis 5 Sekunden).

Important.png
Hinweis: Das ganze funktioniert sowohl mit den original VMware-Tools als auch den Open-VM-Tools!






Kommentare

Loading comments...