Update Nextcloud 31 zu 32
Update Nextcloud 31 zu 32, inklusive AppAPI Einrichtung.
Ausgangslage
Nextcloud ist mein zentraler Speicher für Fotos und Office Dokumente. Ein stabiler und sicherer Betrieb ist mir daher sehr wichtig.
Leider hat die Version Nextcloud Hub 10 den Status “End-of-life” erreicht und ein Update ist unausweichlich.
Die “Maintenance und Release Planung” unter https://github.com/nextcloud/server/wiki/Maintenance-and-Release-Schedule möchte ich hier als gute und übersichtliche Quelle verlinken.
Dieser Artikel beschreibt mein Vorgehen und die Fehlerbehebung beim Update von NC31 auf NC32.
Meine Nextcloud Umgebung
Ich setze die Version Nextcloud Hub 10 (31.0.14) mit einer MariaDB 11.8.6 (mariadb:lts) ein. Die MariaDB hatte ich in Vorbereitung auf das NC32 Update bereits schrittweise von 11.6 auf 11.8 upgedated. Der Stack läuft auf einem Raspberry Pi4, der Docker wird “rootfull” (also nicht “rootless”) betrieben.
Update Pfad
Im Prizip Standard-Vorgehen:
- Herunterfahren des Nextcloud-Stacks
- Sichern aller Bind-Volumes in ein TAR Archiv
- Container Images aktualisieren
- Starten des aktualisierten Stacks
1
2
3
4
docker compose down;
tar cvzf nc31.tgz /data/docker/nextcloud;
docker compose pull;
docker compose up -d
Da das Update von NC31 auf NC32 im Testsystem auf die Bretter ging, bin ich etwas defensiver an das Update meiner Prod Umgebung herangegangen.
Erfahrungen im Testsystem
Ich nutze eine weitere Nextcloud-Instanz als Testsytem für Updates oder Apps. Die Konfiguration entspricht fast der meiner produktiven Nextcloud Instanz. Einziger Unterschied: Das Testsystem läuft auf einem rootless Docker.
Beim Update trat der Fehler auf, das der Stack in eine bootloop lief, weil das Update-Script scheiterte.
Troubleshooting
Da der nextcloud-app container für eine gewisse Zeit lief, konnte ich zunächt im Container schauen was Sache ist.
1
docker exec -it nextcloud-app /bin/bash
Beim Update wird innerhalb des containers nextcloud-appder Befehl
1
rsync -rlDog --chown www-data:www-data --delete --exclude-from=/upgrade.exclude /usr/src/nextcloud/ /var/www/html/
ausgeführt. Der rsync lief bei mir mit einem “permission denied” vor die Wand - und konnte nicht die Dateien kopieren.
Ich überprüfte also die Berechtigungen. Dabei fiel mir auf, das einige Verzeichnisse mit 100032:100032, andere mit root:root berechtigt waren. Ich habe dann im laufenden Container geschaut, welche Files vom Update excluded sind.
1
2
3
4
5
6
7
root@e6502e4924df:/var/www/html# cat /upgrade.exclude
/config/
/data/
/custom_apps/
/themes/
/version.php
/nextcloud-init-sync.lock
Weitere Erkenntnis war, das die Bereiche mit der Berechtigung root:root nicht kopiert werden konnten.
Mit einem beherzten
1
chown 100032:100032 `find -group root`
habe ich das dann korrigiert. Das Update lief dann durch. Die Nacharbeiten waren dann identisch zum Prod-System.
Erfahrung im Prod-System
Nach der Anpassung der docker-compose.yaml ( image: nextcloud:31 -> image: nextcloud:32) habe ich den Stack mit
1
docker compose up
hochgefahren. Nach ca. 2min konnte ich mich einloggen, alles lief. Ein Traum. Offensichtlich waren die Probleme im Testsystem dem rootless Mode geschuldet.
Folgende Fehler wurden nach dem Start in den Sicherheits- & Einrichtungswarnungen moniert.
-
AppAPI-Bereitstellungs-Daemon Der standardmäßige Bereitstellungs-Daemon von AppAPI verwendet kein HaRP.
Für eine bessere Leistung sollte ein Upgrade darauf in Erwägung gezogen werden. Beschreibung siehe im folgenden Abschnitt. -
MIME-Type-Migrationen verfügbar
Lösung: Verwende den Befehlocc maintenance:repair --include-expensive, um die Migrationen durchzuführen. -
In der Datenbank fehlen Indizes
Lösung: Bitte den Befehlocc db:add-missing-indicesverwenden, um sie hinzuzufügen.
AppAPI
Mit der NC32 wird ein neues Feature verpflichtend - AppAPI.
Den ersten Berührpunkt hat man, wenn man in den Sicherheits- & Einrichtungswarnungen schaut, ob das Update gut gelaufen ist…. und die genannten Fehler aufleuchten.
Eingeführt wurde das bereits mit den letzten NC31 Versionen - allerdings musste man das nicht konfigurieren, wenn man es nicht brauchte.
Was ist AppAPI ?
Braucht man das ?
Keine Ahnung, “it depends”.
Ich habe erstmal ein wenig recherchiert, was AppAPI genau macht.
Eine gute Erklärung zu dem Thema AppAPI liefert Thomas Joos auf der Seite
https://www.computerweekly.com/de/tipp/Nextcloud-externe-Apps-mit-Docker-und-AppAPI-einrichten.
Sehr empfehlenswert.
Einrichtungs-Alternativen
Folgende Alternativen zum Umgang mit der AppAPI habe ich recherchiert:
- AppAPI disablen
- Docker Socket Proxy 1.0 installieren
- Docker Socket Proxy 2.0 / HaRP Proxy installieren
Variante AppAPI disablen
Man kann die AppAPI einfach deaktivieren.
Im Nextcloud-Interface rechts-oben auf das Profil klicken → Apps → links via "Deine Apps" eine Liste der aktiven Apps anzeigen → AppAPI deaktivieren → fertig
Variante Docker Socket Proxy
Eine wirklich gute und ausführliche Erklärung zum Thema AppAPI im Detail: Grundlagen, Einrichtung und Konfiguration ist auf https://decatec.de/home-server/nextcloud-mit-externen-apps-erweitern-die-appapi-im-detail-grundlagen-einrichtung-und-konfiguration/ zu finden.
Für die Einrichtung des Docker Socket Proxy reicht folgender Einzeiler:
1
2
3
4
5
6
7
8
9
docker run -e NC_HAPROXY_PASSWORD="MeinPassw0rt" \
--network=bridge \
-p 127.0.0.1:2375:2375 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name nextcloud-appapi-dsp \
-h nextcloud-appapi-dsp \
--restart always \
--privileged \
-d ghcr.io/nextcloud/nextcloud-appapi-dsp:release
Variante HaRP Proxy
DECATEC hat auch zum Thema AppAPI mit HaRP einen sehr guten Artikel auf https://decatec.de/home-server/nextcloud-mit-externen-apps-erweitern-appapi-mit-harp/ bereitgestellt. Wie beim Docker Socket Proxy reduziert sich die Installation des HaRP Proxy auf eine Zeile.
1
2
3
4
5
6
7
8
9
10
docker run \
-e HP_SHARED_KEY="MeinSicheresPasswort!123" \
-e NC_INSTANCE_URL="https://nextcloud.meinedomain.de" \
-e HP_EXAPPS_ADDRESS="127.0.0.1:8780" \
-v /var/run/docker.sock:/var/run/docker.sock \
-v `pwd`/certs:/certs \
--name appapi-harp -h appapi-harp \
--restart unless-stopped \
--network host \
-d ghcr.io/nextcloud/nextcloud-appapi-harp:release
Auf jeden Fall vielen Dank an Jan Rehr für die sehr verständlichen und ausführlichen Artikel.
Meine Anpassungen / HaRP im Docker-Mode
Im Beispiel oben wird der HaRP im Host Modus betrieben.
Ich stecke den HaRP-Container in das Nextcloud Netzwerk und habe dafür ein docker-compose.yaml erzeugt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
services:
nextcloud-appapi-harp:
image: ghcr.io/nextcloud/nextcloud-appapi-harp:release
container_name: nextcloud-appapi-harp
restart: unless-stopped
networks:
- ${NC_NETWORK}
environment:
- HP_SHARED_KEY=${HP_SHARED_KEY}
- NC_INSTANCE_URL=${NC_URL}
# - HP_EXAPPS_ADDRESS="127.0.0.1:8780"
- LOG_LEVEL=info
- DOCKER_NETWORK=${NC_NETWORK}
ports:
- "8780:8780" # Optional: Port für den HaRP-Daemon, falls extern zugreifbar
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro # Zugriff auf Docker-Daemon
- ${HP_ROOT}/certs:/certs
networks:
${NC_NETWORK}:
external: true
Die Variablen ziehe ich aus einer .env:
- HP_ROOT=Pfad zum Bind-Volume
- HP_SHARED_KEY=SuperSichererSchlüssel
- NC_NETWORK=Netzwerk des Nextcloud Stacks
- NC_URL=Nextcloud URL
Registrieren des HaRP-Proxy
Wie im Beispiel beschrieben, muß man diesen HaRP-Proxy dann über Administration -> AppAPI in der Nextcloud registrieren.
Achtung: Beim Registrieren des Daemons achtet auf die richtige Daemon-Konfigurationsvorlage: Ich habe
HaRP Proxy (Docker)gewählt !
Die Maske mit der Registrierung des HaRP-Proxy sieht dann so aus:
Die Verbindung steht nun, man kann eine Bereitstellung testen.

