Nextcloud 13 / UCS 4.3: Installation Redis für PHP 7.0 innerhalb des Docker Nextcloud Container

Hallo zusammen,

ich möchte die App “OCR” für Nextcloud 13 im UCS 4.3 installieren:
https://apps.nextcloud.com/apps/ocr

Diese App setzt redis-server, php-redis, tesseract-ocr and OCRmyPDF voraus. Nähere Installationshinweise habe ich von hier:

Zunächst habe ich redis-server direkt am UCS 4.3 installiert und bin dabei der Anleitung hier gefolgt: https://redis.io/topics/quickstart

Dabei traten keine Probleme auf, der redis-server läuft.

In der Anleitung von Janis91 wird zunächst die Installation von Docker an sich beschrieben, welche ich bei UCS 4.3 nicht durchgeführt habe, da Docker bereits vorhanden ist.

Ich bin mir aber nicht sicher, welche Einstellungen für Univention-kompatible Docker Images vorzunehmen sind und frage mich daher, ob die Docker-Installation laut Janis91 genau so ausgeführt werden kann:

In order to build the redis image that supports authentication, you have to run the following command within the redis/ directory:

docker build --build-arg PASSWORD="" -t /redis .

Options :

  • build-arg : PASSWORD="" - here you can specify a safe password for Redis authentication, you want to have available in your docker container later (Consider: since Redis is pretty fast an outside user can try up to 150k passwords per second against a good box. This means that you should use a very strong password otherwise it will be very easy to break). If this argument is omitted OCR is the password by default. If the argument is set to an empty string, no password will be set and authentication will be inactive (maybe insecure).
  • t : tag your image with a proper name (fill in your preferred name inside of the <> brackets)

Frage 1: Hier frage ich mich bereits, welcher festzulegen ist.

Des weiteren muss noch für PHP 7.0 php-redis installiert werden, allerdings im Docker Container von Nextcloud. An dieser Stelle kämpfe ich gleich mit zwei Schwierigkeiten:

Frage 2: Auf welche Art und Weise kann ich fehlende Pakete im Container nachinstallieren? Ich habe mich mit “univention-app shell nextcloud” in die Shell des Containers begeben. Ist das überhaupt korrekt?

Frage 3: Ich weiß nicht, wie ich PECL-Extensions für PHP 7.0 installieren soll.

Innerhalb des Nextcloud Containers fand ich zwar /usr/bin/pecl und habe folgenden Befehl ausgeführt:
pecl install redis

Das funktionierte jedoch nicht auf Anhieb. Damit pecl überhaupt redis erzeugen konnte, musste ich zunächst phpize erzeugen und habe mich dabei von folgender Anleitung inspirieren lassen, die jedoch für PHP 5.X ausgelegt ist:

Dementsprechend habe ich mir zunächst das aktuelle shtool geholt:
wget http://ftp.de.debian.org/debian/pool/main/s/shtool/shtool_2.0.8-9_all.deb
dpkg -i shtool_2.0.8-9_all.deb

Danach habe ich mir die php7.0-dev geholt, um mittels shtool zu phpize zu gelangen:
apt-get install php7.0-dev

Dabei erhielt ich im Container die Datei /usr/lib/php/20151012/redis.so. Nachdem es auch ein Verzeichnis /usr/lib/php/7.0 gibt, habe ich Zweifel, ob das vorhandene /usr/bin/pecl und die hier angeführte Prozedur überhaupt richtige ist.

Frage 4: Selbst wenn die bisherigen Hürden gemeistert sind, stelle ich mir die Frage, auf welche Art und Weise die zugehörige php.ini abzuändern ist, damit Nextcloud im Docker Container auf php-redis zurückgreifen kann.

Ich habe mich mittels “univention-app shell nextcloud” in den Container begeben und php.ini in folgenden Verzeichnissen identifiziert:
/etc/php/7.0/apache2/php.ini
/etc/php/7.0/cli/php.ini

Wie ist der korrekte Weg, um nachträgliche Anpassungen an Konfigurationsdateien vorzunehmen und in einem Docker Container einzufügen? Ich müsste die Zeile “extension=redis.so” einfügen.

Frage 5: Die Anleitung von Janis91 lässt sich nicht weiter über die Installation von tesseract-ocr und OCRmyPDF aus. Hat jemand konkrete Erfahrungen damit gemacht und kann mir Hinweise geben, welche Ressourcen ich mir zwecks Installation ansehen kann?

