Paperless-NGX auf QNAP NAS

Tutorials
Logo von Paperless-NGX

Aufmerksame Leser meines Blogs wissen, dass ich für meine Dokumentenverwaltung Paperless-NGX als DMS einsetze.

Bisher lief meine Instanz auf einem kleinen Hetzner Cloud Server (natürlich nur via VPN erreichbar), aus dem einfachen Grund, dass ich weder Zeit noch große Lust hatte, mich mit der Container Station meines QNAP NAS genauer zu beschäftigen. Vergangenes Wochenende habe ich es dann doch geschafft und möchte meine Lösung mit meinen Lesern teilen.

Natürlich muss die Container Station bereits auf dem QNAP NAS installiert sein, darauf möchte ich in diesem Beitrag nicht eingehen. Nachdem ihr die Container Station installiert und konfiguriert habt, beginnen wir mit dem Anlegen der notwendigen Ordner. Insgesamt müssen wir sechs Ordner anlegen, die später dem Container zur Verfügung gestellt werden.

Ich nenne hier den Zweck und einen Beispielnamen für die Ordner – bitte passt diese an eure Gegebenheiten an:

  • Redis-Datenbank: redis
  • PostgreSQL-Datenbank: db
  • Paperless-Data-Ordner: data
  • Paperless-Media-Ordner: media
  • Paperless-Export-Ordner: export
  • Paperless-Consume-Ordner: import

Diese Ordner können auf jeder Freigabe des NAS erstellt werden. Ich persönlich verwende zwei RAID-Arrays: eines auf Festplatten und eines auf NVME-SSDs. Die Ordner ‚redis‘, ‚db‘, ‚data‘ und ‚media‘ habe ich auf den NVME-SSDs platziert, die restlichen auf den Festplatten. Natürlich können die Ordner aber auch völlig anders benannt werden oder auch an völlig unterschiedlichen Pfaden auf dem NAS liegen.

Für die Einfachheit dieses Beitrags nehmen wir an, dass alle Ordner im selben Unterverzeichnis erstellt wurden, nämlich /share/CACHEDEV1_DATA/Container/paperless-ngx.

Nachdem das nun erledigt ist, wechseln wir in die Container Station und dort in den Menüpunkt Anwendungen. Hier klicken wir oben rechts auf Erstellen – uns begrüßt ein Fenster, in das wir eine YAML-Datei zur Konfiguration der Anwendung importieren können.

Das hier ist die von mir genutzte YAML-Datei:

version: '3.6'

networks:
  paperless-net:
    external: false

services:
  broker:
    container_name: paperless-redis
    image: docker.io/library/redis:7
    networks:
      - paperless-net
    volumes:
      - /share/CACHEDEV1_DATA/Container/paperless-ngx/redis:/redis
    restart: unless-stopped

  db:
    container_name: paperless-db
    image: docker.io/library/postgres:15
    networks:
      - paperless-net
    restart: unless-stopped
    volumes:
      - /share/CACHEDEV1_DATA/Container/paperless-ngx/db:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: $RANDOMPASSWORD$
  
  webserver:
    container_name: paperless
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    networks:
      - paperless-net
    restart: unless-stopped
    depends_on:
      - db
      - broker
    ports:
      - 8000:8000
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - /share/CACHEDEV1_DATA/Container/paperless-ngx/data:/usr/src/paperless/data
      - /share/CACHEDEV1_DATA/Container/paperless-ngx/media:/usr/src/paperless/media
      - /share/CACHEDEV1_DATA/Container/paperless-ngx/Export:/usr/src/paperless/export
      - /share/CACHEDEV1_DATA/Container/paperless-ngx/Import:/usr/src/paperless/consume
    environment:
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBHOST: db
      PAPERLESS_DBPASS: $RANDOMPASSWORD$
      USERMAP_UID: 1000
      USERMAP_GID: 100
      PAPERLESS_OCR_LANGUAGES: deu eng
      PAPERLESS_TIME_ZONE: Europe/Berlin
      PAPERLESS_OCR_LANGUAGE: deu
      PAPERLESS_FILENAME_FORMAT: "{correspondent}/{created} {title}"
      PAPERLESS_TIKA_ENABLED: 1
      PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
      PAPERLESS_TIKA_ENDPOINT: http://tika:9998
 
  gotenberg:
    container_name: paperless-gotenberg
    image: docker.io/gotenberg/gotenberg:7.8
    restart: unless-stopped
    environment:
      CHROMIUM_DISABLE_ROUTES: 1
    networks:
      - paperless-net

  tika:
    container_name: paperless-tika
    image: ghcr.io/paperless-ngx/tika:latest
    restart: unless-stopped
    networks:
      - paperless-net

Einige Zeilen bedürfen eurer Aufmerksamkeit – ich habe die relevanten Zeilen farbig markiert.

