OCR Setup für Nextcloud

5 min Lesezeit

Originally posted 2018-05-04 11:22:40.

Letztes Update: 17.8.18

In diesem kleinen Tutorial möchte ich Euch erklären wie ihr Optical Character Recoginition, kurz OCR, mit Hilfe von Docker Containern für Nextcloud einrichtet.
Dazu müssen zu erst ein paar Abhängigkeiten installiert werden.

Was braucht ihr?

  1. Nextcloud 12 oder 13
  2. Linux Betriebsystem basierend auf Ubuntu 14.04 oder älter mit AMD, Intel Prozessoren. ARM Prozessoren werden nicht unterstützt (Wie Raspberry Pi oder ODROID C2)
  3. Docker (Hiermit wird Tesseract und OCRmyPDF im Container ausgeführt.
  4. Terreract-OCR und OCRmyPDF

Gut, zuerst installieren wir alles nötige. Dies geht mit

sudo apt-get install docker php-redis

Nun muss in Nextcloud die OCR App installiert werden, anscheißend wechseln wir in das Verzeichnis der OCR Nextcloud App und in das Verzeichnis worker.

cd /var/www/nextcloud/app/ocr/worker

Mit vi Dockerfile passen wir unten stehenden Code an und ersetzen „OCR“ mit unserem Passwort.Denkt daran, dass Ihr ein sehr Sichereres nehmt. Meines hat beispielsweise 25 Stellen

# This image serves the redis instance for the ocr worker and the nextcloud ocr app.
# important steps:
# docker build --build-arg PASSWORD="<your custom very safe password>" -t <your username>/redis .
# docker run --name redis --network=isolated_ocr -p 6379:6379 -d <your username>/redis
# Please notice: 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.

FROM redis

LABEL maintainer=“janiskoehr@icloud.com“ description=“This image serves the redis instance for the ocr worker and the nextcloud ocr app.“ vendor=“Janis Koehr“
ARG PASSWORD=“secret“

COPY redis.conf /usr/local/etc/redis/redis.conf

RUN if [ -n „$PASSWORD“ ]; then echo „requirepass $PASSWORD“ >> /usr/local/etc/redis/redis.conf; fi

CMD [ „redis-server“, „/usr/local/etc/redis/redis.conf“ ]

[…]

Das gleiche ändern wir in dem File redis.conf im gleichen Verzeichnis. Sucht hier nach requirepass. Dieses auskommentieren und Eurer Passwort dahinter setzen. Zeile 397

# requirepass foobared
requirepass secret

Mit dem folgenden Kommando kommen wir zum nächsten Teil der Anleitung.
Nun wird der eigentliche Redis Container erstellt und mit einem Passwort versehen. Das Gleiche wir vorhin auch. Ersetzt bitte auch „user“ mit eurem Namen in der Cloud. (Es wird nur Kleingeschriebenes akzeptiert von Docker). Dies geschieht ebenfalls im Worker Verzeichnis.

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

Für den nächsten Schritt müssen wir in das ocr Verzeichnis wechseln. Dies geht am besten mit

cd ../worker

Hier editieren wir die Dockerfile Datei

# This image serves the redis instance for the ocr worker and the nextcloud ocr app.
# important steps:
# docker build --build-arg PASSWORD="" -t /redis .
# docker run --name redis --network=isolated_ocr -p 6379:6379 -d /redis
# Please notice: 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.
 

FROM redis

LABEL maintainer="janiskoehr@icloud.com" description="This image serves the redis instance for the ocr worker and the nextcloud ocr app." vendor="Janis Koehr"
ARG PASSWORD="secret"

COPY redis.conf /usr/local/etc/redis/redis.conf

RUN if [ -n "$PASSWORD" ]; then echo "requirepass $PASSWORD" >> /usr/local/etc/redis/redis.conf; fi

CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
docker build --build-arg LANGUAGES="tesseract-ocr-deu" -t user/ocr .

und starten anschließend die Docker Container. Zuerst aber die Zeilen wiederum anpassen, User ersetzen und das Passwort einfügen.

Update:

Seit einiger Zeit muss man ein file anpassen damit es zu keinem Fehler kommt.

Man wechselt in das Verzeichnis /var/www/nextcloud/apps/ocr/worker/src/configuration/und editiert die worker.configuration.ts Datei.

Den Inhalt der Datei durch diesen hier ersetzen:

https://github.com/chriseqipe/ocr/blob/59fe2b28a8b5cc3f52dcd12589f5b11b857a85b0/worker/src/configuration/worker.configuration.ts

Danach läuft das Script richtig durch.

Bitte denkt daran daß das Verzeichnis /var/www/nextcloud/tmp vor dem Containerstart vorhanden sein muss!

docker run  --restart always --name redis --network=ocr -p 6379:6379 -d user/redis
docker run --restart always --name ocr --network=ocr -e "NODE_ENV=production" -e "REDIS_HOST=redis" -e "REDIS_PORT=6379" -e "REDIS_DB=0" -e "REDIS_PASSWORD=secret" -v /var/www/nextcloud/data/user:/home/node/data:ro -v /var/www/nextcloud/tmp:/home/node/output -d user/ocr

Abschließend sollte man mit docker ps kontrollieren ob die Container auch laufen.
Wenn dies alles funktioniert hat, wechseln wir wieder in unsere Nextcloud und geben alle Parameter ein.

In meinem Fall habe ich einen anderen Port gewählt, weil der Port 6379 bereits belegt ist, für das eigentliche Caching von Nextcloud und WordPress.

Das Setup wäre erledigt und Ihr könnt mit dem Bearbeiten der Dateien anfangen. Mehr Infos zu dem Projekt gibt es auf Github

Aktuell habe ich aber ein Fehler im „System“ wie hier nachzulesen ist. Es ist so das angeblich die Dateien im OCR Container nicht gefunden werden können, obwohl diese vorhanden sind.

The execution of ‚ocrmypdf‘ command failed: ERROR – File not found – /home/node/data/lars/files/Clatronic_user_manual_MWG_775_H.pdf

An was das nun liegt, keine Ahnung. Aber ich hoffe der Developer Janis findet eine Lösung. 🙂

Wennn euch die Anleitung gefallen hat, lasst einen Kommentar da. Ich würde mich über ein wenig Feedback freuen 🙂

24 Kommentare

  1. Hallo,
    Redis läuft auch auf passenden Port verschoben, da in der Nextcloud Onlyoffice diesen bereits belegt.
    ich kann mich auf den Kopf stellen, habe alle Varianten durch und bekomme immer nur den Abbruch beim OCR – Dockerfile erstellen , mit folgender Meldung:
    node-ocr-worker@0.0.0 build /home/node/worker

    rm -rf dist/ && tsc -p tsconfig.app.json

    src/configuration/worker.configuration.ts(7,28): error TS2322: Type ‚{ db: string | number; host: string; keyPrefix: string; password: string; port: string | number; …‘ is not assignable to type ‚RedisOptions‘.
    Types of property ‚port‘ are incompatible.
    Type ’string | number‘ is not assignable to type ’number‘.
    Type ’string‘ is not assignable to type ’number‘.
    npm ERR! code ELIFECYCLE
    npm ERR! errno 2
    npm ERR! node-ocr-worker@0.0.0 build: rm -rf dist/ && tsc -p tsconfig.app.json
    npm ERR! Exit status 2
    npm ERR!
    npm ERR! Failed at the node-ocr-worker@0.0.0 build script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

    npm ERR! A complete log of this run can be found in:
    npm ERR! /root/.npm/_logs/2018-06-22T18_26_01_769Z-debug.log
    The command ‚/bin/sh -c npm run build && rm -r src/ package.json tsconfig.app.json tsconfig.json‘ returned a non-zero code: 2
    root@runcracker:/var/www/html/nextcloud/apps/ocr/worker#

    Viele liebe Grüße
    Werner

      1. Hallo ,
        das erste Problem habe ich lokalisieren und beheben können.
        Wenn man derzeit die App aktiviert kommt derzeit scheinbar eine in der Sytax fehlerbehaftete für das Erstellen des Dockers relevante Datei mit. Hausgemachter Fehler:
        Installationspfad der Apps-> ocr/worker/src/configuration/worker.configuration.ts
        Dort sind zwei Zeilen schlichtweg falsch:
        Erster Fehler: db: process.env.REDIS_DB || 0,
        Ersetzt durch: db: parseInt(process.env.REDIS_DB) || 0,
        Zweiter Fehler: port: process.env.REDIS_PORT || 6379,
        Ersetzt durch: port: parseInt(process.env.REDIS_PORT) || 6378,
        Wobei ich wegen Kollisionsgefahr den Port umstellen musste, da OnlyOffice selbigen schon belegt.

        Nun laufe ich aber genau in selbige Meldung wie Du:
        The execution of ‚ocrmypdf‘ command failed: ERROR – File not found – /home/node/data/Nextdriveadmin/files/0912 0038 1330 Jahresabrechnung16.pdf

        Es ist so, als wenn das aufgebaute System den /home/node/ als totalitären Pfad behandeln möchte…..
        Da könnte ich nun wirklich Hilfe benötigen.
        So viele graue Haare wie ich bei der Installation von Nextcloud und Onlyoffice inclusieve geteilter SSL und einer DDNS – Domain von einer VM ausgehend bekommen habe , scheint nur noch dieses Tool zu toppen!
        Aber aus Gründen des DSGVO muss ich von Google Drive weg, brauche aber ähnlichen Funktionsumfang …….
        Hoffe , das kostet keine 10 Jahre Lebenserwartung… 😉

  2. Weißt du wo du die Container ID findest? Steht ganz links in der shell nach Eingabe von

    docker ps

    dann folgendes eingeben

    docker exec – it CONTAINERID /bin/bash

    Dann bist du im Container

  3. Danke vorab für die Einladung.

    Nach langen gedrehe haben wir den Zugang zum Container erhalten , allerdings hat zu dem Ordener nur User www-data oder ä. Zugang.
    Es ist also schwer zu sehen , was darin abgeht oid er ob es meinen Nutzernamen dort als Ordner hinterlegt gibt.
    Der Temp Ordner existiert (output) und ist auch frei verfügbar / zugänglich.
    Bei der Gelegenheit ist mir heute , weil ich zwischendurch neustarten musste aufgefallen, entschuldige den Ausdruck, der ganze „Containermist“ und Einstellungen ausser der ipv6 Einstellung die mir die wiederholte Einrichtung verhindert, nicht mal bootfest ist!
    Die Verzeichnisse mit den Dockerimages sind danach auf nimmer Wiedersehen weg.
    Somit blieb mir nur das zurückgehen auf Snapshot x vor dem Einrichten 😎 .
    Dieses sollte nicht so sein oder? Oder welche Philosophie hat sowas fragieles im System?
    Meine Basis:
    Ubuntu Server 18.4 mit nachinstallierter GUI , weil ich kein Text- fetisch bin und PHP 7.2 sind meine Systembasis. NGNIX Maria DB und Apache2 werkeln in latest Version.
    Es funktionieren tadellos in der VM ein Documentenserver für OnlyOffice, Nextcloud , und SSL – Zertifizierungs Bot.
    Mir missfällt langsam diese Struktur mit den Docker und verwirrenden Zugriffsrechten sowie Fehlerquellen aus der Installation.
    Ich stelle mir bereits die Frage, ob eine ordentliche Ubuntu VM nur mit dem OCR nicht sinnvoller und besser zugänglich wäre.
    Und eine Freigabe auf IP: 192.xxx.xxx.xxx:6378 nicht der sauberere Cut zwischen den Systemen als das Local mit unzugänglich zu konfigurieren und nur temporär vorhandenen Dockern zu lösen.
    Zumal ich keine Nextcloud benötige , derer Einstellungen und Modulare Docker Systemausfälle nicht überlebt…..
    Das scheint mir schlichtweg die falsche Richtung

  4. Sollte natürlich nicht so sein das die Docker Images nicht Bootfest sind. Ich habe bei allen Containern ein –restart= always angehangen. Und habe X reboots gemacht und alles läuft. Nur muss man die Konfigurationen aus dem Container auslagern als Volume. Ich selber kenne mich nicht wirklich gut aus mit VM’s setze selber keine ein. Wie sich das mit Containern in VM verhält, wie gesagt keine Ahnung. Die Zugriffsrechte im Container sind anders wie auf dem Hostsystem.

    1. In Anlehnung Deiner Anleitung hatte ich diesen Befehl auch übernommen.
      Auswirkung der Container kann selbst als root nicht gestoppt werden, allerdings wenn man bootet ist alles weg.
      Ob das alles mit Ubuntu 18.4 zusammenhängt?
      Fakt ist die VM verhält sich wie eine Lokale Installatio, nur mit dem Vorzug von Snapshots und schnellen Wechsel des Wirts. Auch experimentelle Installationen kann man gefahrlos testen….

      1. Also der Container kann immer mit docker und rm -f Containerid entfernt werden, oder mit docker stop Containerid gestoppt werden. Wenn die so genannten Volumes gesetzt sind müssten die Einstellungen, falls diese in den volumes liegen wieder vorhanden sein.

      2. Noch ein Nachtrag.

        -v /var/www/nextcloud/data:/home/node/data:ro -v /var/www/tmp:/home/node/output

        So sieht das bei mir aus mit dem Redis Container. Wobei /var/www/nextcloud und /var/www/tmp außerhalb des Containers liegen. Einmal das Datenverzeichnis von Nextcloud und einmal ein tmp Verzeichnis welches man seperat erstellen muss.

  5. Beides war erledigt.
    in beiden Formen.
    Hatte dem System dann das /tmp/nextcloud-temp angelegt, da dann definitiv keine ggf. fehlenden Rechte blockierend wirken können.
    Im tmp verzeichnis kann von hause aus jeder schreiben.

      1. nein… aber ich habe beides wie Du beschrieben hast bereits probiert!
        Die Docker habe ich bootfest machen können.
        Der Fehler ist geblieben und scheinbar bin ich in bester Gesellschaft.

  6. Hallo,
    vielen Dank für die detaillierte Anleitung, um Tesseract und OCRmyPDF im Container auszuführen.

    Diese kann ich bis auf zwei Punkte gut nachvollziehen:

    Wo finde ich das passende php-redis für meine Debian Jessie Distribution? Auf meinem System wird php-redis nicht gefunden.
    Wann und wo findet die Installation von Terreract-OCR und OCRmyPDF statt? Ganz oben in der Anleitung wird darauf verwiesen. Dann kommt es zu einem docker build im worker Verzeichnis der Nextcloud App „OCR“, aber es findet kein „apt-get install tesseract-ocr“ oder ähnliches davor statt.

    Vielen Dank für weitere Hinweise!
    Peter

    1. Hallo,

      Wenn du in die Konsole apt-get install php-redis eingibst wird Linux die richtige Version finden im Repository.
      Die Tesseract und ocrmypdf Installation findet mit dem erstellen der beiden Docker Images statt im ocr und worker Verzeichnis.

  7. Hallo,

    bei meiner Installation läuft Nextcloud in einem Docker Container, der regelmäßig aktualisiert wird, sodass deshalb innerhalb des Nextcloud Docker Containers keine oder möglichst wenige Änderungen gemacht werden sollten, da ich diese nach einer Aktualisierung des Nextcloud Docker Containers immer wieder manuell nachziehen müsste.

    Leider bin ich in der Docker-Thematik noch sehr an der Oberfläche, um die Anleitung, die nach meinem Verständns davon ausgeht, dass Nextcloud direkt am Server läuft, darauf zu adaptieren, dass auch Nextcloud in einem separaten Docker Container läuft. Zwar könnte ich mich direkt in den Nextcloud Docker Container hineinbegeben und darin die erforderlichen Pakete installieren, aber dann würde das nach meinem Verständnis wieder verloren gehen, wenn ich ein Update des Nextcloud Containers vornehme.

    Kann mir jemand Hinweise geben, wie unter diesen Umständen OCR idealerweise aufzusetzen wäre und welche Auswirkungen das auf die obige Anleitung hat?

    Vielen Dank
    Peter

    1. Hallo,

      Die Anleitung ist für den Fall geschrieben das Nextcloud direkt auf dem System läuft und OCR im Docker Container.

      OCR kann in einem separaten Container laufen, auch wenn Nextcloud in einem läuft, nur müssen beide Images im gleichen virtuellen Netzwerk laufen.

      1. Vielen Dank für den Hinweis. Dann nehme ich an, dass ich sämtliche Schritte der Anleitung, einschließlich des docker build für OCR, innerhalb des Docker Containers von Nextcloud durchführen muss. Schließlich findet sich das worker Verzeichnis nur innerhalb des Nextcloud Docker Containters. Oder habe ich das falsch verstanden?

        1. Sorry hab nochmal geschaut. Lange nicht mehr damit beschäftigt. Die beiden erstellten Container sind in einem eigenen Netzwerk. Verbunden wird Nextcloud über den Redis Port samt Redis-Passwort. Da ist es egal ob Nextcloud im Container läuft, oder lokal.

          1. Das ocr und worker Verzeichnis befindet sich im Nextcloud Container, wenn ich die Nextcloud OCR App installiere. Insofern muss ich wohl die beiden Container aus dem Nextcloud Container heraus erzeugen?

Schreibe einen Kommentar

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

* Die Checkbox für die Zustimmung zur Speicherung ist nach DSGVO zwingend.

Ich akzeptiere

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.