Ich danke Euch für Hinweise!

Viele Grüße
Peter

Hallo Peter,

ein langer Beitrag und einige Fragen… Ich habe die Erweiterung auf einem Debian Nextcloud, d.h. ohne Nextcloud-Docker am Laufen. D.h. ich fange einfach einmal mit Frage 1 an:
Ich bin über die gleiche Frage gestolpert, aber letztlich geht es nach Anleitung:

docker build --build-arg PASSWORD="superlangesPasswortalsoehernochlänger" -t bernd/redis .

Das Passwort kommt später in die App. Und das gleiche für den OCR Docker:

docker build -t bernd/ocr .

Die Namen sind frei wählbar aber wichtig, weil sie ja später beim docker run übergeben werden.

2: Ist korrekt. Wobei ich mich nicht erinnern kann überhaupt irgendwelche Anpassungen an php vorgenommen zu haben. D.h. ich kann zu den Fragen 3-4 nichts sagen. Frage 5 verstehe ich nicht ganz - es wird ja ein OCR Docker erstellt?!

Wenn die Nextcloud-Daten nicht verschoben wurden, finden sie sich unter:

/var/lib/univention-appcenter/apps/nextcloud/data/nextcloud-data/

D.h. für die run Befehle würde ich probieren (nach dem Erstellen des Docker-Netzwerks):

docker run --network=isolated_ocr -p 6379:6379 -d bernd/redis

und

docker run --network=isolated_ocr -e "NODE_ENV=production" -e "REDIS_HOST=redis" -e "REDIS_PORT=6379" -e "REDIS_DB=0" -v /var/lib/univention-appcenter/apps/nextcloud/data/nextcloud-data:/home/node/data:ro -v /tmp:/home/node/output -d bernd/ocr

Grüße,
Bernd

Huhu,

Docker-Images sind darauf ausgelegt, dass man in ihnen nichts verändert, sondern bei neuen Anforderungen das Dockerfile (die Bauanleitung, aus der ein Image erstellt wird) ergänzt, daraus einen neuen Container baut und den vorhandenen Container durch den neuen Container ersetzt. Das erklärt auch, warum man alle nicht volatilen Daten (Konfigurationsdateien, Datenbankinhalte, bei Netzcloud die von BenutzerInnen hochgeladenen Dateien etc.) außerhalb des Containers speichert und die Speicherorte beim Start des Containers über Bind-Mounts einbindet.

Wenn man das auf Univention-/AppCenter-Docker-Apps überträgt, so sieht man sofort, dass das ein Problem ist: jegliche Änderung, die du manuell an einem Docker-Container vornimmst, sind mit dem nächsten App-Update wieder verschwunden. Und das Dockerfile für das App-Image hast du auch nicht zur Hand.

Daher meine einfache Grundregel: wenn man am von Univention/dem AppCenter bereitgestellten Docker-Image etwas verändern möchte, dann installiert man die App eben nicht aus dem AppCenter sondern manuell. Man kann ja durchaus die AppCenter-App installieren und sich die Konfiguration daraus abschauen, um nicht alles, was LDAP-Anbindung betrifft, immer neu erfinden zu müssen.

Prinzipiell korrekt, sollte aber ausschließlich für Debugging-Zwecke benutzt werden, und nicht, um den Inhalt eines Docker-Containers zu verändern.

Gruß
mosu

Oder man schaut ob diese Modifikationen auch für den App Maintainer interessant wären und macht einen PR dafür auf (nach Möglichkeit zuerst Interesse nachfragen und dann erst mit dem PR anfangen). Der Quellcode der Nextcloud Univention App gibt es unter: https://github.com/nextcloud/univention-app

edit: wobei das ganze Setup afais derzeit noch nicht über das App Center abgedeckt werden kann, da eine App nachwievor nur aus maximal einem Docker Container bestehen kann.

2 Likes

Hallo Bernd,

vielen Dank für die Erläuterungen zum Erzeugen des Redis Container. Damit sollte ich klarkommen. Mich irritiert aber noch folgende Aussage in der Anleitung von janis91/ocr:
php-redis is used for the communication and has to be a part of your php.”

