IT

Nextcloud mit Docker auf der Kommandzeile updaten

Spickzettel: Nextcloud über einen Dockercontainer auf der Kommandozeile Updaten:

1. Dockerfile erstellen (Version mit Postgresql, für Mysql bitte anpassen)

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update
RUN apt install -y --no-install-recommends php8.1
RUN apt install -y ca-certificates
RUN apt install -y sudo
RUN apt install -y php8.1-cli
RUN apt install -y php8.1-common
RUN apt install -y php8.1-zip
RUN apt install -y php8.1-gd
RUN apt install -y php8.1-mbstring 
RUN apt install -y php8.1-curl
RUN apt install -y php8.1-xml
RUN apt install -y php8.1-bcmath
RUN apt install -y php8.1-pgsql
RUN apt install -y php8.1-pdo
RUN apt install -y php8.1-opcache  
RUN apt install -y php8.1-intl
RUN apt install -y php8.1-fileinfo  
RUN apt install -y php8.1-ctype
RUN apt install -y php8.1-posix
RUN apt install -y php8.1-simplexml  
RUN apt install -y php8.1-exif
RUN apt install -y php8.1-dom
RUN apt install -y php8.1-XMLReader
RUN apt install -y php8.1-XMLWriter
 

RUN apt install -y php8.1-fpm
CMD ["php-fpm8.1", "-F"]

2. Dockerfile compilieren

sudo docker build -t myphp81fpm .

3. nextcloud/config/config.php: Bei Postgersql Zugriff über das Netzwerk einstellen.
4. Dockercontainer ausführen (Pfade anpassen nicht vergessen):

sudo docker run \
--rm \
--name php81next \
 -v /var/www/nextcloud:/var/www/nextcloud \
 -v /mnt/nextcloud/data:/mnt/nextcloud/data \
  myphp81fpm

5. In den Dockercontainer reingehen:

sudo docker exec -it php81next /bin/sh

6. im Ordner ‚/var/www/nextcloud‘ ( oder wie oben im Pfad eingetragen) ausführen:

sudo -E -u www-data php occ status

Wenn das ohne Fehlermeldung abläuft:

sudo -u www-data php occ maintenance:mode --on
sudo -u www-data php updater.phar

Wie ich php-fpm nicht zum laufen bekommen habe

Mein SSH meckerte immer, dass meine Verbindung nicht mehr sicher ist. Gut, ich war in meinem Heimnetzwerk, aber ich musste mich wohl oder übel mit dem Gedanken anfreunden, mein Debian auf meinem Server zu updaten. Aktuell war ich auf ‚Bookworm‘ und sprang mit dem Update gleich zu ‚Trixie’. Und damit endet die Geschichte. Hatte ich jedenfalls gehofft.

Nextcloud geht nicht. Nextcloud frustriert mich. Wenn alles funktioniert ist es super. Leider kommt das nicht so oft vor. Meistens ist es die Android App, aber auch sonst ist immer irgend was. Aber um fair zu sein, es ist nicht immer die alleinige Schuld Nextclouds.

Um das alles mal zu ordnen. Nextcloud funktioniert pro Version immer nur mit bestimmten PHP Versionen (siehe Liste). Debian liefert immer nur bestimmte PHP Versionen. Wie auch hier. Bookworm hatte php7.4 und php8.1, Trixie segnet einen mit php8.4 und php7.4 aber nix dazwischen, keine Ahnung warum. Ich war bei Nextcloud 25 und das mag kein php8.4, würde aber noch mit php7.4 funktionieren. Jedoch heißt das, php downgraden und mit Nextcloud auf Version 25 festhängen.

Bold = Recommended PHP Version for this Nextcloud Release
Nextcloud Version Supported PHP Versions
33                8.2, 8.3, 8.4, 8.5
32                8.1, 8.2, 8.3, 8.4
31                8.1, 8.2, 8.3, 8.4
30                8.1, 8.2, 8.3
29                8.0, 8.1, 8.2, 8.3
28                8.0, 8.1, 8.2, 8.3
27                8.0, 8.1, 8.2
26                8.0, 8.1, 8.2
25                7.4, 8.0, 8.1

Quelle: https://github.com/nextcloud/server/wiki/Releases-and-PHP-versions