Die Pfadangaben ersetzt ihr bitte vor dem Doppelpunkt mit den Pfaden aus eurer Umgebung. Das Passwort für die PostgreSQL-Datenbank setzt ihr bitte zufällig auf ein starkes Passwort, nehmt aber in allen Zeilen das gleiche Passwort, damit die Dienste miteinander kommunizieren können.

Wir können den YAML-Code mit einem Klick auf „Validieren“ validieren und vergeben dann einen Anwendungsnamen (frei wählbar, beispielsweise paperless-ngx) – nun klicken wir auf Erstellen und lassen die Container Station ihre Arbeit erledigen. Nach kurzer Zeit sollten wir unsere neue Paperless-NGX-Instanz unter http://IP-DES-NAS:8000 erreichen – nur einloggen wird noch schwierig werden.

Zurück zur Container Station und dort in den Tab Container. Hier klicken wir auf das Zahnrad des Containers mit dem Namen paperless und wählen den Punkt Ausführen. Im sich nun öffnenden Fenster wählen wir /bin/bash und klicken wieder auf Ausführen.

Es öffnet sich die Konsole des Containers in der wir dann den Befehl zum Anlegen eines neuen Superusers eingeben: python3 manage.py createsuperuser

Wir folgen den Abfragen und schließen das Fenster wieder. Mit dem gerade angelegten Benutzer können wir uns nun an unserer Paperless-NGX-Instanz anmelden.

Das war’s! Wir haben eine lauffähige Paperless-NGX-Instanz auf unserem QNAP NAS erstellt und können mit der Nutzung des Open Source DMS beginnen!

Wenn ihr Fragen oder Anmerkungen habt: ab in die Kommentare!

Viel Spaß und Erfolg!