Auf welches PHP bezieht sich diese Anforderung? Auf das lokale PHP, das in den Redis Container kommt? Jedenfalls hat bei mir weder der Host noch der Nextcloud Container php-redis. Abgesehen davon, dass ich nicht wirklich zurande gekommen bin, php-redis für PHP7 zu erzeugen.

Was meine Frage 5 betrifft, beziehe ich mich auf folgende Aussage von janis91/ocr:
Docker is used for processing files. tesseract-ocr and OCRmyPDF reside in a docker container.”

Wenn ich dann zur Docker-Installationsanleitung von janis91/ocr gehe, https://github.com/janis91/ocr/wiki/Installation-and-Configuration-(Docker-setup), finde ich jedoch nur den Hinweis:
“In order to build the ocr-worker docker image you have to run the following command from within the worker/ directory:
docker build --build-arg LANGUAGES=“tesseract-ocr-deu” -t <your username>/ocr .”

Von diesen Angaben würde ich vermuten, dass ich zunächst tesseract-ocr and OCRmyPDF lokal installieren und daraus einen Docker Container erzeugen muss. Was dafür genau getan werden muss, ist mir leider nicht klar. Vielleicht kann mir jemand nähere Hinweise geben, das wäre sehr nett.

Viele Grüße
Peter

Hallo,

fbartels: Oder man schaut ob diese Modifikationen auch für den App Maintainer interessant wären und macht einen PR dafür auf (nach Möglichkeit zuerst Interesse nachfragen und dann erst mit dem PR anfangen). Der Quellcode der Nextcloud Univention App gibt es unter: https://github.com/nextcloud/univention-app 1

vielen Dank für den Hinweis, den App Maintainer auf Erweiterungen/Verbesserungen aufmerksam zu machen.

Viele Grüße
Peter

Hallo Mosu,

@Moritz_Bunkus: Docker-Images sind darauf ausgelegt, dass man in ihnen nichts verändert, sondern bei neuen Anforderungen das Dockerfile (die Bauanleitung, aus der ein Image erstellt wird) ergänzt, daraus einen neuen Container baut und den vorhandenen Container durch den neuen Container ersetzt. Das erklärt auch, warum man alle nicht volatilen Daten (Konfigurationsdateien, Datenbankinhalte, bei Netzcloud die von BenutzerInnen hochgeladenen Dateien etc.) außerhalb des Containers speichert und die Speicherorte beim Start des Containers über Bind-Mounts einbindet.

Vielen Dank für Deine Erläuterungen zu Docker Containern/Images. War sehr hilfreich!

Hallo Peter,

richtig, ich vergaß… tatsächlich läuft dieses Module auf meinem Debian Nextcloud. Sagt: php -m - Wahrscheinlich habe ich das nachinstalliert…

Also würde ich versuchen - die Hinweise oben beachtend - das im Nextcloud Container zu installieren. und eben nach jedem Update auch…

Meine Gedächtnis scheint etwas unsicher bei der Geschichte, aber ich denke es waren ansonsten nur die beiden Docker Images und eben - php-redis :slight_smile:
Ich finde auf dem System auch verwaiste worker-Verzeichnisse, ich denke, die kommen auch aus der Anleitung, ohne das je mehr als das Verzeichnis existierte… Aber wie gesagt, mein Gedächtnis…

Grüße,
Bernd

Hallo Bernd,

wenn ich alle Hinweise richtig verstehe, müsste ich sämtliche Schritte aus https://github.com/janis91/ocr innerhalb des Nextcloud Docker Containers ausführen und diese jedesmal wiederholen, wenn ein Update des Nextcloud Docker Containers bereit steht. Nachdem ich aber nach dieser Idee einen Redis- und einen Tesseract-Container innerhalb des Nextcloud-Containers erzeugen müsste, halte ich diesen Ansatz für mehr als fraglich.

Ich habe es testweise sogar versucht, aber ich scheitere bereits beim ersten Schritt: Obowhl ich die Pakete php-redis und redis-server innerhalb des Nextcloud Docker Containers installiert habe, kann ich die Nextcloud App “Optical character recognition” nicht korrekt installieren. Es wird berichtet, dass redis nicht verfügbar ist.

Ich habe daher die App-Maintainer auf Github angeschrieben, was diese von einer Unterstützung von Elasticsearch und OCR halten.

Ich habe daher aktuell keinen Weg, um ausgehend vom Nextcloud Docker Container Elasticsearch und OCR zum Laufen zu bekommen.

Viele Grüße
Peter