So, ich hab also Debian mit php8.4 und ein Nextcloud 25 das nicht funktioniert. Also Nextcloud updaten. Am besten mit Docker, da es ja genau für so etwas ausgelegt ist. Wäre es nicht cool gleich ein Docker mit php8.1-fpm als drop in replacement zu haben, dann kann ich über die Weboberfläche die Updates machen. Natürlich kann Nextcloud auch über die Kommandozeile geupdated werden, aber das andere wäre nicer. Vor allem sollte das in kürzester Zeit möglich sein. Oder nicht? Das war mein erster Fehler. Ich hätte mich nur aufs updaten konzentrieren sollen.

**** Zwei Tage später ****

Ich hab Nextcloud dann doch über die Kommandozeile geupdatet und mich erinnert, warum ich administrative Aufgaben nicht mag. Aber alles der Reihe nach.

In Theorie brauchen wir ein Docker mit php8.1-fpm und allen nötigen PHP Modulen um Nextcloud zum laufen zu bekommen. Außerdem benötigt der Container Zugriff auf die Nextcloud Dateien. Des weiteren müssen wir Nextcloud config/config.php anpassen. Ich nutze Postgesql über die Socketfunktion. D.h. wir müssen auch Postgresql beibringen über TCP zu arbeiten. Anscheinend kann auch das Socket einem Container bereit gestellt werden, aber das wusste ich zu dem Zeitpunkt noch nicht, scheint auch nicht ganz trivial mit den Zugriffsrechten zu sein. Dann passen wir noch Nginx an, um den neuen Docker php-fpm zu nutzen.

Schritt 1: Ist wie immer, Backup machen. Wir brauchen die Dateien in /var/www/ ,vor allem die config.php, da dort unser Salt für die Datenbank drin ist. Dann ein Datenbankbackup und ein Backup der Daten wenn ihr den ‚data‘ Ordner nicht in ‚/var/www/nextcloud‘ mit habt.

Schritt 2: Container finden oder Dockerfile selbst erstellen. Ich hab leider kein fertigen Container finden können, der php8.1-fpm mit den von Nextcloud benötigten Modulen vorgefertigt hat. Also erstelle ich mir selbst ein Dockerfile und nutze als Grundlage php:8.1-fpm-alpine3.17. Alpine wird oft verwendet und ich dachte mir, das ist ein guter Zeitpunkt das auch zu lernen. Das zähle ich als meinen zweiten Fehler.

Nichtfunktionierende Version 1

FROM php:8.1-fpm-alpine3.17


RUN apk add --no-cache sudo \ 
postgresql-dev \
ca-certificates \
openssl \
curl \
openssh \
yaml \
pcre \
libmemcached-libs \
zlib \
libzip \
libpng \
libjpeg-turbo \
libwebp \
freetype \
zip \
php81 \
zlib \
php81-intl \
php81-fileinfo  \
php81-ctype  \
php81-simplexml \ 
php81-exif  \
#php81-libxml \
php81-gd \
php81-bcmath \
php81-curl \
php81-dom \
php81-iconv \
php81-intl \
php81-json \
php81-openssl \
php81-opcache \
php81-mbstring \
php81-pgsql \
php81-phar \
php81-phpdbg \
php81-posix \
php81-session \
php81-soap \
php81-sockets \
php81-xml \
php81-xmlreader \
php81-xmlwriter \
php81-zip \
php81-zlib 

# Set recommended PHP.ini settings for Nextcloud

RUN echo "upload_max_filesize=10G" > /usr/local/etc/php/conf.d/nextcloud.ini  
RUN echo "post_max_size=10G" >> /usr/local/etc/php/conf.d/nextcloud.ini  
RUN echo "memory_limit=512M" >> /usr/local/etc/php/conf.d/nextcloud.ini  
RUN echo "error_log = log/php-fpm.log" >> /usr/local/etc/php/conf.d/nextcloud.ini
RUN echo "log_level = debug" >> /usr/local/etc/php/conf.d/nextcloud.ini

RUN echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.ini  
RUN echo "opcache.memory_consumption=128" >> /usr/local/etc/php/conf.d/opcache.ini  
RUN echo "opcache.interned_strings_buffer=8" >> /usr/local/etc/php/conf.d/opcache.ini  
RUN echo "opcache.max_accelerated_files=10000" >> /usr/local/etc/php/conf.d/opcache.ini