14 Gedanken zu „Paperless-NGX auf QNAP NAS“

  1. Hallo Dominic,

    vielen Dank für diese Anleitung. Hatte auf Anhieb Erfolg damit, jedoch erhalte ich eine Fehlermeldung nachdem ich einen PDF in den Import Ordner hinzufüge. Und zwar

    [ERROR] [paperless.consumer] The following error occurred while storing document 02122023_002.pdf after parsing: [Errno 2] No such file or directory: ‚/usr/src/paperless/consume/02122023_002.pdf‘

    Ich bin mir nicht sicher womit das zu tun hat oder wie man das korrigiert, wäre über einen Hinweis dankbar!

    Gruß, Viktor

    Antworten
    • Hallo Viktor,

      ich vermute, dass hier deine Pfade nicht stimmen bzw. die Ordner nicht existieren. Bitte kontrolliere nochmal akribisch, ob du alle Ordner auf dem QNAP angelegt hast und ob die Pfade stimmen.

      Grüße und viel Erfolg,
      Dominic

      Antworten
  2. Hallo Dominic
    bin gerade dabei deine Artikel durchzulesen , grossartig bin absoluter Anfänger der ein DMS sucht 🙂 Könnte das Problem von Victor sein ( ich versuche immer noch zu verstehen was ich für Ordner erstellen muss ) der Beschreib der Ordner /// Paperless-Consume-Ordner: import ///
    im Script /CACHEDEV1_DATA/Container/paperless-ngx/Import:/usr/src/paperless/consume heisst ?? Peperless würde mich interessieren muss aber zuerst Docker verstehen 🙂
    Gruss und Respekt
    Roger

    Antworten
  3. Hallo,

    Danke für deine Anleitung. Konnte alles soweit reproduzieren und den YAML validieren. Leider kann der Container bei mir nicht erstellt werden. Folgende Fehlermeldung erhalte ich: „Failed to create application „paperless“. Error message: operateApp action [–project-name paperless up -d –remove-orphans] failed: exit status 18: webserver Pulling no matching manifest for linux/arm/v7 in the manifest list entries“

    Irgendwie sieht es für mich so aus, als ob es für meine NAS (mit ARM rozessor) keinen passenden Container gibt.

    Hat jemand für mich eine Lösung?

    Viele Grüße
    Ulf

    Antworten
  4. Bei mir hat die von Dominic Pratt nicht funktioniert. Die Container Station hat den Fehler „Make sure you configure all the necessary settings first.“ angezeigt. Daher habe ich eine neue erstellt die bei mir funktioniert hat.

    Firmware: QTS 5.1.3.2578
    Container Station: Version 3.0.5.623

    version: ‚3.8‘

    services:
    db:
    image: postgres:13
    environment:
    POSTGRES_DB: paperless
    POSTGRES_USER: paperless
    POSTGRES_PASSWORD: $PASSWORD$
    volumes:
    – /share/CACHEDEV1_DATA/Container/paperless-ngx/db:/var/lib/postgresql/data
    restart: unless-stopped

    redis:
    image: redis:alpine
    volumes:
    – /share/CACHEDEV1_DATA/Container/paperless-ngx/redis:/data
    restart: unless-stopped

    gotenberg:
    image: gotenberg/gotenberg:7
    restart: unless-stopped

    tika:
    image: apache/tika:1.24
    restart: unless-stopped

    paperless:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    depends_on:
    – db
    – redis
    – tika
    – gotenberg
    ports:
    – „8000:8000“
    volumes:
    – /share/CACHEDEV1_DATA/Container/paperless-ngx/data:/usr/src/paperless/data
    – /share/CACHEDEV1_DATA/Container/paperless-ngx/media:/usr/src/paperless/media
    – /share/CACHEDEV1_DATA/Container/paperless-ngx/export:/usr/src/paperless/export
    – /share/CACHEDEV1_DATA/Container/paperless-ngx/consume:/usr/src/paperless/consume
    environment:
    PAPERLESS_REDIS: redis://redis:6379
    PAPERLESS_DBHOST: db
    PAPERLESS_DBPORT: 5432
    PAPERLESS_DBNAME: paperless
    PAPERLESS_DBUSER: paperless
    PAPERLESS_DBPASS: $PASSWORD$
    PAPERLESS_TIKA_ENABLED: „true“
    PAPERLESS_TIKA_ENDPOINT: „http://tika:9998“
    PAPERLESS_GOTENBERG_ENDPOINT: „http://gotenberg:3000“
    PAPERLESS_OCR_LANGUAGE: „deu“
    restart: unless-stopped

    Antworten
  5. Hallo Dominic und besten Dank für die Anleitung, hat alles bestens funktioniert. Eine kleine Anmerkung: Im Text oberhalb des Codeblocks hast Du „Paperless-Export-Ordner: export“ geschrieben, in Codeblock ist „/share/CACHEDEV1_DATA/Container/paperless-ngx/Export“ (großes „E“ bei „Export“), das verwirrt ggf.
    Ich habe zwei Fragen dazu, vielleicht kannst Du mir helfen:
    Ich habe bereits eine paperless-ngx Instanz als Docker-Container auf einer Ubuntu-VM auf meinem Qnap NAS laufen. Wie bekomme ich Daten und Einstellungen von da zu meiner neuen Instanz, die direkt in der Container Station läuft? Den Inhalt der erwähnten Ordner einfach kopieren?
    Und wie aktualisiere ich die Software? Bisher habe ich in meiner VM
    docker compose down && docker compose pull && docker compose up -d
    gemacht.

    Antworten
    • Ich antworte mir mal selber, da ich nach einigen Fehlversuchen anscheinend jetzt ein laufendes System nach meinen Wünschen habe.
      – Die Pfadangaben haben bei mir immer zu Schwierigkeiten geführt, daher habe ich z.B.
      /share/CACHEDEV1_DATA/Container/paperless-ngx/media
      durch
      /share/Container/paperless-ngx/media
      ersetzt (also einfach das „CACHEDEV1_DATA“ weggelassen). Das lief dann.
      – Zudem habe ich Portainer installiert, damit kann ich recht einfach ein neues Image ziehen und somit ein Update machen.
      – Datenmigration war auch etwas holprig. Vom Container auf meiner VM habe ich die Daten via (z.B.)
      docker cp paperless-db-1:/var/lib/postgresql/data /home/[vm-user]/paperless-ngx-backup/db
      kopiert und dann in das /share/Container/paperless-ngx Verzeichinis verschoben.
      Besten Dank für die Anleitung!

      Antworten
  6. Vielen Dank für die Anleitung. Bevor ich es umsetze, noch eine Verstädnisfrage. Ich habe bereits eine komplette Instanz von Paperless-ngx laufen auf einem Raspberry Pi direkt am Scanner und möchte die NAS Instanz als Backup nutzen. Hierzu habe ich einen sauberen Daily Export auf der Raspi Instanz erzeugt (der auch testweise in eine leere Instanz importiert werden kann).

    Export mit:
    docker compose exec webserver document_exporter ../export -d

    Nach Übertragung der Daten in den Export-Ordner der Zielinstanz geth es dann an den Import gemäß Doko:
    docker compose exec webserver document_importer ../export

    Funktioniert auf einem zweiten Raspi einwandfrei.

    Wie würde ich das auf der QNAP machen? Habe ich die Möglichkeit, auf shell Ebene diese Kommandos z.B. in cronjobs zu legen?

    Vielen Dank für eine Anregung bzw. Erfahrung.

    Antworten
  7. Hallo, zuerst mal vielen Dank dem Programmierer. Ich bin absoluter Anfänger und ich konnte dem hier gut folgen bis zum anlegen des User … Stand jetzt habe ich eine Login Maske von Paperless jedoch keinen User oder Passwort da beim Anlegen des Poweruser eine Fehlermeldung kam. Hat mir jemand bitte einen Tipp? Danke und schönes Wochenende.

    Antworten
  8. Guten Tag,

    bei mir läuft die paperless im Testmodus sehr gut.
    Jetzt möchte ich jedoch kleinere Anpassungen in der Config
    durchführen. Ich finde jedoch die docker compose .env nicht.

    Wo finde ich diese?

    Antworten

Schreibe einen Kommentar