HOWTO

Nextcloud (Docker-) Instanzen upgraden

Neue Nextcloud releases kommen stetig.

Das ist kein Grund immer auf die jeweils aktuellste Version zu migrieren - regelmäßig Security Patches einzuspielen reicht vollkommen aus und spart wertvolle Zeit, so man aktuelle Features nicht vermisst.

Sobald eine Nextcloud-Instanz jedoch keinen Support mehr erhält ist es auch für “never touch a running system”-Dudes wie mich an der Zeit auf eine aktuelle Version upzugraden. :)

Auch ohne tiefgreifendes Docker-Foo gelingt dies im Falle von Nextcloud erstaunlich einfach, wie ich dir im Folgenden zeige.

Szenario

Eingesetzt wird ein Apache2-Reverse-Proxy der auf eine in einem Docker-Container befindliche veraltete Nextcloud-Instanz umleitet.

Daten sowie Konfiguration befinden sich auf dem Host in den Verzeichnissen data bzw. config unter /srv/docker/nextcloud/ und werden innerhalb des Dockercontainers als /var/www/html/data und /var/www/html/config gemounted.

Aufgabe

Nextcloud Version 18.0.0 auf 21.0.8 upgraden.

Lösung

# disablen der cron-jobs für die nextcloud instanz

$ crontab -e
#*/15 * * * * docker exec -u www-data nextcloud php -f /var/www/html/cron.php 2>&1


$ docker pull nextcloud:18.0.14

$ docker stop nextcloud
$ docker rm nextcloud 

$ docker run -d --name nextcloud -p 8090:80 -v /srv/docker/nextcloud/data:/var/www/html/data -v /srv/docker/nextcloud/config:/var/www/html/config nextcloud:18.0.14

# Nun über die Shell upgraden (occ) 
# (im WebUI upgraden funktioniert ebenfalls, lässt sich aber schlecht automatisieren)

# option 1: manueller aufruf im container

$ docker exec -it --user www-data nextcloud bash
nextcloud-container $ cd /var/www/html/ && php occ upgrade

# option 2: autom. aufruf außerhalb des containers
$ docker exec -it --user www-data nextcloud php /var/www/html/occ upgrade

Das ganze wiederholt man nun major-release für major-release bis man beim aktuellen angekommen ist (“kumulativer Upgrade Prozess”), a la:

$ docker pull nextcloud:19.0.9
$ docker stop nextcloud
$ docker rm nextcloud 
$ docker run -d --name nextcloud -p 8090:80 -v /srv/docker/nextcloud/data:/var/www/html/data -v /srv/docker/nextcloud/config:/var/www/html/config nextcloud
...
$ docker pull nextcloud:20.0.8
...
$ docker pull nextcloud:21.0.0
...
usw.

Anschließend re-enabling der cron-jobs für die Nextcloud-Instanz:

$ crontab -e
*/15 * * * * docker exec -u www-data nextcloud php -f /var/www/html/cron.php 2>&1

Fertig! :)

Optional ist es sinnvoll noch Platz zu schaffen indem man die alten Docker-Images vom Host entfernt:

$ docker image list --filter dangling=true
$ for i in $(docker image list --quiet --filter dangling=true); do docker image rm $i; done

Der Prozess lässt sich prima automatisieren. Ich finde es jedoch hilfreich ein Upgrade zuerst - wie gezeigt - manuell durchzuführen. Mit diesem Verständniss lässt sich schnell ein Script basteln, welches genau auf deine Bedürfnisse passt und leicht zu debuggen ist.


Literatur & weiterführende Links
Nexcloud Admin manual
nextcloud@dockerhub