Paperless-ngx im LXC Container installieren

Moin!

Vielleicht hat schon mal jemand von euch etwas von Paperless bzw. Paperless-ng oder Paperless-ngx gehört.
Paperless-ngx ist ein Tool, um sein Büro und die damit verbundene Papierwirtschaft zu digitalisieren. Es ist möglich, Dokumente mit OCR zu scannen und anschließend mit Tags zu versehen.

Des Weiteren können Korrespondenten erstellt werden, denen Schlagwörter zugeordnet werden. So kann Paperless-ngx automatisch neue Dokumente ordnen.
Ein weiteres Feature ist, dass Paperless ein sogenanntes consume Verzeichnis hat. So kann z.B. mit einem Scanner ein Dokument eingescannt werden und per FTP oder SMB/CIFS automatisiert in dem consume Verzeichnis abgelegt werden. Das Besondere an dieser Installation gegenüber vieler anderen ist, dass ich keine Volumen nutze. Wir mounten die benötigten Ordner direkt auf den Docker Host. Dies vereinfacht das Backup der Daten aus dem Host heraus enorm.

Weiter unten findet ihr noch zusätzliche Einstellungen, die optional sind und nicht für den fehlerfreien Betrieb von paperless nötig sind. Solltet ihr Paperless bereits installiert haben und lediglich die zusätzlichen Einstellungen übernehmen wollen, gleicht bitte eure Installation mit meiner ab, um potenzielle Fehler oder Inkompatibilitäten zu vermeiden. Generell werde ich nur Lesern helfen können, die die Installation nach meinem Beitrag getätigt haben. Der Zeitaufwand dafür ist einfach zu hoch, um dies kostenfrei anbieten zu können.

Nach der erfolgreichen Installation widmen wir uns der Frage, wie Paperless bei dem Erscheinen einer neuen Version aktualisiert werden kann. Dies gestaltet sich sehr einfach und ist schnell erledigt, wenn man etwas Routine hat, welche aber zügig kommt.

Noch weiter unten findet ihr hingegen Einstellungen, die bei der Beseitigung von Problemen helfen können, aber nicht generell, für alle Anwender gesetzt werden müssen. Diese sollten auch nur gesetzt werden, wenn ihr das entsprechende Problem auf eurem System vorfindet.

WICHTIG: Ich werde hier nur freiwilligen Support leisten, WENN Docker und Docker compose nach meiner Anleitung installiert wurden, dies sorgt dafür, dass einige Fehler gar nicht erst entstehen. Zudem erleichtert es enorm die Arbeit, da ich keine falschen oder mangelhaften Installationen korrigieren muss. Zusätzlich supporte ich nur aktuelle Version einer Docker Installationen, um potenzielle Fehler auszuschließen.

Wir benötigen dazu Folgendes:

  1. LXC Container mit Docker, Docker-compose und Portainer
  2. 8 GB Speicherplatz im LXC
  3. Zweite Disk mit 10 GB Speicherkapazität
  4. Scanner mit SMB/CIFS

Für die Installation verwenden wir 2 Disks im LXC Container. Das hat den Vorteil, dass das die Daten und ein potenzielles Backup schnell getrennt und erneut eingespielt werden können. Dazu ruft Ihr im Proxmox Web UI einfach den Container auf und wählt oben links „Hinzufügen“ aus. Nun könnt ihr eine zweite virtuelle Harddisk hinzufügen. Diese müsst ihr unter „/data“ mounten.

Wir verbinden uns per SSH auf den LXC Container und stoßen ein Update & Upgrade an.
Danach installieren wir Samba, welches wir für die Netzwerkfreigabe benötigen.

sudo apt update && sudo apt upgrade -y && sudo apt install samba -y

Damit später auch Umlaute korrekt auf der Kommandozeile angezeigt werden, prüfen wir die „locales“ Einstellungen unseres Hosts. Wer den LXC Container nach meiner Anleitung konfiguriert hat, kann diesen Schritt getrost überspringen. Dazu feuern wir die folgende Befehle ab und setzen so die korrekte „locales“ Einstelleung für den deutschen Sprachraum.

echo "de_DE.UTF-8 UTF-8" > /etc/locale.gen
dpkg-reconfigure --frontend=noninteractive locales
echo -e "LANG=de_DE.UTF-8\nLANGUAGE=\"de_DE:de\"" >> /etc/default/locale

Um nun die neue „locale“ Einstellung nutzen zu können müssen wir entweder einen Neustart des LXCs vornehmen oder den aktuellen User einfach ausloggen und erneut einloggen. Ich habe mich in diesem Beitrag für das letztere entschieden.

logout

Anschließend erstellen wir einige Verzeichnisse, welche für die Installation benötigt werden. Der Ordner „consume“ wird im weiter laufenden Beitrag per SMB im Netzwerk verteilt.

cd /
sudo mkdir data
sudo mkdir data/paperless
sudo mkdir data/paperless/consume
sudo mkdir data/paperless/data
sudo mkdir data/paperless/export
sudo mkdir data/paperless/media
sudo mkdir data/paperless/redis
sudo mkdir data/paperless/postgresql

Wir legen einen Nutzer für die Samba-Freigabe an, diesen Nutzer verwenden wir auch später für Paperless. Den erstellten User fügen wir der Docker Gruppe hinzu, damit dieser Container verwalten kann. Anschließend erstellen wir ein SMB Passwort, damit der User in der Lage ist sich gegen den SMB Service zu authentifizieren.

sudo adduser paperless
sudo usermod -aG docker paperless
sudo smbpasswd -a paperless

Ist dies geschafft, legen wir ein Backup der smb.conf an. Danach passen wir unsere „smb.conf“ an. Dazu editieren wir einige bereits bestehende Werte und fügen neue Parameter hinzu.
Leider haben Leser vereinzelt Probleme, die Config korrekt zu übernehmen, daher habe ich diese nun stark vereinfacht. Ihr müsst einfach alles unterhalb „Share Definitions“ entfernen und durch die Parameter in der Codebox ersetzen.

sudo nano /etc/samba/smb.conf
#======================= Share Definitions =======================
[global]
map to guest = never
[homes]
comment = Home Directories
browsable = no
read only = yes
valid users = %S
create mask = 0700
directory mask = 0700
[paperless]
comment = Paperless SMB Consume
valid users = paperless
path = /data/paperless/consume/
public = no
writable = yes
printable = no
browsable = no
guest ok = no
create mask = 0700
directory mask = 0700

Jetzt müssen wir die Berechtigungen auf den Samba Ordner anpassen, damit unser User auch Zugriff hat. Anschließend starten wir den smb Dienst neu.

sudo chown -R paperless:paperless /data/paperless
sudo chmod 700 /data/paperless
sudo systemctl restart smbd

Nun wechseln wir zu unserem User „paperless“. Anschließend springen wir in das Userverzeichnis von „paperless“ und legen die Konfigurationsdatei für unsere Paperless Applikation an. Für die User zu Ordnung sollte zudem die „UID“ und „GID“ des „paperless“ Users ermittelt werden. Dies sind auf eurem System einzigartige IDs, die nur dem jeweiligen User zu geordnet sind. Dafür fragen wir den Inhalt der „group“ Datei ab.

su paperless
cd /home/paperless
cat /etc/group | grep paperless:x:

Die nun ermittelte ID entspricht der „UID“, sowie der „GID“. Diese tragen wir in der unten stehende Config unter den entsprechenden Parametern ein. Zudem muss in der „docker-compose.yml“ unter „webserver“ noch den Admin User und das entsprechende Passwort definieren. Ich empfehle „paperless“ als User eingetragen zu lassen und entsprechend euer Wunschpasswort für den Admin User festzulegen.

