Anleitung - Nextcloud
von Alec Höfler, 2/28/2022, 6:46:54 PMNextcloud mit OpenLiteSpeed, Postgres, Caching und mehr. Maximale Performance!
Vorwort
Nextcloud ist eine open-source, selfhosted File-Sharing-Software, vergleichbar mit bspw. OneDrive oder Google Drive. Es erlaubt das Speichern/Synchronisieren von Dateien, bearbeiten von Dokumenten, erstellen von Umfragen, Verwaltung von Passwörtern und dank dem App-Store vieles mehr!
Diese Anleitung ist auf eine möglichst schnelle Nextcloud ausgelegt. Hierfür wird der Web-Server OpenLiteSpeed mit den dazugehörigen PHP8 Modulen und Postgres als Datenbank verwendet. Zusätzlich werden noch verschiedene Caching-Layer benutzt.
Als Basissystem wird Debian 11 (KVM VM mit 4 Kernen, 8GB Arbeitsspeicher, NVME Speicher) verwendet. Bis auf einen OpenSSH-Server wurde nichts weiteres installiert.
<b>Hinweis:</b> In dieser Anleitung wird der kostenlose OpenLiteSpeed Webserver verwendet. Da dieser allerdings nicht mit allen .htaccess-Direktiven zurecht kommt, ist in einem Produktivumfeld ein LiteSpeed Enterprise ratsam. Dieser kann kostenlos für eine Seite mit 2GB Ram und einem Worker genutzt werden. LiteSpeed Store
Basis-Tools installieren
1apt update 2apt install curl wget sudo unzip git -y
Installation und Konfiguration von Webserver und Datenbank
Repository hinzufügen
1curl https://rpms.litespeedtech.com/debian/enable_lst_debian_repo.sh | sudo bash 2wget -O /etc/apt/trusted.gpg.d/lst_repo.gpg https://rpms.litespeedtech.com/debian/lst_repo.gpg
WebServer, PHP und PostgresSQL installieren
1apt update 2#OpenLiteSpeed Webserver 3apt install openlitespeed -y 4#PHP Modules 5apt install lsphp80-* -y 6#PostgreSQL 7apt install postgresql postgresql-contrib -y
Services aktivieren und starten
1systemctl enable --now postgresql 2systemctl enable --now lsws
Datenbank erstellen
Nun per su postgres
als den PostgreSQL Nutzer verbinden. Anschließend psql
ausführen, und folgende Zeilen eingeben, um die Datenbank und den Nutzer zu erstellen. Achtung: Passwort ändern!
1CREATE ROLE nextcloud with PASSWORD 'your-password' LOGIN; 2CREATE DATABASE nextcloud; 3GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud; 4\q
Nun per exit
wieder zurück in den root-Nutzer zurückkehren.
Webserver Konfiguration
Nun per nano die OpenLiteSpeed Konfiguration (/usr/local/lsws/conf/httpd_config.conf
) öffnen, und die Zeile
path lsphp74/bin/lsphp
durch folgende ersetzen:
path lsphp80/bin/lsphp
Nun den OpenLiteSpped Server neustarten
1service lsws restart 2killall lsphp
Danach kann man das Administratoren-Login für das OpenLiteSpeed Webinterface generieren. Achtung: sicheres Login wählen!
1sh /usr/local/lsws/admin/misc/admpass.sh
Nun kann man das Webinterface öffnen. Die Adresse ist https://IP-DES-SERVERS:7080/
Nun unter Virtual Hosts (1) -> Example (Name des VHosts) -> Rewrite (2) -> Bearbeiten (3) die Optionen "Enabled Rewrite" und "Auto Load from .htaccess" auf "Yes" setzen. Anschließend den OLS Server neustarten (4). <img src="https://s3.itbyhf.xyz/cdn/apps/g3as83vjdi/01_rewrite.png"/>
NextCloud installieren
Zuerst über folgende Befehle der Ordner vorbereiten, NextCloud 23 herunterladen und entpacken.
1cd /usr/local/lsws/Example/html 2rm -rf * 3wget https://download.nextcloud.com/server/releases/nextcloud-23.0.0.zip 4unzip nextcloud-23.0.0.zip 5mv nextcloud/* . 6mv nextcloud/.* . 7rmdir nextcloud/ 8chown nobody:nogroup . -R
Nun http://IP-DES-SERVERS:8088/index.php aufrufen, und den Nextcloud-Setup-Assistent durchklicken. Nutzer und Passwort sollten sicher gewählt sein. Der Datenordner bleibt in diesem Beispiel auf Standardeinstellungen. Wenn man einen anderen Ordner nutzen will, muss man per chown nobody:nogroup -R /path/to/data/folder dem nobody - User die entsprechende Rechte auf diesen geben. <b>Datenbank-Login:</b> Nutzer -> nextcloud; pass -> selbst gewählt; name -> nextcloud; host -> localhost
Fehler beheben
Nun sind im Nextcloud-Dashbaord allerdings viele Fehler sichtbar. Diese gilt es nun zu beheben. Also zurück in die SSH Session.
1rm next*zip
Anschließend die PHP-Konfigurationsdatei (/usr/local/lsws/lsphp80/etc/php/8.0/litespeed/php.ini
) mit nano öffnen, und folgende Änderungen vornehmen:
memory_limit
auf 2G setzen. (maximaler PHP-RAM)post_max_size
auf 20G setzen (maximale Größe, des POST Requests)upload_max_filesize
auf 20G setzen (maximale Upload-Dateigröße)- Die Zeile
output_buffering = 4096
löschen
Nun OpenLiteSpeed neustarten:
1service lsws restart 2killall lsphp
Die korrekte .htaccess Datei herunterladen
1curl https://transfer.itbyhf.xyz/1ZgekaC/htaccess-nc.txt > .htaccess
Den HSTS-Header im Reverse-Proxy setzen (Beispiel: bei HaProxy folgendes in das Backend hinzufügen: http-response set-header Strict-Transport-Security max-age=15552000;\ includeSubDomains;\ preload;
)
Die config/config.php
Datei öffnen und folgendes vor );
einfügen:
1'default_phone_region' => 'de', 2'htaccess.RewriteBase' => '/',
Caching
Um die Performance noch weiter zu erhöhen, werden nun verschiedene Caching-Layer eingebracht.
Redis installieren
1apt install redis-server -y 2systemctl enable --now redis-server
Memcached installieren
1apt install memcached -y 2systemctl enable --now memcached
APCu
Für APCu ist keine zusätzliche Installation nötig. Diese ist direkt verfügbar.
Konfiguration
Um diese 3 Layer in Nextcloud zu aktivieren, wieder die config/config.php
mit nano öffnen, und folgendes vor );
einfügen:
1'redis' => 2 array ( 3 'host' => 'localhost', 4 'port' => 6379, 5 'timeout' => 5, 6 ), 7 'memcache.local' => '\\OC\\Memcache\\APCu', 8 'distributed' => '\\OC\\Memcache\\Redis', 9 'memcache.locking' => '\\OC\\Memcache\\Redis',
OPCache
Durch OPCache wird bei PHP die Performance durch Just-in-Time Compilen erhöht. Dadurch wird vorkompilierter Bytecode im RAM gespeichert. Dadurch wird nicht bei jedem Request jedes PHP Script ausgeführt.
Um dies zu aktivieren, die Datei /usr/local/lsws/lsphp80/etc/php/8.0/litespeed/php.ini
per nano öffnen, und in der Kategorie [opcache] folgendes eintragen:
1opcache.enable=1 2opcache.enable_cli=1 3opcache.interned_strings_buffer=8 4opcache.max_accelerated_files=10000 5opcache.memory_consumption=512 6opcache.save_comments=1 7opcache.revalidate_freq=1
High Performance Push Backend
Durch das notify_push Backend, das in Rust, einer der schnellsten Programmiersprachen überhaupt, geschrieben wurde, kann die Synchronisation von Dateien auf dem Desktop Client massiv erleichtert und beschleunigt werden. Aktivieren:
1wget -O /usr/bin/notify_push_nextcloud https://github.com/nextcloud/notify_push/releases/download/v0.3.0/notify_push-x86_64-unknown-linux-musl 2chmod +x /usr/bin/notify_push_nextcloud 3wget -O /etc/systemd/system/notify_push.service https://transfer.itbyhf.xyz/1t1atOb/notify_push.service 4systemctl enable --now notify_push
Finale Konfiguration
Nun einen Reverse-Proxy für /push einrichten, der Websockets unterstützt. Die Ziel-Adresse ist http://IP-DES-SERVERS:7867/
Hier ein Beispiel für eine komplett fertige HAProxy Konfigurationsdatei inkl. aller nötigen Header, Dem notify_push-Backend und SSL.
1global 2 log /dev/log local0 3 log /dev/log local1 notice 4 chroot /var/lib/haproxy 5 stats socket /var/lib/haproxy/stats 6 stats timeout 30s 7 user haproxy 8 group haproxy 9 daemon 10 11 ca-base /etc/ssl/certs 12 crt-base /etc/ssl/private 13 14 ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS 15 ssl-default-bind-options no-sslv3 16 17 defaults 18 log global 19 mode http 20 option httplog 21 option dontlognull 22 timeout connect 5000 23 timeout client 50000 24 timeout server 50000 25 26frontend http 27 bind :::80 v4v6 28 29 http-request redirect scheme https 30 31frontend https 32 bind :::443 v4v6 name HaProxy ssl crt /etc/haproxy/ssl/ 33 mode http 34 capture request header Host len 32 35 log global 36 option httplog 37 timeout client 300s 38 maxconn 1000 39 40 use_backend nextcloud if { hdr(host) -i cloud.domain.xyz } ! { hdr_beg(host) -i /push } 41 use_backend notify_push if { hdr(host) -i cloud.domain.xyz } { hdr_beg(host) -i /push } 42 43backend nextcloud 44 server nextcloud_srv01 localhost:8088 45 http-response set-header Strict-Transport-Security max-age=15552000;\ includeSubDomains;\ preload; 46 47backend notify_push 48 server notify_push_srv01 localhost:7867