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