Mit Version 21 wurde für Nextcloud das optionale „Files High Performance Backend“ eingeführt. Technisch gesehen ist das ein Dienst, den man separat installieren kann und der Clients aktiv über Dateiänderungen mit „Client Push“ benachrichtigt.
Funktion des Client Push
Ohne Client Push fragen verbundene Clients regelmäßig beim Server nach, ob Dateiänderungen vorliegen. Wenn sehr viele Clients verbunden sind, kann das beim Server eine spürbare Last erzeugen. Ein weiterer Nachteil ist, dass Dateiänderungen nur mit einer gewissen Verzögerung übertragen werden.
Client Push ist ein Dienst, der parallel zu Nextcloud unter Linux als Daemon ausgeführt wird und bei jeder Dateiänderung die Clients aktiv informiert.
Die Quellen inkl. Dokumentation findet man bei Github.
Die nachfolgende Beschreibung bezieht sich auf Debian-basierte Linux-Distributionen.
Voraussetzungen
Um die Erweiterung nutzen zu können, muss Redis vorhanden und in Nextcloud eingerichtet sein. Sofern man bisher Redis noch nicht verwendet, kann das wie folgt eingerichtet werden.
Installation Redis-Server
Im ersten Schritt installiert und aktiviert man den Redis-Server wie folgt:
sudo apt install redis-server sudo systemctl start redis-server
Die Standard-Konfiguration von Redis erlaubt normalerweise nur den lokalen Zugriff. Zur Sicherheit sollte man aber prüfen, ob in /etc/redis/redis.conf
folgende Zeile vorhanden ist:
bind 127.0.0.1 ::1
Falls dies nicht der Fall ist, oder die Zeile auskommentiert ist, sollte das korrigiert werden und der Redis-Server danach neu gestart werden.
Konfiguration von Redis in Nextcloud
Bevor man Redis konfiguriert, sollte man sicherstellen, dass die Redis-Unterstützung in PHP vorhanden ist. Dazu kann man folgenden Befehl nutzen:
php -i | grep redis
Wenn hier kein Ergebnis ausgegeben wird, ist die Redis-Extension noch nicht installiert. Das kann man dann wie folgt nachholen:
sudo apt install php-redis
Ist Redis in PHP nutzbar, kann man nun in Nextcloud folgenden Abschnitt in config/config.php
ergänzen:
'memcache.locking' => '\\OC\\Memcache\\Redis', 'redis' => array ( 'host' => 'localhost', 'port' => 6379, 'dbindex' => 0, ),
Wenn Nextcloud im Browser weiterhin funktioniert, war die Konfiguration erfolgreich. Falls nicht, sollte man nochmal prüfen, ob die Redis-Extension für PHP wirklich aktiviert ist und ob Redis läuft – z.B. mit dem Kommandozeilen-Client redis-cli
. Den Client kann man mit quit
wieder verlassen.
redis-cli 127.0.0.1:6379> quit
Einrichtung
Die Einrichtung erfolgt in mehreren Schritten:
- Installation der App „Client Push“ in Nextcloud.
- Einrichten des Push-Server-Dienstes
- Konfiguration des Reverse Proxy für den Push-Server
- Anpassen der Nextcloud-Konfiguration
Installation der App Client Push
Die App „Client Push“ kann in Nextcloud über die App-Verwaltung installiert werden. Man findet sie in der Kategorie „Werkzeuge“ bzw. „Tools“. Nach der Installation ändert sich in der Nextcloud-Oberfläche nichts, aber man erhält zusätzliche OCC-Kommandos in der Konsole.
Einrichten des Reverse Proxy
Für die Nutzung des Dienstes ist ein Reverse Proxy nötig, der den Dienst in Nextcloud aufrufbar macht.
NGINX
Hier ergänzt man in der Konfiguration der Website für Nextcloud folgende Angaben:
location ^~ /push/ { proxy_pass http://127.0.0.1:7867/; 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-Forwarded-For $proxy_add_x_forwarded_for; }
Nach der Konfigurationsanpassung muss der Webserver neu geladen werden:
sudo nginx -s reload
Apache
Hier ist zunächst sicherzustellen, dass alle erforderlichen Module für den Proxy aktiviert sind:
sudo a2enmod proxy sudo a2enmod proxy_http sudo a2enmod proxy_wstunnel
Danach egänzt man in der Konfiguration der Website für Nextcloud folgende Angaben:
ProxyPass /push/ws ws://127.0.0.1:7867/ws ProxyPass /push/ http://127.0.0.1:7867/ ProxyPassReverse /push/ http://127.0.0.1:7867/
Nach der Konfigurationsanpassung muss der Webserver neu gestartet werden:
sudo systemctl restart apache2
Anpassen der Nextcloud-Konfiguration
Damit Nextcloud eingehende Anfragen Push-Server-Dienstes akzeptiert, muss die IP-Adresse des Servers in der Liste der „trusted proxies“ wie folgt in config/config.php
ergänzt werden. Statt <Nextcloud-IP-Adresse>
ist die IP-Adresse des Servers anzugeben.
'trusted_proxies' => array ( 0 => '<Nextcloud-IP-Adresse>', 1 => '127.0.0.1', 2 => '::1', ),
Einrichten des Push-Server-Dienstes
Für den Push-Server-Dienst legt man eine neue systemd-Unit in /etc/systemd/system/notify_push.service
an.
Der Installationsassistent wie auch die Dokumentation geben eine Beispielkonfiguration für systemd an. Leider fehlen darin Abhängigkeiten, was dazu führen kann, dass der Dienst bei einem Neustart des Server nicht richtig startet oder beim Start einen Fehler protokolliert, weil Nextcloud noch nicht ansprechbar ist. Ich habe daher Redis wie auch PHP, Apache und MySQL als Abhängigkeit eingetragen (After
) , damit der Dienst erst startet, wenn Nextcloud vollständig funktionsfähig ist. Falls man nicht Apache sondern NGIX verwendet, muss man die Services entsprechend anpassen. Das gilt auch, wenn man nicht MariaDB/MySQL nutzt, sondern ein anderes Datenbanksystem.
Die Angaben für Environment
und ExecStart
muss man für den eigenen Server anpassen. Statt my-nextcloud-domain.example
trägt man den Namen der eigenen Nextcloud-Domain ein. Ebenso müssen die Pfadangaben für die App und die Konfigurationsdatei natürlich entsprechend der eigenen Installation sein. Bei PORT=
wird der Port von Redis angegeben, der normalerweise 7867 ist. Bei User
gibt man den User an, mit dem Nextcloud oder PHP-FPM ausgeführt wird.
[Unit] Description = Push daemon for Nextcloud clients After = redis-server.service mysql.service php8.1-fpm.service apache2.service [Service] Environment = PORT=7867 Environment = NEXTCLOUD_URL=https://my-nextcloud-domain.example ExecStart = /var/www/my-nextcloud-domain.example/apps/notify_push/bin/x86_64/notify_push /var/www/my-nextcloud-domain.example/config/config.php User = nextcloud [Install] WantedBy = multi-user.target
Mit den folgenden Befehlen kann man den Dienst starten und dauerhaft aktivieren:
systemctl enable notify_push systemctl start notify_push
Prüfen der Funktionsfähigkeit
Mit folgendem Kommando kann man prüfen, ob die Konfiguration erfolgreich war (statt /var/www/my-nextcloud-domain.example
der Pfad, in dem der eigene Nextcloud-Server installiert ist):
php /var/www/my-nextcloud-domain.example/occ notify_push:self-test
Hier sollte dann etwa folgende Ausgabe kommen:
✓ redis is configured ✓ push server is receiving redis messages ✓ push server can load mount info from database ✓ push server can connect to the Nextcloud server ✓ push server is a trusted proxy ✓ push server is running the same version as the app
Praktische Auswirkung im Betrieb
Um den Unterschied im Betrieb zu sehen, kann man in der Browseroberfläche von Nextcloud einen neuen Ordner oder eine neue Datei anlegen, während man parallel dazu den lokal synchronisierten Ordner im Dateimanager göffnet hat. Der neue Ordner oder die neue Datei sollten innerhalb weniger Sekunden auch lokal erscheinen.