EXPOSE 9000

CMD ["php-fpm", "-F"]

Unter https://docs.nextcloud.com/server/30/admin_manual/installation/php_configuration.html findet sich eine Liste von PHP Modulen die Nextcloud benötigt.

PHP (see System requirements for a list of supported versions)
PHP module ctype
PHP module curl
PHP module dom
PHP module fileinfo (included with PHP)
PHP module filter (only on Mageia and FreeBSD)
PHP module GD
PHP module hash (only on FreeBSD)
PHP module JSON (included with PHP >= 8.0)
PHP module libxml (Linux package libxml2 must be >=2.7.0)
PHP module mbstring
PHP module openssl (included with PHP >= 8.0)
PHP module posix
PHP module session
PHP module SimpleXML
PHP module XMLReader
PHP module XMLWriter
PHP module zip
PHP module zlib

Alpine hat kein libxml Modul, dass sind so Kleinigkeiten die einen Zeit rauben, ich erstelle solche Installationslisten oft per try and error, da ich große Probleme habe Informationen zu finden, welche Distro, welche Sachen unter welchen Namen anbietet. Aber das war nicht das größte Problem.

Das Image erzeugen wir mit:

sudo docker build -t myphp81fpm .

wobei myphp81fpm der Name des Images ist und . das Verzeichnis in dem das Dockerfile ist.

Und gestartet habe ich alles mit

sudo docker run \
--rm \
--name php81next \
-v /var/www/nextcloud:/var/www/nextcloud \
-v /mnt/nextcloud/data:/mnt/nextcloud/data \
-p 9000:9000 \
myphp81fpm

— rm sagt das wir dne Container vernichten wenn wir ihn nicht mehr benötigen
— name php81next setzt den Namen des Containers
-v setzt die Ordner von dem Host Computer in den Container z.b:
die Nextcloud Daten
die eigentlichen Daten
-p ist die Portfreigabe
und myphp81fpm ist das Image, dass wir gerade erstellt haben.

Nachdem wir Postgresql umgestellt haben, um auf TCP zu hören und nextcoud/config/config.php auf unseren Hostserver gesetzt haben für Postgresql, musste nur noch Nginx mit dem php-fpm aus dem Container verbunden werden. Jetzt konnte es schon los gehen.
Ich setze mir eine Testseite auf und teste das ganze mit PHPInfo().

Funktioniert, jetzt mit Nextcloud. Error: File not Found

Nach einigem Googlen schlummerte mir die Erkenntnis, dass php-fpm die Daten in /var/www/nextcloud nicht lesen konnte. Warum? Nextcloud möchte gern, dass die Daten unter dem User ‚www-data‘ laufen. Wer etwas Ahnung vom Benutzerschema unter Linux hat, weiß dass die Benutzer per Nummern angesprochen werden. Alles unter 1000 sind normalerweise irgend welche Systembenutzer wie ‚wheels‘ oder ‚nobody‘. Darunter fällt auch ‚www-data‘. Da ich vorher ein Debian hatte und jetzt praktisch ein Alpine, stimmten die automatisch vergebenen Nummern nicht mehr. Wäre toll, wenn es da einen Standard geben würde, aber ist halt nicht.

Nächster Fehler: Internal Server Error

Was nun? Also alles der Reihe nochmal überprüfen: Nginx lief, dass wusste ich, da ich ja im Browser eine Meldung bekommen habe. Php-fpm funktionierte, da ich ja den Fehler erhalten hatte nachdem ich die Leseberechtigung geändert hatte und keinen 500er Fehler, der eher kommt wenn PHP nicht will. Postges war es jedoch auch nicht, da ich a) von einem anderen Rechner mit meinen Nextcloud Daten auf die Datenbank zugreifen konnte und b) auch curl bei Port 5432 eine leere Antwort zurück gab und keinen Fehler, was passieren würde falls der Port geschlossen ist.

Nach einigem rumprobieren kam ich drauf, es liegt an Alpine. Besser gesagt, in Alpine sehe ich den Postgresqlserver, aber aus irgend einem Grund funktioniert das php-postgres Modul nicht. Wie in der PHPInfo gezeigt ist Postgresql und Postgesql für PDO geladen, aber ‚pg_connect‘ gibt es nicht. Das klingt wie ein Pfaderror oder hier überschreibt ein Modul ein anderes oder ‚pg_connect‘ ist in einem anderen Modul enthalten, dass ich noch nicht habe. Ich hatte keine Lust in den Container rein zu kriechen um nachzusehen, wo die Defaulteinstellungen falsch abgebogen sind.

