Client Push für Nextcloud einrichten

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:

  1. Installation der App „Client Push“ in Nextcloud.
  2. Einrichten des Push-Server-Dienstes
  3. Konfiguration des Reverse Proxy für den Push-Server
  4. 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.

Öffentlichen Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Dies ist kein Kontaktformular! Wenn Du mir eine persönliche Nachricht schreiben möchtest, benutze die E-Mail-Adresse in meinem Impressum.

Du kannst die folgenden HTML-Tags im Kommentar verwenden:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>