Reverse Proxy anpassen
Ich nutze aktuell einen NPMPlus Reverse Proxy.

Hier musste ich beim Nextcloud-Proxy-Host eine “Custom Location” /exapps/ einrichten, die auf den Port 8780 des Docker-Hosts mit dem HaRP-Container zeigt.
Die Verwendung Container-Names (wie im Screenie) hat bei mir nicht funktioniert.
ALs Options habe ich dann noch
1
2
3
4
5
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 1800s;
gesetzt.
Ergänzende Quelle und Trobleshooting-Hilfe dazu: https://github.com/nextcloud/HaRP
Fazit
Das war nun nicht mein erstes Nextcloud Update, aber dennoch eines der zeitaufwändigeren.
Minor Updates gehen in der Regel problemlos von der Hand.
Major Updates erfordern grundsätzlich etwas mehr Vorbereitung - ein restorefähiges Backup beruhigt.
Daher war die gründliche Vorbereitung (Backup, Recherche zu AppAPI) gut investierte Zeit.
Das Update von NC31 auf NC32 funktionierte grundsätzlich im Prod-System gut.
Allerdings ging das Update im ersten Test auf die Bretter - nicht so gut und zeitintensiv.
Die meiste Zeit ging bei der AppAPI bzw. dem HaRP-Proxy drauf, der in meiner Prod-Umgebung nicht auf Anhieb funktionierte.
Insgesamt eine Version, die Nextcloud merklich einen Schritt nach vorn bringt, gerade was das Angebot an App-Paketen angeht.