Einige Leute im Netz empfehlen deswegen, die Module selbst zu kompilieren. Ich hab früher für einige Zeit Gentoo benutzt. D.h. ich weiß wie nervig das sein kann, da immer was fehlt. Und damit will ich Gentoo nicht schlecht reden, die hatten schon damals einen unglaublich guten Job gemacht, den Schmerz so gering wie möglich zu halten. Aber sehen wir den Tatsachen ins Auge. Wer denkt das Ruby, Python und Javascript problematisch sind, beim Abhängigkeiten ziehen, der hat noch nicht viel selbst kompiliert.

Nichtfunktionierende Version 2

FROM php:8.1-fpm-alpine3.17  

RUN apk add --no-cache sudo postgresql-dev libzip libpng libjpeg-turbo libwebp freetype zip php81 zlib curl ca-certificates  
RUN apk add --no-cache --virtual build-essentials postgresql-dev php81-dev libxml2-dev oniguruma-dev zlib-dev curl-dev libzip-dev libwebp-dev freetype-dev libpng-dev jpeg-dev libjpeg-turbo-dev 

RUN docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg --with-webp

RUN docker-php-ext-install gd  
RUN docker-php-ext-install pdo  
RUN docker-php-ext-install pdo_pgsql  
RUN docker-php-ext-install pgsql  
RUN docker-php-ext-install zip  
RUN docker-php-ext-install gd  
RUN docker-php-ext-install opcache  
RUN docker-php-ext-install intl  
RUN docker-php-ext-install fileinfo  
RUN docker-php-ext-install ctype  
RUN docker-php-ext-install curl  
RUN docker-php-ext-install mbstring  
RUN docker-php-ext-install posix  
RUN docker-php-ext-install xml  
RUN docker-php-ext-install simplexml  
RUN docker-php-ext-install exif  
RUN docker-php-ext-install dom  
RUN docker-php-ext-install libxml  
RUN docker-php-ext-install zlib  
RUN docker-php-ext-install XMLReader  
RUN docker-php-ext-install XMLWriter

RUN docker-php-ext-enable pdo_pgsql pgsql opcache intl

RUN apk del build-essentials && rm -rf /usr/src/php\*

# Set recommended PHP.ini settings for Nextcloud

RUN echo "upload_max_filesize=10G" > /usr/local/etc/php/conf.d/nextcloud.ini  
RUN echo "post_max_size=10G" >> /usr/local/etc/php/conf.d/nextcloud.ini  
RUN echo "memory_limit=512M" >> /usr/local/etc/php/conf.d/nextcloud.ini  
RUN echo "error_log = log/php-fpm.log" >> /usr/local/etc/php/conf.d/nextcloud.ini  
RUN echo "log_level = debug" >> /usr/local/etc/php/conf.d/nextcloud.ini

RUN echo "opcache.enable=1" >> /usr/local/etc/php/conf.d/opcache.ini  
RUN echo "opcache.memory_consumption=128" >> /usr/local/etc/php/conf.d/opcache.ini  
RUN echo "opcache.interned_strings_buffer=8" >> /usr/local/etc/php/conf.d/opcache.ini  
RUN echo "opcache.max_accelerated_files=10000" >> /usr/local/etc/php/conf.d/opcache.ini

EXPOSE 9000

CMD \["php-fpm", "-F"\]


Hier hab ich dann aufgegeben. Nach endlosen Versuchen raus zufinden welches PHP Modul noch welches ‚dev‘ benötigt und wie das heißt, hatte mich dann dieser Fehler geschlagen.

Make sure that you run '/usr/local/bin/phpize' in the top level source directory of the module

phpize sollte installiert sein durch php81-dev und die einzige Lösung die mir einfiel war, den Container ohne php zu bauen und dann im Container php zu kompilen, um zu sehen wo der Fehler war. Darauf hatte ich auch keine Lust.

Dann nehm ich halt nicht Alpine und nehme Ubuntu, da sollte php postgresql richtig eingebunden sein. Ubuntu ist zwar aufgebläht, aber funktioniert meistens.