nano docker-compose.yml
version: "3.4"
services:
  broker:
    image: docker.io/library/redis:7
    container_name: broker
    restart: unless-stopped
    volumes:
      - /data/paperless/redis/_data:/data
  db:
    image: docker.io/library/postgres:13
    container_name: db
    restart: unless-stopped
    volumes:
       - /data/paperless/postgresql/_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: paperless
  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    container_name: webserver
    restart: unless-stopped
    depends_on:
      - db
      - broker
      - gotenberg
      - tika
    ports:
      - 8001:8000
    healthcheck:
      test: ["CMD", "curl", "-fs", "-S", "--max-time", "2", "http://localhost:8000"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - /data/paperless/consume:/usr/src/paperless/consume
      - /data/paperless/data:/usr/src/paperless/data
      - /data/paperless/media:/usr/src/paperless/media
      - /data/paperless/export:/usr/src/paperless/export
    environment:
      PAPERLESS_ADMIN_USER: paperless
      PAPERLESS_ADMIN_PASSWORD: EuerAdminPasswortEintragen
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBHOST: db
      PAPERLESS_TIKA_ENABLED: 1
      PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
      PAPERLESS_TIKA_ENDPOINT: http://tika:9998
      PAPERLESS_OCR_LANGUAGE: deu
      PAPERLESS_TIME_ZONE: Europe/Berlin
      USERMAP_UID: IDdesPaperlessUsers
      USERMAP_GID: IDdesPaperlessUsers
  gotenberg:
    image: docker.io/gotenberg/gotenberg:latest
    container_name: gotenberg
    restart: unless-stopped
    command:
      - "gotenberg"
      - "--chromium-disable-routes=true"
      - "--chromium-allow-list=file:///tmp/.*"
  tika:
    image: ghcr.io/paperless-ngx/tika:latest
    container_name: tika
    restart: unless-stopped

Nun können wir unsere Container starten. Dies geschieht ganz einfach über ein wohlbekanntes Kommando.

docker compose up -d

Ihr könnt abschließend das Web UI von Paperless über die xxx.xxx.xxx.xxx:8001 erreichen.


Zusätzliche Einstellungen für Paperless

Nachfolgend werde ich einige für euch eventuell sinnvolle Einstellungen präsentieren. Dabei kann jeder für sich selbst überlegen, ob er diese übernehmen möchte oder nicht. Keine dieser Einstellungen ist für den fehlerfreien Betrieb von Paperless nötig.

Paperless über Domain aufrufen

Es ist möglich Paperless intern über den Hostname in Verbindung mit der lokalen Domain aufzurufen. Dies ist zudem auch extern über den Hostname in Verbindung mit Sub-/Domain möglich. Vorab gilt aber zu beachten, dass die Entwickler stark davon abraten, die Installation EXTERN erreichbar zu machen! Dennoch haben Leser bereits danach gefragt.
Voraussetzung dafür ist korrekt konfigurierter DNS-Server sowie eine lokale Domain. Auch eine normale TLD, die sich in eurem Besitz befindet, kann dafür lokal genutzt werden. Ich empfehle dies eher Lesern, die schon etwas mehr Grundwissen besitzen.

Solltet Ihr Paperless über den Hostname bzw. in Verbindung mit der lokalen Domain aufrufen wollen, müssen wir einen Parameter unter dem Punkt „environment“ hinzufügen.
Achtet dabei darauf, dass ihr entweder die korrekte lokale Domain oder eine normale TLD, die euch gehört, dafür verwendet. Kein Mischmasch. Wir zerstören zunächst den Container und fügen danach den Parameter der „docker-compose.yml“ hinzu.

cd /home/paperless/
docker compose down
nano docker-compose.yml
    environment:
      PAPERLESS_URL: http://paperless.localdomain.tld

Ist das geschafft bauen wir uns wieder einen Paperless Container

docker compose up -d

Backup erstellen und konfigurieren

Abschließend richten wir das Backup noch ein. Dazu verwenden wir ein Paperless eigenes Tool, welches sich „document_exporter“ schimpft. Dann basteln wir uns noch ein kleines Shell Kommando zusammen, was ein Backup in unseren „export“ Ordner anlegt. In welchem Zyklus ihr das Backup anlegen wollt, ist euch überlassen. Ich habe jeden Tag um 1 Uhr morgens gewählt, da es sich schlussendlich um relevanten Daten handelt.

crontab -e
0 1 * * * docker compose -f /home/paperless/docker-compose.yml exec -T webserver document_exporter /usr/src/paperless/export/

Um den Shellbefehl verstehen zu können, schlüssel ich diesen kurz auf.

docker compose -f /home/paperless/docker-compose.yml exec -T webserver document_exporter /usr/src/paperless/export/

Der erste Teil bis „exec“ sorgt dafür, dass ein „docker compose“ Kommando außerhalb des „paperless“ Ordner ausgeführt werden kann. Von „exec“ bis einschließlich „webserver“ ermöglicht das Ausführen eines Kommandos innerhalb des „webserver“ Containers. „document_exporter“ ist das Kommando, welches das Tool aufruft. Der letzte Teil ist der in den „webserver“ Container gemountete Pfad des Export-Ordners.

Daten aus Backup wiederherstellen

Das Wiederherstellen von Daten aus einem Backup gestaltet sich relativ einfach, da es wie bei dem Backup auch hier ein integriertes Tool gibt, welches wir verwenden können. Das besagte Tool nennt sich in diesen Fall „document_importer“. Wie bei dem Backup geben wir auch hier wieder den Pfad des „Export“ Verzeichnisses an, welches wir direkt in dem Container „webserver“ ausführen. Wichtig hierbei ist, dass wir genauso wie bei dem Backup, den in den Container gemounteten „Export“ Pfad auswählen.

docker compose -f /home/paperless/docker-compose.yml exec -T webserver document_importer /usr/src/paperless/export/

Netzwerklaufwerk unter Windoof einbinden

Nun könnt ihr unter Windows das Netzwerklaufwerk einbinden. Dies ermöglicht euch das automatische Konsumieren neuer Dokumente. Dazu müssen diese einfach in das Laufwerk gelegt werden. Dazu öffnet ihr einfach „Dieser PC“ oder den „Explorer“. Dort findet ihr im oberen Bereich den Punkt „Netzwerklaufwerk verbinden“. Danach tragt ihr folgenden Parameter ein und startet den Verbindungsvorgang. Jetzt noch die Logindaten eintragen und der Drops ist gelutscht.

\\IP.von.Paperless.hier\paperless\

Ordner- und Dateinamensstruktur auf eigene Bedürfnisse anpassen

Paperless gestattet es einem, die Ordner- und Dateinamensstruktur anzupassen. Dies ermöglicht eine Art von Ordnerablage, was der Organisation vieler Leute entspricht, die schon vor Paperless ihre Dokumente digital verwaltet haben. So ist es z.B. möglich, übergeordnete Ordner geordnet nach Jahren und untergeordnete Ordner für Korrespondenten anzulegen. Dies ist möglich, indem verschiedene Platzhalter aneinander gereiht werden. Eine Übersicht der möglichen Platzhalter findet ihr in der offiziellen Paperless Dokumentation. Soll zwischen Platzhalter eine Ordnerebene hinzugefügt werden, geschieht dies durch „/“ Slashes. Einzelne Platzhalter können innerhalb einer Ordnerebene durch Zeichen wie Bindestriche, Unterstriche und Leerzeichen voneinander getrennt werden.

Solltet ihr bereits Dokumente in Paperless eingepflegt haben, muss der nachfolgende Schritt ebenfalls umgesetzt werden. Sonst wird die neue Datei-/ und Ordnernamensstruktur lediglich für neu eingepflegte Dokumente angewendet und nicht für bereits bestehendes Material.

Zur Veranschaulichung hier ein kleines theoretisches Beispiel:

  • 2023
    • Korrespondenten
      • Dokumententitel
  • 2022
    • Korrespondenten
      • Dokumententitel

Im praktischen Umfeld kann dies dann wie folgt aussehen:

  • 2023
    • Meine Bank
      • 02-01-2023 Vertragsabschluss
      • 02-01-2023 Vertragsbestätigung
    • KFZ Versicherung
      • 01-01-2022 Halbjahresrechnung
  • 2022
    • KFZ Versicherung
      • 01-01-2022 Halbjahresrechnung
      • 01-07-2022 Halbjahresrechnung

Um nun das oben gezeigte umsetzen zu können, müssen wir zunächst den Container wieder zerstören.

cd /home/paperless/
docker compose down

Jetzt können wir der „docker-compose.yml“ den erforderlichen Parameter hinzufügen. Für das oben gezeigte Beispiel wäre diese Konfiguration nötig. Die Zeile kann nach eurem Belieben abgeändert werden. Achtet nur auf die Begrenzungen seitens Paperless.

nano docker-compose.yml
    environment:
      PAPERLESS_FILENAME_FORMAT: "{created_year}/{correspondent}/{created_day}-{created_month}-{created_year} {title}"

Dateien und Ordner nach Änderung der Datei- und Ordnernamensstruktur automatisch umbenennen

Solltet ihr bereits Dokumente in Paperless abgelegt haben, bevor ihr die Dateinamensstruktur angepasst habt, müssen alle schon existierenden Dokumente neu benannt werden, damit sie dem Schema, welches ihr vorher definiert habt, entsprechen. Klingt nach Spaß, oder? 😛 Um uns viel Mühen zu ersparen, haben die Entwickler rund um Paperless auch für diesen Fall ein kleines Tool bereitgestellt. Es handelt sich dabei um den „document_renamer“, welcher bei Aufruf die vorhandenen Dateien nach dem definierten Schema umbenennt. Die Bedienung des Tools ist unfassbar einfach. Wir müssen es lediglich im Paperless Container ausführen.

docker compose -f /home/paperless/docker-compose.yml exec -T webserver document_renamer

Update von Paperless-ngx

Das Aktualisieren von Paperless gestaltet sich relativ einfach, da wir es Docker basierend installiert haben. Zunächst springen wir in das Verzeichnis, in der die „docker-compose.yml“ liegt. Zur vorsorglichen Datensicherung stoßen wir ein Backup an, wie dies manuell und/oder automatisch ablaufen sollte, könnt ihr weiter oben nachlesen, daher gehe ich hier nicht weiter darauf ein. Anschließend schalten wir den Container ab, ziehen uns das aktuellste Docker Image aus dem Repository und starten den Container auf Basis des neuen Images. Die Daten wie Dokumente und Datenbank blieb erhalten, da diese direkt auf Verzeichnisse des Docker Hosts gemountet sind.

cd /home/paperless/
docker compose down
docker compose pull
docker compose up -d

Einstellungen zur Beseitigung von Problemen

Es gibt die ein oder andere Einstellung, die optional gesetzt werden kann, WENN es auf dem betreffenden System zu einer Störung oder einem Problem kommen sollte. Ich werde entsprechend ein Problem schildern und dazu eine mögliche Lösung eintragen. Dies kann das Problem lösen oder auch nicht. Häufig werden diese Troubleshooting Ansätze von meinen Lesern kommen, ich liste diese hier auf, eine gewisse Übersicht anzubieten.

Paperless hat Vollzugriff auf das Verzeichnis, scannt aber keine Dokumente

Vereinzelt haben Nutzer berichtet, dass Paperless keine Dokumente aus dem consume Ordner lesen kann. Zunächst sollte geprüft werden, ob der Nutzer „paperless“ ausreichende Berechtigung hat und zudem noch Besitzer der Ordnerstruktur ist. Nachdem dies geprüft wurde, kann es helfen Paperless manuell anzuweisen in einem gewissen zeitlichen Zyklus das consume Verzeichnis scannen zu lassen. Im Normalfall erkennt Paperless durch Änderungen des Filesystems, dass neue Dateien im Verzeichnis liegen.
Dazu fügen wir einfach der „docker-compose.yml“ einen Parameter hinzu. Die Zahl hinter dem Parameter gibt die Zykluszeit in Sekunden an.

cd /home/paperless/
docker compose down
nano docker-compose.yml
    environment:
      PAPERLESS_CONSUMER_POLLING: 60
docker compose up -d

failed to register layer: ApplyLayer exit status 1

failed to register layer: ApplyLayer exit status 1 stdout: stderr: unlinkat /var/cache/apt/archives: invalid argument 

Scheinbar gibt es seit einiger Zeit ein Problem, welches auftritt, wenn Docker in einem Proxmox LXC Container auf einem ZFS Storage betrieben wird. Es sind ledig Nutzer von ZFS betroffen und scheinbar bei Weitem nicht alle. Keins der von mir betreuten System, welche aktuell ZFS verwende, hatte bis jetzt dieses Problem. Zum jetzigen Zeitpunkt scheint es so, als könnte der aktuelle Opt-In Kernel 6.1 von Proxmox dort Abhilfe schaffen, zumindest berichten dies vereinzelt User im Proxmox Forum.

Das Problem tritt auf, wenn der Storage Driver ZFS verwendet wird. In der Vergangenheit wurde an der Stelle automatisch der VFS Storage Driver angewendet, dieser bläht allerdings das Dateisystem auf und erhöht damit den einhergehenden Speicherplatzverbrauch. Leider gibt es zum aktuellen Zeitpunkt keine andere für Laien anwendbare Lösung als auf den besagten VFS Driver zu wechseln. Es besteht die Möglichkeit „fuse“ zu nutzen, davon rate ich aber Dringen ab! Sehr dringend! Finger weg!

Dazu müssen wir zunächst den Docker Service stoppen und anschließend die „daemon.json“ anpassen. Dort tragen wir ein, dass der „VFS“ Driver verwendet werden soll.

sudo systemctl stop docker.service
nano /etc/docker/daemon.json
{
  "storage-driver": "vfs"
}

Nun treten wir den Docker Service einmal durch.

sudo systemctl start docker.service

Abschließend prüfen wir, ob Docker die Änderung angenommen und den Storage Driver korrigiert wurde. Dazu setzen wir ein kleines Kommando ab und prüfen die Ausgabe. Diese sollte klar den Storage Driver „VFS“ anzeigen.

docker info | grep Storage
Storage Driver: vfs

Grüße gehen aus dem Archiv!

Kommentar verfassen

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

118 Kommentare zu „Paperless-ngx im LXC Container installieren“

  1. Hallo,
    nachdem der Samba neu gestartet wurde, wird eine Konfigurationsdatei angelegt. Da ich eben da selber drüber gestolpert bin, sollte da der Vollständigkeit halber noch der korrekte Dateiname „docker-compose.yml“ ergänzt werden.
    Danke im Voraus und herzliche Grüße
    Sven

  2. Sollte usermapping nicht variabel gestaltet sein? Sprich die uid und gid sind doch abhängig vom Einrichten des Containers. Ansonsten top Tutorial.

    PS: mkdir -p /data/paperless/{consume,data,export,media} kürzt ein wenig die Befehle ein 🙂

    1. Warum sollte das Mapping variabel erfolgen? Das leuchtet mir nicht so recht ein.
      Die Erstellung der Ordner habe ich bewusst so ausführlich gestalltet, damit auch Anfänger die Chance haben die Anleitung zu verstehen und nachvollziehen zu können.
      Trotzdem danke für deinen Tipp. 🙂

      1. Bei mir waren die gid und uid von paperless beispielsweise 1000 und nicht 1001. Das hängt ja von der Anzahl der Nutzer, die angelegt wurden, ab. Wenn nicht irgendwas übersehen habe in deinen beiden Anleitungen, dann ist man bei 2 Nutzern: root und paperless. Daher die Verwunderung. Aber ist auch Jammern auf hohen Niveau.

        1. Der dritte User erklärt sich durch die vorherigen Tutorials. Meine Beiträge bauen zu gewissermaßen aufeinander auf, da ich bei neuen Projekten immer aus einem Basis Container Template einen Container erstelle. Der ITler ist ja faul. Ich verwende zur Konfiguration immer einen User der NICHT root ist, aber Sudo Berechtigungen hat.
          Um solche Komplikationen zu vermeide, verlinke ich immer vorher benötigte Beiträge. 🙂
          Wenn ich die Zeit finde, werde ich den Beitrag erweitern und eine vorherige Ermittelung der UID hinzufüen.

  3. Servus, erstmal danke für diesen informativen Blog !!!
    Wenn ich alle Schritte befolge, habe ich am Ende das Problem das der Samba Server nicht hoch kommt. Ich nutze einen unpriv. CT. Gibt es hierzu einen Workaround ?

    Viele Grüße aus Nürnberg.
    Oli

    smbd.service – Samba SMB Daemon
    Loaded: loaded (/lib/systemd/system/smbd.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Fri 2022-09-30 09:11:25 CEST; 1min 17s ago
    Docs: man:smbd(8)
    man:samba(7)
    man:smb.conf(5)
    Process: 2000 ExecStartPre=/usr/share/samba/update-apparmor-samba-profile (code=exited, status=0/SUCCESS)
    Process: 2001 ExecStart=/usr/sbin/smbd –foreground –no-process-group $SMBDOPTIONS (code=exited, status=1/FAILURE)
    Main PID: 2001 (code=exited, status=1/FAILURE)
    Status: „daemon failed to start: Samba failed to init printing subsystem“
    Error: 13 (Keine Berechtigung)
    CPU: 80ms

  4. Super Anleitung, hat viele Details, die andere Paperless Anleitungen für LXC nicht einmal nennen!

    Ich hatte es zuerst in einem unprivilegierten Container erstellt, aber das mit dem Samba (Quelle QNAP NAS) nicht hinbekommen, mit UID Mapping, Ownership für Paperless, etc. und am Ende aufgegeben.

    Was ist deine Empfehlung für Paperless? Diese Variante mit Docker oder ein eigener Container (evtl. privileged) für Paperless?

    1. Hallo Thommy,
      freut mich, dass ich dir mit dem Beitra weiterhelfen konnte!

      Ich empfehle Paperless tatsächlich im Docker Container laufen lassen. An deiner Stelle würde ich einen LXC erstellen, dort Docker installieren und nur Paperless als Container laufen lassen, dies mache ich im übrigen mit jeder Software. Pro LXC / VM nur eine Software.
      So kann ich sicherstellen, dass wenn ich mal Unfug in dem LXC / VM mache oder etwas anderes passiert sicherstellen, dass NUR dieser Service mir den Mittelfiner zeigt. Ich bin kein Freund davon für alles Docker zuverwenden. Alles was ich „normal“ installieren kann installiere ich auch so. Bei manchen Services mache ich aber eine Ausnahme, weil es entweder deutlich mehr Wartung benötigt oder mehr Nachteile als Vorteile bietet.
      Von meinen mittlerweile 27 LXCs und VMs sind lediglich vier mit Software die in Docker läuft und das wären Vaultwarden, Onlyoffice, NPM und Paperless.

      Mittlerweile habe ich alle meine Dokumente in Paperless, daher möchte ich eine schnelle und vor allem einfache Wartung der Software.
      Dies ist mit Docker bzw. Docker-compose gegeben 🙂

        1. Hallo erst einmal, ein „Hallo“ geht doch immer. 🙂

          Sämtliche meiner Anleitungen basieren auf „unprivileged“ Containern. Prinzipiell sollte selbst im lokalen LAN der „unprivileged“ LXC stark präferiert werden. Der Grund muss schon triftig sein, um zu einem „privileged“ zu wechseln. Für Applikationen, die von Außen erreichbar sind, ist dies an absolutes No-Go.

          In meinem Beitrag zu der Docker Stack Installation ist aber bereits angeben, ob „unprivileged“ oder „privileged“ verwendet werden sollte. Diese dient wie im Beitrag bereits erwähnt als Basis für die nachfolgende Paperless Installation.

  5. Hallo,
    besten Dank für die gute Zusammenstellung. Funktioniert super. Ich habe einen alten(?) USB Scanner am Proxmox hängen, mit dem ich über einen zusätzlichen LXC den paperless füttern wollte. Als Anregung falls jemand ähnliches vorhat. Per Knopfdruck am Scanner werden viele Seiten eingelesen, ggf. per Trennblätter in einzelne Dokumente unterteilt und leere Seiten entfernt. Anschließend wird alles per SSH zum paperless kopiert.

    Grobes Howto:
    – Debian im LXC aufsetzen und wie hier beschrieben den USB Port durchreichen
    – apt install scanbd pdftk imagemagick sane sane-utils python3-pip git libzbar0
    – scanprep!! https://github.com/baltpeter/scanprep

    Hier ein kleines Skript welches in /etc/scanbd/scanbd.conf eingetragen wird und somit über die Scannertaste ausgeführt wird:

    #!/bin/bash
    #
    STAMP=date +%Y%m%d-%H%M%S
    SCANBD_DEVICE='fujitsu:ScanSnap S1500:326276'
    SANE_CONFIG_DIR=/etc/scanbd
    WORKDIR=/opt/scan
    #
    mkdir -p $WORKDIR/$STAMP
    mkdir -p $WORKDIR/out/pdf
    cd $WORKDIR/$STAMP
    #
    scanimage -d "$SCANBD_DEVICE" \
    --mode Lineart \
    --page-width 210mm \
    --page-height 297 \
    --source 'ADF Duplex' \
    --brightness 0 \
    --contrast 0 \
    --batch=out%03d.pnm \
    --resolution 300
    #
    if [ $? == 0 ]; then
    for INP in ls *.pnm
    do
    convert $INP $INP.pdf
    done
    pdftk *.pdf cat output $WORKDIR/out/pdf/$STAMP.pdf
    scanprep --page-separation --blank-removal $WORKDIR/out/pdf/$STAMP.pdf $WORKDIR/out/consume
    scp $WORKDIR/out/consume/*.pdf paperless@PAPERLESSHOSTNAME:/data/paperless/consume/
    rm $WORKDIR/out/consume/*.pdf
    rm $WORKDIR/$STAMP/*
    rmdir $WORKDIR/$STAMP
    fi

    Vielleicht gibt es elegantere Methoden, aber ich hatte das Skript hier noch „rumfliegen“ und angepasst.
    Viele Grüße
    Tobias

  6. Hey, echt eine super Anleitung. Bei mir funktioniert alles!

    Ich stelle mir die Frage, wo die Dateien abgespeichert werden? Wie finde ich den Pfad? Ein paar Dateien (PDF) hab ich schon hinzugefügt, aber in der Konsole finde ich diese nicht wenn ich diese suche. Ein Bsp. wäre find -name 0000003.pdf . Kein einziges Ergebnis 🙁

    Ich möchte ein Automatismus reinbringen, dass in einen bestimmten Ordner die Daten abgerufen werden und automatisch hochgeladen.

    1. Das ist ganz einfach. Die Pfade kannst du der docker-compose.yml entnehmen.

      Für Dokumente und Daten:
      /data/paperless/media
      Zum konsumieren neuer Dokumente in Paperless:
      /data/paperless/consume
      Paperless kann in diesem Ordner Backups ablegen:
      /data/paperless/export
      Für Logs und anderes:
      /data/paperless/data

      Für das konsumieren der Daten ist das SMB Share da, einfach den Scanner in das Share scannen lassen.
      Du kannst aber auch Paperless mit einem Email Account koppeln und Daten manuell in einen seperaten Postfachordner verschieben.

    2. Servus, du kannst noch folgende Option mit einfügen. Damit werden die Scańs dann nach Jahr/correspondent/titel angelegt.
      2022/OBI/Titel

      PAPERLESS_FILENAME_FORMAT: „{created_year}/{correspondent}/{title}“

      Gruß
      Oli

      1. Hallo Namensvetter,

        du hast mir nach einigem an Kopfzerbrechen mit deinem Kommentar geholfen das Format endlich ändern zu können.

        Falls man den Fehler yaml: line XX: did not find expected key bekommt, die oben erwähnten Anführungszeichen einfügen:

        PAPERLESS_FILENAME_FORMAT: {created_year}/{correspondent}/{title}

        In der Anleitung sind die nicht vorhanden.

        Danke und Gruß,
        Oli

  7. Bei dem Befehl „docker compose run –rm webserver createsuperuser“ fehlt ebenfalls ein – richtig wäre „docker-compose run –rm webserver createsuperuser“

    Bei dem Befehl fürs erstellen eines Backups fehlt auch das -, zusätzlich ist der Pfad nicht korrekt.
    „docker compose -f /home/paperless/paperless/docker-compose.yml exec -T webserver document_exporter /usr/src/paperless/export/“

    richtig wäre

    docker-compose -f /home/paperless/docker-compose.yml exec -T webserver document_exporter /usr/src/paperless/export/

    1. Hallo erstmal! Ein Hallo geht wohl immmer.

      Das ist nicht korrekt, du verwendest einfach eine alte Version von docker compose. Docker compose wird mitlerweile nicht mehr als Standalone installiert, sondern als Plugin der eigentlichen Docker Installtion. Du kannst in meinen Tutorials die Installation mit dem aktuellen Stand der Dinge finden, zudem wird dort das Docker Repository hinzugefügt. Dies verspricht aktuellere Versionen als im Standart Debian Repository vorhanden
      In meinen Tutorials versuche ich stehts den aktuellsten Stand wiederzugegeben.

      Den Pfad habe ich korregiert. In meiner privaten Produktivumgebung verwende ich jeweils noch einen Unterordner, da ist wohl ein Paperless zu viel rein gekommen.

      1. Da hast du recht, ein Hallo sollte immer gehen.
        Also, Hallo!

        Auch hierbei hast du recht, ich hatte Docker auf Ubuntu Basis mit einer alten Version installiert.
        Ich habe nun nochmal alles mit deiner Anleitung für Docker auf Debian 11 neu eingerichtet und mich an dieser Anleitung funktioniert. Nun geht es wie du auch beschreibst ohne -.
        Danke dir für den Hinweis!

        was mir noch aufgefallen ist.

        In deiner Anleitung nutzt du anfangs Befehle mit sudo.
        Wir sind ja aber als root angemeldet.
        Ich vermute mal da du auf deine Tutorials aufbaust, wird es vermutlich einen entsprechenden Nutzer geben den du nutzt. Ist ja auch kein Fehler.

        die SMB Freigabe funktioniert bei mir nicht, ich habe noch nicht geschaut warum, wird wohl kein größeres Problem sein, vielleicht habe ich mich in der cfg verschrieben, hat aber auch nicht so Priorität.

        Ansonsten 1A Anleitung, dank dafür!

        1. Hallo Matthias,

          man sollte prinzipiell auf einer Linux Maschine oder einem Host nicht mit root arbeiten. Lediglich wenn es nicht anders geht, was selten der Fall ist.
          Best Practise in diesem Fall ist es einen User anzulegen und diesen in die /etc/sudoers einzutragen. So kann dieser mit „sudo“ root Rechte für einen fest definierten Prozess erhalten.
          Kleines Beispiel warum: Ich war auf einer Linux Umgebung und war in Eile, sowie Stress. Ich wollte einen Ordner löschen und tat dies mit „rm -rf /“. Leider war ich zu schnell und habe das nachfolgende „etc/ordner“ vergessen. Daraufhin war die Maschine platt. Das ist mittlerweile 4 Jahre her, aber die Gänsehaut kehrt heute bei dem Gedanken daran sofort zurück. Mit einem normalen User wäre das nicht passiert. 😉

          Eine Anleitung wie man einen LXC Container vorbereitet findest du ebenfalls auf meiner Website 🙂

          Oftmals sind es tatsächlich Syntax Fehler oder andere Inhalte wurden nicht korrekt entfernt. Am besten schaust du mal in dies Logs rein.

  8. Hallo zusammen,

    ich habe ich mal an das Thema Docker herangewagt. Nach Deiner super Anleitung laufen bei mir nun Docker und Portainer. Darin laufen auch schon zwei Container.
    Nun wollte ich Paperless installieren. Leider bekomme ich nach dem Befehl „docker compose up -d“ folgende Meldung:

    (root) Additional property 0~version is not allowed

    Kann mir hier jemand weiterhelfen?

    Danke

  9. Hallo, das klingt sehr spannend! Im Moment läuft Paperless-ngx bei mir ganz „normal“ als Docker-Container auf meinem privaten Desktopsystem. Ich wollte das gerade auf Podman umstellen und bin dann auf diesen ganz anderen Ansatz hier aufmerksam geworden. Ich verstehe es so, dass die LXC-Lösung besser portabel und sicherer wäre als die reine Docker-Lösung direkt auf dem Host. Meine Frage, da ich mich zum ersten Mal intensiver mit LXC beschäftige: Ist Dein gesamtes Paperless-Setup auf Proxmox angewiesen oder geht es nur darum, dass die LXC-Container auf irgendeinem Weg, sei es CLI oder LXDUI, eingerichtet werden müssen? Danke!

    1. Hallo Chris,
      im theoretischem Ansatz sollte der LXC auch in einer anderen Umgebung lauffähig sein. Meines Wissens nach sind die Basis Images von LXC Containern in jeder anderen Umgebung, die LXC unterstützt, lauffähig. Die installierte Software wie Docker und co. bauen auf das Image auf daher sollten diese, wenn das Image lauffähig ist, auch lauffähig sein. Turnkey verfolgt den selben Ansatz und deren Images laufen auch auf anderen LXC Umgebungen.

  10. Reverse Proxy… ich hätte Installation gerne über eine Domain von aussen erreichbar gemacht. Dazu nutze ich für andere Projekte den Nginx Proxy Manager. Leider funktioniert das irgendwie nicht wie üblich. Wie konfiguriert man paperless hinter einem proxy?

    1. Hallo Ralf,

      bei mir funktioniert es ohne Probleme. Du musst darauf achten, dass der Eintrag im NPM auf Port 8001 und mit dem http Protokoll läuft. Alles andere ist wie bei anderen Einträgen auch.
      Verwende am besten zuhause für alles ein Wildcard Zertifikat, so kannst du die Let’s Encrypt Server etwas entlasten 😉

      1. Heisst bei der Installation eine Domain angeben, dann Port 8001 auswählen. NPM http, interne IP Adresse und Port 8001. Mit SSL verschlüsseln. Firewalltechnisch noch ein port forwarding und wohl ein lokaler DNS Eintrag, oder?

        1. Hallo Ralf,
          bei der Installation muss keinerlei Domain angeben werden. Warum auch? Eintrag in NPM anlegen mit der Domain die außerhalb verfügbar ist. (Vergiss nicht die Subdomain beim Anbieter anzulegen) Als Port 8001 auswählen und die private IP eintragen. SSL Zertifikat auswählen.
          Port forwarding und lokaler DNS Eintrag ist auch nicht nötig. Auch hier warum auch? Du musst nur dein Port Forwarding auf 80 und 443 freigegeben haben. Was du bereits haben wirst, wenn du schreibst das du bereits andere Services hast.

          Erklährung:
          Anfrage kommt im WAN auf Domain xxx.domain.tld. DNS Server im WAN schlüsselt Domain in IP auf und leitet an deine Public IP weiter. Die Anfrage wird dann im Router / FW über NAT getnattet und durch das Port fordwarding im Router / FW an den NPM weitergeleitet. Der NPM nihmt die Anfrage an und schaut auf welche Domain das weitergeleitet werden soll. Durch den Proxy Host Eintrag weiß er auf welche private IP, Port und durch welches Protokol (http oder https) die Anfrage weitergeleitet werden soll.

          1. Danke für den Input. Es läuft… Fehler war: Ich habe NPM in einem eigenen VLAN. Musste in der Firewall noch die Portweiterleitung 8001 vom vlan99 in vlan10 erlauben, also quasi in mein internes Netz. WAN Traffic landet immer bei NPM… Eine Zugriffsregel mehr und es läuft.

            Und yep – port forwarding und DNS Eintrag lokal nicht nötig.

            Danke für den Support – nun geht’s los mit Dokumenten scannen 🙂

          2. Update: Die Domain muss bei der Installation angegeben werden oder nachträglich in der docker-compose.env eingetragen sein. Tut man es nicht erhält man nach dem login ein: CSRF verification failed!

  11. Hallo,
    wirklich eine sehr gute anleitung! Alles läuft wie gewünscht. Kannst du mir sagen wie ich die Version 1.9.2 auf 1.10 update? danke vorab. Und weiter so. wirklich ein sehr guter Blog, oder Gedankenstütze:)

    gruss
    ralf

    1. Hallo Ralf,
      dazu gehtst du einfach in das Verzeichnis indem die docker-compose.yml liegt. Dort angekommen führst du folgende Befehle aus.
      docker compose down
      docker compose pull
      docker compose up -d

      Zur Erklährung:
      Erst zerstörst du den Container, anschließend lädst du das neue Image herunter und erstellst einen neuen Container mit dem neuen Image.

  12. Hallo Lucas,
    auch von mir ein „herzliches Dankeschön“ für die tolle Anleitung. Sie hat es selbst mir als absolutem Linux-Noob möglich gemacht, Paperless in meinem Proxmox- / Docker-Container zu installieren. Soweit funktioniert auch alles.

    Ich habe allerdings noch eine Frage zu der Möglichkeit, von außerhalb des Containers (sprich aus dem „normalen“ Heimnetz) per Samba auf den paperless/consume – Ordner zuzugreifen. Meine Idee ist es, automatisiert von meinem Qnap-Server Dokumente automatisiert in den consume-Ordner spiegeln zu lassen. Leider fehlt mir da die Kompetenz.

    Für einen Tipp wäre ich sehr dankbar.

    Viele Grüße aus Düsseldorf
    Thilo.

  13. Mega Anleitung, vielen lieben Dank dafür! Einfacher geht’s wirklich nicht mehr! Hab nun meiner Freundin und mir jeweils eine eigene Instanz erstellt. Mega!

  14. Hey Leute,

    vielleicht hat jemand einen Tipp:

    Folgender Fehler kommt immer wenn man Dokumente / Bilder hochlädt:

    ————————————————

    [2022-12-10 12:26:24,562] [ERROR] [paperless.handlers] Creating PaperlessTask failed: malformed node or string:

    ———————————————–

    Vielleicht weiß jemand Abhilfe.

    Google findet leider nichts passendes dazu.

    Vielen Dank.

    Grüße
    Christoph

  15. Hallo zusammen,

    vielen Dank für die Anleitung, klappt auch alles soweit super bis auf smb.
    Ich komme mit der ANleitung zu samba nicht klar. Es gibt ja bereits [homes] wird da nun nur read only auf yes gestellt und dann [Paperless] darunter? Hat jemand eventuell die komplette conf, die ich auf mich anpassen kann?

  16. Hallo,
    leider funktioniert bei mir der Ordner consume nicht, ich bin der Anleitung gefolgt, kann auch über die Samba-Freigabe Dokumente in den Ordner ziehen, unter Linux sehe ich die Dokumente, aber leider verarbeitet Paperless-NGX diese nicht. Hat jemand einen Idee woran dies liegen könnte?

      1. Hallo Lucas,
        vielen Dank für die Antwort, ich hatte ein Berechtigungsproblem auf dem Paperless/consume Ordner. Ich habe nochmal komplett nach deiner Anleitung installiert, den Fehler, den ich beim ersten Mal gemacht habe, ich habe Docker und Docker Compose mit einem anderen Benutzer installiert.

      1. Absoluter Käse, ich habe alle seit Juli 2022, gelöschten Kommentare archiviert.
        Dein Name taucht dabei nicht auf. Ich bitte dich, solche falschen Aussagen nicht weiter zu veröffentlichen.
        Vielleicht muss man erst warten, bis Kommentare veröffentlicht werden, bevor man erneut kommentiert. Besonders, wenn nur 5 Stunden dazwischenliegen. 😉

        1. Ok ok, sorry.
          Auf jeden Fall funktioniert deine Konfiguration so nicht universell bei jedem.

          Ich habe jetzt eine docker-compose.env angelegt mit folgenden Inhalt:

          # consumption directory.
          USERMAP_UID= #Hier UID von user paperless eintragen
          USERMAP_GID= #Hier GID von user paperless eintragen

          # Polling – alle 60 Sekunden Consume-Ordner scannen
          PAPERLESS_CONSUMER_POLLING=60

          Die uid und gid Werte des user paperless erhält man so:
          Als user paperless einloggen:
          su paperless
          Für den Wert von UID:
          id -g
          Für den Wert von GID:
          id -u

          Danach noch in der docker-compose.yml folgendes einfügen:
          env_file: docker-compose.env

          Danach als user paperless ein docker-compose up -d

          Ich würde ohnehin empfehlen die environment Befehle in einer env-Datei abzulegen.
          Gruß
          Daniel

          1. Moin Daniel,
            das kann durchaus sein, dass dieser Beitrag nicht für jeden passen muss.
            Schlussendlich betreibe ich diese Website als Archiv, für die von mir umgesetzten Installation in meinem Homelab.

            Das Mapping ist wieder in dem Beitrag mit aufgenommen, ursprünglich war das auch schon mal vorhanden. Allerdings habe ich die Ermittlung der UID und GID vereinfacht.

            Von einer docker-compose.env halte ich nichts, daher werde ich das auch nicht mit aufnehmen. Grund dafür ist der Verlust der Übersicht, welcher Parameter zu welchem Service gehört. Sollte eine docker-compose.env verwendet werden, trägt man sämtliche environment Parameter dort ein. Alle Parameter der einzelnen Services werden untereinander aufgelistet. Zur Übersicht kann auch für jeden Service eine eigene docker-compose.env angelegt werden, was aber dafür sorgt das etliche Dateien vorhanden sein. Zudem möchte ich alle Einstellungen in einer Datei haben, nicht in zwei oder Anzahl X.

            Zusätzlich habe ich die Verwendung des PAPERLESS_CONSUMER_POLLING=60 Parameters mit aufgelistet. Allerdings mit einem klaren Disclaimer, dass dieser Parameter im Normalfall nicht genutzt werden muss und nicht pauschal schon eingetragen werden sollte, da in der Regel nicht benötigt.

  17. Hiho, ich hab das Problem das die Samba Freigabe sich irgendwie verabschiedet. Bin der Anleitung gefolgt und Anfangs ging Windows/Synology/Scan2smb Zugriff. Dann stoppt es.
    „chdir_current_service: vfs_ChDir(/data/paperless/consume) failed: Keine Berechtigung. Current token: uid=1001, gid=1001, 2 groups: 1001 998
    [2023/01/02 15:13:18.493079, 0] ../../source3/smbd/service.c:166(chdir_current_service)“
    Samba Config ist 1:1 von hier.

    1. Moin Christian,
      betreibst du deine Paperless Installation in einem LXC, der sein Speicher auf ZFS liegen hat? VFIO ist der Storage Treiber, den Docker verwendet, wenn ZFS verwendet wird. Vielleicht passen die Berechtigungen des Subvol nicht.
      Wenn ich die Tage dazu komme, gehe ich die ganze Installation noch mal durch. Vielleicht fällt mir was auf oder ich erhalte denselben Fehler.

      1. Ich habe gerade gemerkt das ich bei der Docker Konfiguration einen wichtigen Punkte übersehen habe oder haben Sie diese ergänzt?

        USERMAP_UID: IDdesPaperlessUsers
        UserMAP_GID: IDdesPaperlessUsers

        Jetzt kappt alles! 🙂
        Vielen Dank Herr Schreiner!

        1. Hallo Alwin,

          hier musst du niemand siezen 😉
          Ich habe das UserID Mapping gestern wieder hinzugefügt. In meiner Umgebung hat es ohne funktioniert, daher war es für kurze Zeit aus dem Beitrag entfernt worden.
          Allerdings haben Leser berichtet, dass es in deren Umgebungen so zu Fehlern kam.

    2. Hallo, ich hab auch das Problem. Sobald ich einen Neustart durchführe sind die Berechtigungen leider nicht mehr vorhanden.

      Dies trifft aber nur auf die Ordner zu die für Docker/Paperless Interessant sind: consume; data; media; export.

      Wenn ich einen neuen Ordner unter Paperless erstelle, und diesen die Berechtigung und Freigabe zuweise behält dieser die Berechtigung die anderen ändern sich wieder.

      Trotzdem danke für die super Anleitung alles andere hat bestens geklappt!

  18. Hallo, erstmal vielen Dank für deine Tolle Arbeit hier. Ich konnte das Tutorial befolgen und es klappt auch alles. Allerdings bin ich etwas überfordert mit den ganzen Container, Docker, Portainer…. Könntest du das mal etwas erklären 🙂

    Auch ist mir vollig schleierhaft wie ich in Zukunft Paperless auf eine neue Version update :/

    Grüße und vielen Dank.

    1. Hallo,
      das update des docker-images funktioniert im /home/paperless Verzeichnis mit folgenden 3 Befehlen:
      docker compose pull
      docker compose down
      docker compose up -d
      Habe gerade auf paperless-ngx 1.12.1 aktualisiert.
      Grüße

  19. docker-compose up -d liefert Fehler

    hallo,
    ich habe meinen host neu gebootet (und proxmox auf den neuesten Stand gebracht).
    leider bekomme ich den container nicht mehr zum Laufen.
    meldet bei docker-compose up -d folgendes:
    ERROR: failed to register layer: ApplyLayer exit status 1 stdout: stderr: unlinkat /usr/src/paperless/src/docker/compose: invalid argument

    bin ratlos!

    1. Hallo Bernd,

      hast du Docker per Zufall mit upgedatet? Docker compose wird in den aktuellen Installationen nicht mehr als separates Programm installiert, sondern als „zusätzliches“ Paket über das Repository. Check mal die Docker compose version mit docker compose version

      1. Hi Lucas,
        meine
        docker version ist 20.10.17 und docker-compose version ist 1.29.2
        Habe docker-compose auch nochmal frisch installiert – habe den gleichen Fehler.
        PS: ich habe paperless in docker auf einem ProxMox-Container laufen…..

        1. Hallo Bernd,

          du hast scheinbar Docker nicht nach meiner Anleitung installiert, da du eine veraltete Docker compose Version verwendest. Dies wäre mit meiner Anleitung nicht möglich. Die aktuellen Versionen sind 22.10.23 und 2.15.1
          Bitte wiederhole die Installation nach meiner Anleitung und deine Probleme sollten sich erledigen.
          Anschließend führst du diesen Befehl aus:docker info | grep Storage und postest hier das Ergebnis.

          1. Joachim Scholtysik

            Ich habe die Anleitung gerade noch einmal mit den aktuellen Versionen von Docker und Portainer in einer Proxmox VM mit Ubuntu Server Jammy 22.04.2 LTS ausprobiert, hier funktioniert die Installation von Paperless NGX ohne Probleme.

            1. Hallo Joachim,

              scheinbar gibt es in der Richtung immer wieder Probleme bei vereinzelten Usern.
              Bei mir ist es bis jetzt auf keinem System, welches ich betreue, zu dieser Problematik gekommen.
              Verwendest du ZFS auf deinem Proxmox Host oder ext4? Würde mich freuen, wenn du mir ein paar Infos zukommen lassen könntest.
              Gerne auch über das Kontaktformular.

  20. Hallo und erstmal Danke für deinen Blog!

    Eine kurze Frage hätte ich aber bezüglich des

    PAPERLESS_ADMIN_USER=

    und

    PAPERLESS_ADMIN_PASSWORD=

    Und zwar funktioniert mein gesetztes Passwort nicht. Der User wird erstellt, aber das Passwort funktioniert nicht. Ich komme erst über den Umweg einen neuen superuser anzulegen rein (portainer -> webserver-> console ->python3 manage.py createsuperuser ).

    Ich hab auch schon diverse Passwörter ausprobiert, aber keins will funktionieren. Gibt es bestimmte Vorgaben?

    So sieht es theoretisch bei mir aus:

    PAPERLESS_ADMIN_PASSWORD= Passwort

    1. Hallo Oli,

      der User muss initial bei der ersten Erstellung des Containers gesetzt sein. Im Nachhinein lässt sich das Passwort meines Wissens nach nicht mehr mit der Variabel anpassen.
      Wichtig ist, die Syntax einzuhalten:
      PAPERLESS_ADMIN_PASSWORD: Passwort
      oder
      - PAPERLESS_ADMIN_PASSWORD=Passwort

  21. Hallo und eins vorweg. Klasse Anleitung. Ich habe das Problem, dass unter Media die Titel ohne Umlaute sind. Die Konfiguration ist kompl. nach dieser Anleitung. das Einzige was ich geändert habe ist folgendes: PAPERLESS_FILENAME_FORMAT: ‚{created_year}/{created_year}{created_month}{created_day}–{correspondent}–{document_type}–{tag_list}–{title}‘. Kann es daher kommen? Danke und Grüße aus OWL. Peter

    1. Hallo Peter,

      wo werden die Datein ohne Umlaut angezeigt? In der WebUI oder auf der Shell?
      So sollte der Parameter aussehen:
      PAPERLESS_FILENAME_FORMAT: "{created_year}/{created_year}{created_month}{created_day}–{correspondent}–{document_type}–{tag_list}–{title}"

      Schau mal direkt auf der Shell, ob dort die Dateien korrekt angezeigt werden. Nicht das die locales auf deinem System nicht korrekt gestzt wurden.

      1. Danke für die schnelle Antwort. Ich glaube, dass es vielleicht ein Bug in Paperless sein könnte. Viele werden die Problematik nicht erkennen da es im Frontend nicht auffällt. Kann evtl. mal jemand bei sich im Dateisystem nachsehen? Vielen Dank dafür.

          1. Hallo Lucas, ja, genau. Falls die Weiterentwicklung stoppt und die Daten migriert werden müssen, erfordert dies viel Nacharbeit. Grüße.

            1. Vermutlich hast du deine LXC Installation nicht nach meiner Anleitung gemacht?
              Dein Problem wird nicht an Paperless liegen, sondern an der „locales“ Einstellung deines Hosts.
              Du wirst die Einstellung auf „en_EN-UTF-8“ stehen haben, im Englischen gibt es allerdings keine Umlaute. Umlaute werden dann durch nicht klare Zeichen ersetzt.
              Im Web UI wird es dann wiederum korrekt angezeigt, weil dein Browser lokal die Zeichensetzung erkennt und die korrekten Zeichen dafür wieder gibt.
              dpkg-reconfigure locales und en-EN-UTF8 abwählen, dafür de-DE-UTF8 anwählen.

  22. Hallo!
    Danke für die Anleitung!
    Ich suche immer noch nach einer Möglichkeit, Dokumente von unterwegs nach Paperless zu senden.
    Webdav wäre eine Möglichkeit – aber ich finde keinen Webdav-Server, der auch Upload zulässt – zumindest als Docker Container.

    Hat da jemand evtl. eine Idee?

    Gruß
    Martin

    1. Moin Martin,

      in meiner Umgebung ist es so gelöst, dass ich das Consume Verzeichnis von Paperless in meiner Nextcloud eingebunden habe. Wenn ich unterwegs ein Dokument einpflegen will, scanne ich mit der Nextcloud App das Dokument und lege es im Consume Verzeichnis ab. Zack drin isses.

      Paperless ist auch in der Lage, Dokumente aus einer Mail einzupflegen. Einfach mit einer Scanner-App das Dokument einscannen und dann per Mail an Paperless senden. Wenn man eine Domain hat, einfach ein zweites Postfach anlegen oder sich selbst die E-Mail senden. Dann sollte aber ein Prefix konfiguriert werden.

      1. Hi Lucas,
        danke für die Tips!
        Extra deswegen eine Nextcloud aufzuziehen finde ich etwas zu heavy.. Klar – per Email geht das auch (wobei ich keine Domain habe) – es würde ja auch per VPN gehen – aber ich würde es gerne einfach und „leicht“ haben. Zumal Webdav auch die meisten Android Scanner haben…

        1. Hallo Martin,

          einfach die Mail einrichten und Paperless anweisen, nur die E-Mails zu schnappen, die ein bestimmtes Prefix haben, z.B. einfach nur „paper“ als Prefix. Oder einfach eine zweite E-Mail bei Anbieter xyz.de einrichten. Viel einfach geht es bald nicht mehr. Na ja, einen Tod muss man immer sterben. Entweder einmal mehr Arbeit oder jedes Mal mehr Arbeit 🙂

  23. Hallo!
    Danke für die ausführliche Anleitung. Leider hänge ich an der stelle fest, an der UID und die GID ermittelt werden sooen. Die Befehle
    su paperless
    cd /home/paperless
    cat /etc/group | grep paperless:x:
    hab eich ausgefgührt. Allerdings erhalte ich keine Ausgabe der UID und GID?! Wie komme ich daran um sie in die „docker-compose.yml“ einzufügen?

      1. Hallo Lucas,
        nachdem ich den Befehl „ cat /etc/group | grep paperless:x:“ nochmal einzeln eingegeben habe, habe ich die passende Ausgabe erhalten. Scheinbar wurde die Ausgabe verschluckt, als ich aller drei Befehle per copy and paste eingesetzt habe.

  24. Hallo,
    Danke für die Anleitung. Soweit hat alles funktioniert. Leider kann ich mich auf der web Seite von paperless nicht anmelden. Ich nehme an, ich mmuiss hier den Namen (paperless) und das Passwort, dass ich bei „PAPERLESS_ADMIN_PASSWORD:“ in der docker-compose.yml vergeben habe benutzen?! Geht aber nicht…

    1. Hallo Holger,

      genau diese Daten musst du auf der Weboberfläche verwenden.
      Du hast irgendwo in deiner Installation murkst gemacht. Wie wohl zuvor bei dem Paperless User auch.
      Ich habe, um einen Fehler meiner Seite ausschließen zu können, die Installation noch mal genau nach Beitrag gemacht und kann mich problemfrei einloggen.
      Das Passwort, welches du in der docker-compose.yml verwendest wird beim erstmaligen Start gesetzt, solltest du danach das Passwort erneut angepasst haben, wird dies nicht übernommen.

      1. Hallo Lucas,
        danke für die Hilfe. Das Problem war, dass mein Passwort mit # begann. Ich habe mit yaml sehr wenig Erfahrung und habe nicht dran gedacht, dass dadurch ja offensichtlich ein leeres Passwort erzeugt wird…

  25. Moin,
    bin über diesen thread gestolpert und hab die Installation gut hinbekommen. Was aber nicht so recht funktioniert, ist „Ordner- und Dateinamensstruktur auf eigene Bedürfnisse anpassen“.
    Zum einen bekomme ich bei „docker compose down“ die Meldung, dass keine Konfiguration gefunden wurde. Habe dann die „docker-compose“ aus Deiner Installation nochmal erstellt und dann die Zeile „PAPERLESS_FILENAME_FORMAT: {created_year}/{correspondent}/{created_day}-{created_month}-{created_year} {title}“ unter „environment“ eingefügt. Wenn ich jetzt „docker compose up -d“ eingebe, bekomme ich eine Fehlermeldung, dass in der Zeile Fehler aufgetreten ist (yaml: line 51: did not find expected key).

      1. Moin Lucas,
        Danke, jetzt hats funktioniert. Irgendwie sehe ich aber keine Veränderung im gui. Sollten da jetzt nicht irgendwo die neu angeleten Kfassifikationen zu sehen sein? Sorry, wenn ich hier dumme Fragen stelle, Paperless ist Neuland für mich.

        1. Hallo Tom,

          mit der Variabel setzt du ledig fest, wie künftige Dokumente benannt werden sollen. Zusätzlich definierst du eine neue Ordnerstruktur, in der die Dateien auf der dem Docker Host abgelegt werden sollen.
          Wenn du bestehende Dokumente und Ordner umbenennen möchtest, musst du den nachfolgenden Punkt zusätzlich umsetzen.
          Sonst wird die Änderungen nur für künftige Dokumente angewendet, nicht für bestehende.

          1. Hallo Lucas,
            den Befehl docker compose -f /home/paperless/docker-compose.yml exec -T webserver document_renamer habe ich auch verwendet. Ich hatte gedacht, dass dann irgendwas auf dem gui zu sehen ist. Jetzt habe ich rausgefunden, dass bei den Dokumenten unter Metadaten aus:
            Dokument.pdf
            2023/none/26-2-2023 Dokument.pdf
            wird. Ich denke das ist korrekt so?! Muss mich wohl noch ein bisschen intensiver mit Paperless beschäftigen, bis ich herausgefunden habe, wie das genau funktioniert. Jedenfalls läuft es jetzt.
            Vielen Dank!

            1. Hallo Tom,

              im Web UI wird dem Dokumentennamen lediglich das Datum hinzugefügt.
              In der Datenstruktur wird nach den Parametern, die du selbst definieren kannst, die Dokumente in der entsprechenden Struktur abgelegt.
              Dies erleichtert die Organisation, wenn z.B. Paperless auf einem Share liegt, welches ich lokal mounten möchte.
              Einige Anwender haben seit Jahren ihre Dokumente in einer Ordnerstruktur organisiert und möchten von Paperless nur die Tagfunktion oder Ähnliches nutzen.
              Ich persönlich kann es einfach nicht leiden, wenn dort ein Ordner liegt, in dem unsortiert 2800 Dokumente auf einen Abruf warten. :/ Da reißt mein innerer Monk das Hemd auf und wird grün. 😛

              1. Das kann ich verstehen 🙂
                Ich muss doch nochmal eine Frage zu meinem Beispiel stellen. Ich habe ja {correspondent} in der Dateistruktur. Der correspondent existiert aber doch erst wenn ich ihn (oder die KI) vergeben habe. Wenn ich noch keinen angelegt habe steht da ja none. Ändert paperless dann nachträglich die Dateistruktur und erzeugt einen neuen Ordner für den correspondent (ich meine auf dem Speichermedium?

                1. Hallo Tom,

                  deine vermeintliche „KI“ ist meines Wissens nach nicht in der Lage neue Korrespondenten, anzulegen.
                  Der Algorithmus sucht gezielt nach von dir definierten Worten oder Satzschnipseln. Dort gibt es mehrere Möglichkeiten. Eine KI würde aktiv lernen, wenn diese mit Inhalten gefüttert wird. Siehe ChatGPT und Konsorten.
                  Ich vermute, dass Paperless dies selbstständig erledigt, sobald das Dokument einem Korrespondenten zugeordnet wird.
                  Wie gesagt, ist nur eine Vermutung. Ich habe aktuell aufgrund meiner anstehenden Abschlussprüfungen nicht die Zeit, solche Dinge zu testen.

                  1. Hallo Lucas,
                    ich habe mich da sehr kompliziert ausgedrückt. Gemeint hatte ich ob Paperless im Dateisystem aus z.B.
                    2023/none/26-2-2023 Dokument.pdf
                    2023/correspondentXYZ/26-2-2023 Dokument.pdf
                    macht. Sprich, im Dateisystem tatsächlich erst ein Ordner none erzeugt wird, der dann in correspondentXYZ umbenannt wird?

                    Bin mir leider nicht sicher ob das verständlicher ist… 🙂

                    1. Hallo Tom,

                      ich habe das schon verstanden, allerdings kann ich dir darauf aktuell keine Antwort geben.
                      Das wirst du selber manuell prüfen müssen. Wenn du es getestet hast, gib mir doch eine Rückmeldung, dann steht das Wissen allen zur Verfügung

                    2. Hallo Lucas,
                      ich kann das bestätigen. Die Ordner werden genau so erstellt. Allerdings muß ich nochmal rausfinden, woher der tag {created_year} die Daten bekommt. Im Ordner „archive“ sind nun verschiedene Unterordner (2016-2023). Bei einigen, wurde der Ordner nicht aufgrund des iim Dokument gefundenen Datum (was ja gewünscht ist), sondern aufgrund eines Datums im Dateinamen vergeben. Das kann man bestimmt irgendwie einstellen.

  26. Noch eine Anmerkung zum docker-compose.yml. Hier wird ja die gotenberg 7.4 verwendet. Bei mir hat damit die Verarbeitung von office Dateine nicht funkioniert. Ich bekam immer folgende Fehlermeldung:
    Error while converting document to PDF: 400 Client Error: Bad Request for url: http://gotenberg:3000/forms/libreoffice/convert
    Alle Lösungversuche sind gescheitert. Letztlich funktioniert es jetzt problemlos mit gotenberg 7.8

  27. Hi Lucas,
    sorry dass ich schon wieder nachfrage, aber ich komme mit demm backup irgendwie nicht zurrecht. Habe den cron job angelegt. Im Ordner /var/mail/paperless liegen auch emails, die so aussehen, als sei da ein backup erfolgt:

    From paperless@DockerDebian.localdomain Mon Feb 27 01:00:03 2023
    Return-Path:
    X-Original-To: paperless
    Delivered-To: paperless@DockerDebian.localdomain
    Received: by DockerDebian.localdomain (Postfix, from userid 1001)
    id D025D275CE; Mon, 27 Feb 2023 01:00:02 +0000 (UTC)
    From: root@DockerDebian.localdomain (Cron Daemon)
    To: paperless@DockerDebian.localdomain
    Subject: Cron docker compose -f /home/paperless/docker-compose.yml exec -T webserver document_exporter /usr/src>
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    X-Cron-Env:
    X-Cron-Env:
    X-Cron-Env:
    X-Cron-Env:
    Message-Id:
    Date: Mon, 27 Feb 2023 01:00:02 +0000 (UTC)

    ^M 0%| | 0/28 [00:00<?, ?it/s]^M100%|██████████| 28/28 [00:00<00:00, 4279.75it/s]

    From paperless@DockerDebian.localdomain Thu Mar 2 01:00:02 2023
    Return-Path:
    X-Original-To: paperless
    Delivered-To: paperless@DockerDebian.localdomain
    Received: by DockerDebian.localdomain (Postfix, from userid 1001)
    id B3DBA275CD; Thu, 2 Mar 2023 01:00:02 +0000 (UTC)
    From: root@DockerDebian.localdomain (Cron Daemon)
    To: paperless@DockerDebian.localdomain
    Subject: Cron docker compose -f /home/paperless/docker-compose.yml exec -T webserver document_exporter /usr/src>
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    X-Cron-Env:
    X-Cron-Env:
    X-Cron-Env:
    X-Cron-Env:
    Message-Id:
    Date: Thu, 2 Mar 2023 01:00:02 +0000 (UTC)

    ^M 0%| | 0/39 [00:00<?, ?it/s]^M100%|██████████| 39/39 [00:00<00:00, 1435.12it/s]

    Leider finde ich unter /usr/scr/ kein weiteres Verzeichnis und auch keine Datei?! Muß ich die Ordner /paperless/export erst mauell anlegen?

    1. Hallo Tom,

      du solltest dich etwas durch die Docker Doku lesen.
      Mit „volumes“ kannst du Volumen und Ordner von dem Docker Host in den jeweiligen Container mounten.
      Du mountest /data/paperless/export/ in den Container auf den Pfad /usr/src/paperless/export
      daher wirst du auf dem Host bei /usr/scr/ nichts finden.

  28. Hallo Lucas,
    falls ich mit den ganzen Fragen zu sehr nerve, sag es bitte.
    Ich hatte bei der Installtion wohl den Fehler (?) gemacht nochmal eine docker-compose.yml unter /home/paperless/ anzulgen, weil ich dachte die sei dort verschwunden. Diese docker-compose habe ich mehrfach bearbeitet und dann auch aus diesem Ordner gestartet. Eben habe ich zufällig festgestellt, dass unter /data/paperless/ schon eine docker-compose.yml exisiert. Was tun, die von mir momentan benutzte hierhin kopieren? Oder ist es egal, von wo ich „docker compose up -d“ ausführe, dann würde ich die in /data/paperless/ löschen (um nicht durcheinander zu kommen). Vielleicht eine blöde Frage, aber kenn ich mit docker (noch) sehr rudimentär aus.

    1. Hallo Tom,

      es darf pro Docker Stack nur eine docker-compose.yml existieren. In deinem Fall solltest du alle Container runterfahren und anschließend die aktuellste docker-compose.yml in das /home/paperless/ verschieben. Die andere löschen bzw. überschreiben. Danach die mit docker compose up -d die Container wieder starten.

  29. Hallo Tom,
    jetzt habe ich was unüberlegtes getan. Da ich die Größe der root disk zu groß gewählt habe, habe ich mit folgenden Befehlen die Größe verkleinert.
    pct stop 122
    vzdump 122 -storage local -compress lzo
    pct destroy 122
    pct restore 122 /var/lib/vz/dump/.tar.lzo --rootfs HDD-2-1:50

    Laut Ausgabe ist dabei auch /data mit gespeichert worden. Nach dem restore wurde /data nicht gemounted, also habe iich das manuell gemacht. Leider ist meine Datenbank jetzt leer!
    Ich nehme an, ich muss beim pct restore angeben, dass /data wieder mit erstellt wird?! Ich weiß leider nicht wie. KLannst Du mir nochmal einen Tipp geben?!

      1. Hallo Lucas,
        Danke für Deine Antwort. Ich habe das ganze nun doch hinbekommen.
        Ich habe jetzt die „conf“ Datei den Containers auf die neue Größe der rootfs angepasst, dann ein Backup des Containers, kill & restore. So hat es funktioniert. Geht wahrscheinlich auch einfacher und eleganter, aber dafür fehlte der mir die Sachkenntnis.

  30. Hallo Lucas und community,
    habe bisher eine paperless Instanz auf einer Synology laufen und dort schon einiges an Dokumenten, tags und Korrespondenten abgelegt, möchte jetzt aber auf das hier beschriebene setup wechseln (neuer server).

    Dank der tollen Anleitung läuft paperless soweit, da die Ordner für die db und die Dokumente etc im neuen setup teilweise anders heissen war meine Idee den Inhalt „händisch“ per sftp von der alten Instanz abzuziehen und per sftp (filezilla) über den root access der auf der Konsole wunderbar funktioniert einzuspielen.
    Per sftp bekomme ich mit dem root jedoch einen Zugriffsfehler, über den paperless oder normalen user kann ich per sftp nicht auf den db ordner etc zugreifen.
    Wo ist mein Denkfehler bzgl sftp und root?
    Wie bekomme ich mein setup und die Daten aus der alten Instanz auf die neue?
    Hat jemand einen Vorschlag?!
    Daaanke!

    1. Hallo Volkmar,

      zunächst solltest du im Beitrag dir den Anschnitt mit dem Backup und Restore anschauen, danach liest du dir diesen Beitrag durch.
      Anschließend führst du das Backup der Paperless Daten auf deiner alten Instanz durch, zusätzlich führst du ein Backup der Datenbank durch. Abschließend verschiebst du die Daten auf deine neue Instanz, startest den Restore der Paperless Daten, danach den Restore der Datenbank.

      1. Herzlichen Dank, ich habs in der Zwischenzeit über das paperless backup and restore hinbekommen, das backup der DB habe ich nicht gemacht, sieht momentan nicht so aus wie wenn etwas fehlen würde 🙂

  31. Hallo,
    vielen Dank für die echt gute Anleitung. Bei mir funktioniert eigentlich alles (Scanner usw.) aber leider komme ich nicht auf die abgelegten Daten übers Netzwerk. Mein Scanner kann in den Consume Ordner etwas legen und es funktioniert. Ich komme über meinen Mac via ftp leider nicht dahin. Wo könnte der Fehler sein?
    hier mein Befehlt: ftp://paperless@Paperless
    Login funktioniert aber es liegt nur eine Datei von docker-compose darin. Ich komme nicht auf das Laufwerk /Data.

    1. Hallo Christian,

      du hast keine Permissions für den /data Ordner. Im Beitrag legen wir ledig fest, dass der Ordner /data/paperless Paperless gehört.
      Nicht aber der /data.
      Wenn du auf deinem Mac auf das SMB Share zugreifen möchtest, musste du dies erst mounten und danach Dateien dort ablegen.

  32. Hallo, zunächst mal danke für die Anleitung. Ich glaube, dass soweit alles läuft.
    Was ich aber nicht verstehe, wie paperless das mit den Dateien machen.

    In der Anleitung kann man ja die „Ordner-Struktur“ so anpassen, wie man möchte.

    Aber wo speichert paperless diese und wie komme ich da z. .B. über eine Windows-Freigabe drauf?

    Und zum Dokumenten-Hochladen nehme ich den „consume“-Ordner, der wie in der Anleitung als SMB-Freigabe unter Windows gemacht wurde?!

    1. Hallo Martin,

      paperless legt die Dateien intern auf dem vorher definierten Mountpoint ab. Die Ordnerstruktur legt ledig fest, in was für einer Struktur/Hierarchie auf dem Mountpoint die Daten abgelegt werden.
      Auf den Mountpoint kommst du ohne weitere Einstellungen nur über SFTP oder per SSH. Es ist aber auch nicht vorgesehen, dass du auf die Daten zugreifst. Lediglich über das Frontend sollen die Daten bearbeitet oder gesichtet werden.
      Genau das ist richtig so weit.

Nach oben scrollen