kein php-fpm aber zum Updaten reichts

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update
RUN apt install -y --no-install-recommends php8.1
RUN apt install -y ca-certificates
RUN apt install -y sudo
RUN apt install -y php8.1-cli
RUN apt install -y php8.1-common
RUN apt install -y php8.1-zip
RUN apt install -y php8.1-gd
RUN apt install -y php8.1-mbstring 
RUN apt install -y php8.1-curl
RUN apt install -y php8.1-xml
RUN apt install -y php8.1-bcmath
RUN apt install -y php8.1-pgsql
RUN apt install -y php8.1-pdo
RUN apt install -y php8.1-opcache  
RUN apt install -y php8.1-intl
RUN apt install -y php8.1-fileinfo  
RUN apt install -y php8.1-ctype
RUN apt install -y php8.1-posix
RUN apt install -y php8.1-simplexml  
RUN apt install -y php8.1-exif
RUN apt install -y php8.1-dom
RUN apt install -y php8.1-XMLReader
RUN apt install -y php8.1-XMLWriter
 

RUN apt install -y php8.1-fpm

# Set recommended PHP.ini settings for Nextcloud

RUN echo "listen=9000" >> /etc/php/8.1/fpm/pool.d/nextcloud.ini  
RUN echo "listen.allowed_clients=" >> /etc/php/8.1/fpm/pool.d/nextcloud.ini  
RUN echo "upload_max_filesize=10G" >> /etc/php/8.1/fpm/pool.d/nextcloud.ini  
RUN echo "post_max_size=10G" >> /etc/php/8.1/fpm/pool.d/nextcloud.ini  
RUN echo "memory_limit=512M" >> /etc/php/8.1/fpm/pool.d/nextcloud.ini  





RUN echo "opcache.enable=1" >> /etc/php/8.1/fpm/pool.d/nextcloud.ini
RUN echo "opcache.memory_consumption=128" >> /etc/php/8.1/fpm/pool.d/nextcloud.ini 
RUN echo "opcache.interned_strings_buffer=8" >> /etc/php/8.1/fpm/pool.d/nextcloud.ini 
RUN echo "opcache.max_accelerated_files=10000" >> /etc/php/8.1/fpm/pool.d/nextcloud.ini


EXPOSE 9000

CMD ["php-fpm8.1", "-F"]

Nach einigem rumprobieren kam ich auf dieses Dockerfile. Und nachdem ich meine Dateien wieder auf das originale ‚www-data‘ gesetzt hatte, startete ich den Container. (Falls sich Leser wundern, Ubuntu stammt von Debian ab, deswegen ist die Change sehr groß, dass Systembenutzer die gleichen Nummern haben.)

 

Wie schon oben erwähnt, heißt das meistens, dass php-fpm ein Fehler hat. Und ja, Port 9000 war tot. Das es generell funktionieren kann, wusste ich von Alpine, also was war jetzt? Ich ging in den Container rein mit:

sudo docker exec -it php81next /bin/sh

und als ich in ‚/var/www/nextcloud‘ war testete ich mit:

sudo -E -u www-data php occ status

die Nextcloudinstallation und da dort alles funktionierte … ab ich dann alles über die Kommandozeile geupdatet.

sudo -u www-data php occ maintenance:mode --on
sudo -u www-data php updater.phar

Den zweiten Befehl so oft ausführen, bis die gewünschte Nextcloudversion errreicht ist.

Ich hab dann noch versucht listen=9000 in die Nextcloud ini zu schreiben, um damit vielleicht noch den Container funktionsfähig für php-fpm zu machen, aber irgendwas wollte da immer noch nicht und ich hatte mich schon zu lange mit dem Problem aufgehalten.

Zusammenfassung: Ich konnte mit dem Ubuntucontainer mein Nextcloud updaten und das ist letzten Endes alles was zählt. Vielleicht kommt da noch ein Update, wenn mich die Sache nicht in Ruhe lässt. Ich meine, es kann ja wirklich nicht mehr viel sein, warum das Ding nicht über Port 9000 ansprechbar ist. Auf der anderen Seite ist es php8.1, wer brauch das den noch …

In diesem Sinne

Bis Später

Tagged , ,

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert