Der neue Paperless-NGX v1.8.0 Server

Ich habe nun etliche Tage damit verbracht die für mich in Betracht kommenden Dokumenten Management Systeme zu betrachten, testen, bewerten und auf Herz und Nieren zu prüfen. Der Gedanke ein DMS zu nutzen ist also nun ausreichend genährt und es geht an das Aufsetzen des DMS. In meinem Falle also Paperless-NGX in der aktuell als „latest“ deklarierten Version 1.8.0 auf GitHub – also die Version vom 29 Juli 2022. Sicherlich könnte ich jetzt von einige Tage warten auf den gerade im Stadium Beta3 befindlichen Release Candidat v1.9.0. Doch mit dieser Denke kann man immer fröhlich Warten und verpaßt den ganzen Update-Spaß. 😉

Wie möchte das Frame-Work am Ende haben war eine in den Tests immer wieder hoch kommende Frage und ich denke für mich eine Lösung gefunden zu haben, die wie folgt aussieht.

Framework meines Paperless-NGX Servers

Doch Moment, bevor wir damit Anfangen ziehen wir erst einmal das Server OS zurecht und bauen uns die Plattform auf. Ich selber mag es an den Files und dem System herum zu Basteln und zu Schrauben. Ist sicherlich nicht jedermanns Sache, wer eher einen Ansible oder anders gearteten Aufbaupfad sehen möchte, wir hier leider enttäuscht.

Werfen wir einen Blick auf Hardware dieses all ways on Servers. Es handelt sich dabei um eine möglichst sparsam gewählte Plattform, gerade mit Fokus auf den Energie-Fußabdruck. Ich erwarte jetzt keine Weltrekorde beim Bitcoin-Crunshen, sondern eine solide, leise und vor allem sparsame Plattform.

Hardwareplattform

Beim Betriebssystem habe ich mich auch für die konservative Linie entschieden und bin für den Paperless-NGX Server, entgegen meiner sonstigen Gewohnheit für Linux Arch, zum Ubuntu Server 22.04lts geschwenkt. Der Server soll ja über einen langen Zeitraum seinen Dienst verrichten und da habe ich dann keine Lust die auf dem Desktop alle Monate übliche Debugging-Session durch zu ziehen, nur weil mal wieder eine Config oder sonst irgend etwas aus der Kurve geflogen ist. Es soll also rock-solid und ohne große Schnörkel werden.

HDD/NVME-Setup

Ich hab bei den DMS-Tests festgestellt, dass es sich positiv bemerkbar macht, wenn die Datenbanken, die Tools und das ganze Webgerassel schnell ausgeliefert. Bei dem Filearchiv war da kein großer Unterschied in der „Fluptizität“ zu spüren. Aus diesem Grunde werde ich die Files und alles was damit zusammenhängt auf der großen langsamen HDD speichern und die ganzen kleinteiligen Dinge auf der NVME. Ich denke ich werde keine B-Tree Filesystem benötigen, da ich aus derzeitiger Sicht keine Snapshots ziehen werde. Bei den DMS-Tests wurde auch kein Filesystem mit erweiterter Filesystem-Rechtestruktur genutzt, also werde ich mit XFS auch verkneifen und alles mit EXT4 aufsetzen.

Nach dem initialen Setup von Ubuntu 22.04lts Server stellt sich das Root-Filesystem wie folgt dar.

Die HDD ist noch nicht gemountet und hängt in der Luft. Ich werde dieser zuerst einmal eine Partitontabling nach GPT verpassen und anschließend eine EXT4 Partition (mit STORAGE als Name) mit einer logischen Blocksize von 4096 Bytes anlegen.
eric@bammbamm:~$ sudo parted /dev/sda mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes

eric@bammbamm:~$ sudo parted -a optimal /dev/sda mkpart primary ext4 0% 100%
Information: You may need to update /etc/fstab.

eric@bammbamm:~$ sudo mkfs.ext4 -b 4096 -L STORAGE /dev/sda1
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 244190208 4k blocks and 61054976 inodes
Filesystem UUID: 12beb674-c713-41e5-9802-1a7092075492
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000, 214990848

Allocating group tables:    0/7453
done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done     

eric@bammbamm:~$ lsblk -f /dev/sda
NAME   FSTYPE FSVER LABEL   UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda                                                                             
└─sda1 ext4   1.0   STORAGE 12beb674-c713-41e5-9802-1a7092075492                
eric@bammbamm:~$
   

Die Partion ist angelegt. Um diese auch nutzen zu können müssen fehlt mir noch ein schöner Mountpoint und der passende Eintrag in der /etc/fstab, um sie auch automatisch nach dem nächsten Booten wieder eingebunden zu haben. Ich lege mir den Mountpoint storage in das Verzeichnis /mnt als /mnt/storage und binde ihn in der FSTAB per UUID ein. Das erscheint mir persönlich sinnvoll und robust. Nach dem Anlegen und Eintragen werde ich rebooten und sehen, ob er alles artig anzieht… also ich keinen Bock geschossen habe. 🙂

eric@bammbamm:~$ sudo mkdir /mnt/storage

eric@bammbamm:~$ lsblk -f /dev/sda1
NAME FSTYPE FSVER LABEL   UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda1 ext4   1.0   STORAGE 12beb674-c713-41e5-9802-1a7092075492       
       
eric@bammbamm:~$ sudo nano /etc/fstab

eric@bammbamm:~$ more /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> 						<mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/nvme0n1p2 during curtin installation
/dev/disk/by-uuid/01722866-3e02-4014-ab3a-d456639a9e41 		/ 		ext4 	defaults 	0 	1

# /boot/efi was on /dev/nvme0n1p1 during curtin installation
/dev/disk/by-uuid/2844-66F9 					/boot/efi 	vfat 	defaults 	0 	1
/swap.img							none		swap	sw		0	0

# /mnt/storage hand made in germany
/dev/disk/by-uuid/12beb674-c713-41e5-9802-1a7092075492		/mnt/storage	ext4	defaults	0	1

eric@bammbamm:~$ sudo reboot

Mal sehen, ob er die EXT4 Partionen auch alle sauber angezogen hat…

eric@bammbamm:~$ lsblk -f | grep -E "NAME|ext4"
NAME        FSTYPE   FSVER LABEL   UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
└─sda1      ext4     1.0   STORAGE 12beb674-c713-41e5-9802-1a7092075492  869,2G     0% /mnt/storage
└─nvme0n1p2 ext4     1.0           01722866-3e02-4014-ab3a-d456639a9e41  208,8G     3% /
eric@bammbamm:~$ 

Einige magische BASH Zeilen später steht das gewünschte Setup, wie im folgenden Bild dargestellt.

User anlegen

Aus den vorherigen Paperless-NGX Installationen weiß ich, daß ein User mit der Gruppe paperless benötigt wird. Für diesen User paperless lege ich mal ein Home-Verzeichnis an, zugegeben an einem ungewöhnlichen Ort – nämlich /opt/paperless-ngx. Da der User paperless selber nur ein maschinen User ist, stellt das für mich kein Beinbruch dar.

eric@bammbamm:~$ sudo adduser paperless --system --home /opt/paperless-ngx --group
[sudo] password for eric: 
Adding system user `paperless' (UID 113) ...
Adding new group `paperless' (GID 118) ...
Adding new user `paperless' (UID 113) with group `paperless' ...
Creating home directory `/opt/paperless-ngx' ...

eric@bammbamm:~$ ls -la /opt/
total 12
drwxr-xr-x  3 root      root      4096 Sep 26 13:45 .
drwxr-xr-x 19 root      root      4096 Sep 26 08:32 ..
drwxr-x---  2 paperless paperless 4096 Sep 26 13:45 paperless-ngx

eric@bammbamm:~$ ls -la /opt/paperless-ngx/
ls: cannot open directory '/opt/paperless-ngx/': Permission denied

eric@bammbamm:~$ sudo ls -la /opt/paperless-ngx/
total 8
drwxr-x--- 2 paperless paperless 4096 Sep 26 13:45 .
drwxr-xr-x 3 root      root      4096 Sep 26 13:45 ..
eric@bammbamm:~$ 

Die Rechte stimmen auch, nur user paperless oder halt root können in sein Home-Verzeichnis luschern. Na dann werden dir mal die Tool Dependencies installieren.

Installieren der Tool Dependencies

Die Dependencies sind in der Anleitung an zwei stellen angegeben mit etwas Text dazwischen. Mir persönlich reicht es aus, daß ich die einfach installiere.

eric@bammbamm:~$ sudo apt update


eric@bammbamm:~$ sudo apt upgrade
<snip>

eric@bammbamm:~$ sudo apt install python3 python3-pip python3-dev imagemagick fonts-liberation gnupg libpq-dev libmagic-dev mime-support libzbar0 poppler-utils unpaper ghostscript icc-profiles-free qpdf liblept5 libxml2 pngquant zlib1g tesseract-ocr tesseract-ocr-deu tesseract-ocr-eng optipng
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
<snip>

eric@bammbamm:~$ sudo reboot

Installieren von Redis

Das Setup von paperless-NGX benötigt zwingend den Key-Value Store Redis. diesen werde ich jetzt ohne weitere Sicherungsmechanismen installieren. Wenn ich die GitHUB Pull-Requests richtig deute, sind die super fleissigen Coder da allerdings schon dran, um das ggf. in späteren Versionen zu härten.

eric@bammbamm:~$ sudo apt install redis-server
[sudo] password for eric: 
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
<snip>

eric@bammbamm:~$ redis-server -v
Redis server v=6.0.16 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=a3fdef44459b3ad6

eric@bammbamm:~$ sudo systemctl start redis-server
eric@bammbamm:~$ sudo systemctl enable redis-server
Synchronizing state of redis-server.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable redis-server

eric@bammbamm:~$ redis-cli ping
PONG

eric@bammbamm:~$ sudo systemctl status redis-server
● redis-server.service - Advanced key-value store
     Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-09-26 14:01:18 UTC; 52s ago
       Docs: http://redis.io/documentation,
             man:redis-server(1)
   Main PID: 1360 (redis-server)
     Status: "Ready to accept connections"
      Tasks: 5 (limit: 18326)
     Memory: 2.6M
        CPU: 273ms
     CGroup: /system.slice/redis-server.service
             └─1360 "/usr/bin/redis-server 127.0.0.1:6379" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >

Sep 26 14:01:18 bammbamm systemd[1]: Starting Advanced key-value store...
Sep 26 14:01:18 bammbamm systemd[1]: Started Advanced key-value store.
eric@bammbamm:~$ 

Super, der Redis läuft und antwortet auch.

Installieren und Einrichten von PostgreSQL

Was ich im GitHUB gesehen habe bei Version 1.8.0 stimmt mich zuversichtlich, daß ich anstelle von SQLite3 endlich PostgreSQL nutzen kann. Also werde ich dann mal installieren und einrichten.

eric@bammbamm:~$ sudo apt install postgresql
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
<snip>

eric@bammbamm:~$ sudo systemctl start postgresql

eric@bammbamm:~$ sudo systemctl enable postgresql
Synchronizing state of postgresql.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable postgresql

eric@bammbamm:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-09-26 14:05:40 UTC; 35s ago
   Main PID: 3717 (code=exited, status=0/SUCCESS)
        CPU: 2ms

Sep 26 14:05:40 bammbamm systemd[1]: Starting PostgreSQL RDBMS...
Sep 26 14:05:40 bammbamm systemd[1]: Finished PostgreSQL RDBMS

eric@bammbamm:~$ sudo -u postgres psql
could not change directory to "/home/eric": Permission denied
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
Type "help" for help.

postgres=# CREATE DATABASE paperless;
CREATE DATABASE
postgres=# CREATE USER paperless WITH PASSWORD 'super sicher';
CREATE ROLE
postgres=# GRANT ALL PRIVILEGES ON DATABASE paperless TO paperless;
GRANT
postgres=# \q

eric@bammbamm:~$ psql --username paperless --password --host localhost paperless   
Password: 'super sicher'
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

paperless=> \conninfo
You are connected to database "paperless" as user "paperless" on host "localhost" (address "127.0.0.1") at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)

paperless=> \q
eric@bammbamm:~$ 

Okay, die Datenbank paperless für den User paperless ist angelegt, läuft und antwortet.

Installieren und Einrichten von Paperless-NGX v1.8.0

Kommen wir zur eigentlichen Aufgabe der Server Installation, das Paperless-NGX Paket wartet schon. 🙂 Okay, dann gehen wir mal als ROOT in das Home-Verzeichnis von User paperless /opt/paperless-ngx und installieren mal etwas…

eric@bammbamm:~$ sudo -i
[sudo] password for eric: 'super super geheim'

root@bammbamm:~# cd /opt/paperless-ngx/

root@bammbamm:/opt/paperless-ngx# wget https://github.com/paperless-ngx/paperless-ngx/releases/download/v1.8.0/paperless-ngx-v1.8.0.tar.xz
--2022-09-26 14:30:50--  https://github.com/paperless-ngx/paperless-ngx/releases/download/v1.8.0/paperless-ngx-v1.8.0.tar.xz
Resolving github.com (github.com)... 140.82.121.3
Connecting to github.com (github.com)|140.82.121.3|:443... connected.
<snip>
paperless-ngx-v1.8.0.tar.xz             100%[==============================================================================>]  21,44M  22,6MB/s    in 0,9s    

2022-09-26 14:30:51 (22,6 MB/s) - ‘paperless-ngx-v1.8.0.tar.xz’ saved [22482684/22482684]#


root@bammbamm:/opt/paperless-ngx# tar -xvf paperless-ngx-v1.8.0.tar.xz -C /opt


root@bammbamm:/opt/paperless-ngx# ls -la
total 22212
drwxr-xr-x  8 1001 postgres     4096 Jul 28 23:33 .
drwxr-xr-x  3 root root         4096 Sep 26 13:45 ..
drwxr-xr-x  3 1001 postgres     4096 Jul 28 23:33 data
drwxr-xr-x  3 1001 postgres     4096 Jul 28 23:33 docker
-rw-r--r--  1 1001 postgres     7458 Jul 28 23:33 Dockerfile
-rw-r--r--  1 1001 postgres      220 Jul 28 23:33 .dockerignore
drwxr-xr-x  5 1001 postgres     4096 Jul 28 23:33 docs
-rw-r--r--  1 1001 postgres       72 Jul 28 23:33 .env
-rw-r--r--  1 1001 postgres     1108 Jul 28 23:33 gunicorn.conf.py
-rw-r--r--  1 1001 postgres    35142 Jul 28 23:33 LICENSE
-rw-r--r--  1 1001 postgres     2559 Jul 28 23:33 paperless.conf
-rw-r--r--  1 root root     22482684 Jul 28 23:34 paperless-ngx-v1.8.0.tar.xz
-rw-r--r--  1 1001 postgres     1659 Jul 28 23:33 Pipfile
-rw-r--r--  1 1001 postgres   145133 Jul 28 23:33 Pipfile.lock
-rw-r--r--  1 1001 postgres     8812 Jul 28 23:33 README.md
-rw-r--r--  1 1001 postgres     3972 Jul 28 23:33 requirements.txt
drwxr-xr-x  2 1001 postgres     4096 Jul 28 23:33 scripts
drwxr-xr-x 10 1001 postgres     4096 Jul 28 23:33 src
drwxr-xr-x  7 1001 postgres     4096 Jul 28 23:33 static

Und da ist das Paket auch schon gelandet im Home Verzeichnis von paperless. Was allerdings ziemlich schräg ist sind die Eingentümer und Gruppen Rechte. Das müssen wir glatt ziehen, sonst fliegt uns das alles aus der Kurve.

root@bammbamm:/opt/paperless-ngx# chown paperless:paperless -Rfv /opt/paperless-ngx
<snip>
changed ownership of '/opt/paperless-ngx/docs' from 1001:postgres to paperless:paperless
changed ownership of '/opt/paperless-ngx' from 1001:postgres to paperless:paperless

root@bammbamm:/opt/paperless-ngx# ls -la
total 22212
drwxr-xr-x  8 paperless paperless     4096 Jul 28 23:33 .
drwxr-xr-x  3 root      root          4096 Sep 26 13:45 ..
drwxr-xr-x  3 paperless paperless     4096 Jul 28 23:33 data
drwxr-xr-x  3 paperless paperless     4096 Jul 28 23:33 docker
-rw-r--r--  1 paperless paperless     7458 Jul 28 23:33 Dockerfile
-rw-r--r--  1 paperless paperless      220 Jul 28 23:33 .dockerignore
drwxr-xr-x  5 paperless paperless     4096 Jul 28 23:33 docs
-rw-r--r--  1 paperless paperless       72 Jul 28 23:33 .env
-rw-r--r--  1 paperless paperless     1108 Jul 28 23:33 gunicorn.conf.py
-rw-r--r--  1 paperless paperless    35142 Jul 28 23:33 LICENSE
-rw-r--r--  1 paperless paperless     2559 Jul 28 23:33 paperless.conf
-rw-r--r--  1 paperless paperless 22482684 Jul 28 23:34 paperless-ngx-v1.8.0.tar.xz
-rw-r--r--  1 paperless paperless     1659 Jul 28 23:33 Pipfile
-rw-r--r--  1 paperless paperless   145133 Jul 28 23:33 Pipfile.lock
-rw-r--r--  1 paperless paperless     8812 Jul 28 23:33 README.md
-rw-r--r--  1 paperless paperless     3972 Jul 28 23:33 requirements.txt
drwxr-xr-x  2 paperless paperless     4096 Jul 28 23:33 scripts
drwxr-xr-x 10 paperless paperless     4096 Jul 28 23:33 src
drwxr-xr-x  7 paperless paperless     4096 Jul 28 23:33 static
root@bammbamm:/opt/paperless-ngx# 

So sieht das gleich viel besser aus. Jetzt fehlen uns noch die im Anschluß zu konfigurierenden Verzeichnisse consume + data + trash + media. Hier mache ich es jetzt wie folgt. Ich lege diese von Paperless-NGX benötigten Verzeichnisse unter /mnt/storage an und mache mir Symlinks in das Homeverzeichnis von paperless, dann sieht das in der Konfig schön sauber aus und die Daten liegen trotzdem auf unterschiedlichen Speichermedien. Ich denke mir das so, wie in der folgenden Darstellung.

Symbolic Links

Zeit ein paar Verzeichnisse anzulegen, die Symbolic Links zu setzen und die Rechte glatt zu ziehen. Wobei ich zwischendurch noch die bereits aus dem Paket gehüpften Verzeichnisse data/ und data/log/ löschen werde, sonst wird das nix mit den SymLinks. 😉

root@bammbamm:/opt/paperless-ngx# mkdir /mnt/storage/data
root@bammbamm:/opt/paperless-ngx# mkdir /mnt/storage/data/log
root@bammbamm:/opt/paperless-ngx# mkdir /mnt/storage/media
root@bammbamm:/opt/paperless-ngx# mkdir /mnt/storage/consume
root@bammbamm:/opt/paperless-ngx# mkdir /mnt/storage/trash

root@bammbamm:/opt/paperless-ngx# rm -Rfv data
removed directory 'data/log'
removed directory 'data'

root@bammbamm:/opt/paperless-ngx# ln -s /mnt/storage/data/ /opt/paperless-ngx
root@bammbamm:/opt/paperless-ngx# ln -s /mnt/storage/media /opt/paperless-ngx
root@bammbamm:/opt/paperless-ngx# ln -s /mnt/storage/trash /opt/paperless-ngx
root@bammbamm:/opt/paperless-ngx# ln -s /mnt/storage/consume /opt/paperless-ngx

root@bammbamm:/opt/paperless-ngx# ls -la
total 22208
drwxr-xr-x  7 paperless paperless     4096 Sep 26 15:02 .
drwxr-xr-x  3 root      root          4096 Sep 26 13:45 ..
lrwxrwxrwx  1 root      root            20 Sep 26 15:02 consume -> /mnt/storage/consume
lrwxrwxrwx  1 root      root            18 Sep 26 15:01 data -> /mnt/storage/data/
<snip>
lrwxrwxrwx  1 root      root            18 Sep 26 15:01 media -> /mnt/storage/media
<snip>
lrwxrwxrwx  1 root      root            18 Sep 26 15:01 trash -> /mnt/storage/trash


root@bammbamm:/opt/paperless-ngx# chown paperless:paperless -Rfv /opt/paperless-ngx
ownership of '/opt/paperless-ngx/static' retained as paperless:paperless
changed ownership of '/opt/paperless-ngx/consume' from root:root to paperless:paperless
<snip>

root@bammbamm:/opt/paperless-ngx# ls -la
total 22208
drwxr-xr-x  7 paperless paperless     4096 Sep 26 15:02 .
drwxr-xr-x  3 root      root          4096 Sep 26 13:45 ..
lrwxrwxrwx  1 paperless paperless       20 Sep 26 15:02 consume -> /mnt/storage/consume
lrwxrwxrwx  1 paperless paperless       18 Sep 26 15:01 data -> /mnt/storage/data/
<snip>
lrwxrwxrwx  1 paperless paperless       18 Sep 26 15:01 media -> /mnt/storage/media
<snip>
lrwxrwxrwx  1 paperless paperless       18 Sep 26 15:01 trash -> /mnt/storage/trash
root@bammbamm:/opt/paperless-ngx#

root@bammbamm:~# chown paperless:paperless /opt/paperless-ngx/data/log

root@bammbamm:~# ls -la /opt/paperless-ngx/data/
total 12
drwxr-xr-x 3 root      root      4096 Sep 26 15:10 .
drwxr-xr-x 7 root      root      4096 Sep 26 14:53 ..
drwxr-xr-x 2 paperless paperless 4096 Sep 26 14:53 log

root@bammbamm:/opt/paperless-ngx# sudo chmod 777 -Rfv /mnt/storage/*



Damit sind die Verzeichnisse sauber anglegt und verlinkt. Es ist an der Zeit sich der Konfiguration von Paperless-NGX zuzuwenden. Um sicher zu gehen, daß ich im Zweifelsfalle eine orginal Konfingtemplate habe, mache ich davon aber zu erst ein Backup.

root@bammbamm:/opt/paperless-ngx# cp paperless.conf paperless.conf.org

root@bammbamm:/opt/paperless-ngx# nano paperless.conf

root@bammbamm:/opt/paperless-ngx# more paperless.conf
#PAPERLESS_DEBUG=false
# Required services

PAPERLESS_REDIS=redis://localhost:6379
PAPERLESS_DBHOST=localhost
PAPERLESS_DBPORT=5432
PAPERLESS_DBNAME=paperless
PAPERLESS_DBUSER=paperless
PAPERLESS_DBPASS='super sicher'
PAPERLESS_DBSSLMODE=prefer

# Paths and folders
PAPERLESS_CONSUMPTION_DIR=/opt/paperless-ngx/consume
PAPERLESS_DATA_DIR=/opt/paperless-ngx/data
PAPERLESS_TRASH_DIR=/opt/paperless-ngx/trash
PAPERLESS_MEDIA_ROOT=/opt/paperless-ngx/media
PAPERLESS_STATICDIR=/opt/paperless-ngx/static
#PAPERLESS_FILENAME_FORMAT=
#PAPERLESS_FILENAME_FORMAT_REMOVE_NONE=

# Security and hosting
PAPERLESS_SECRET_KEY='noch viel viel geheimer'
#PAPERLESS_URL=https://example.com
#PAPERLESS_CSRF_TRUSTED_ORIGINS=https://example.com # can be set using PAPERLESS_URL
#PAPERLESS_ALLOWED_HOSTS=example.com,www.example.com # can be set using PAPERLESS_URL
#PAPERLESS_CORS_ALLOWED_HOSTS=https://localhost:8080,https://example.com # can be set using PAPERLESS_URL
#PAPERLESS_FORCE_SCRIPT_NAME=
#PAPERLESS_STATIC_URL=/static/
#PAPERLESS_AUTO_LOGIN_USERNAME=
#PAPERLESS_COOKIE_PREFIX=
#PAPERLESS_ENABLE_HTTP_REMOTE_USER=false

# OCR settings
PAPERLESS_OCR_LANGUAGE=deu+eng
PAPERLESS_OCR_MODE=skip
PAPERLESS_OCR_OUTPUT_TYPE=pdfa
PAPERLESS_OCR_PAGES=0
#PAPERLESS_OCR_IMAGE_DPI=300
PAPERLESS_OCR_CLEAN=clean
PAPERLESS_OCR_DESKEW=true
PAPERLESS_OCR_ROTATE_PAGES=true
PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD=12.0
#PAPERLESS_OCR_USER_ARGS={}
PAPERLESS_CONVERT_MEMORY_LIMIT=0
PAPERLESS_CONVERT_TMPDIR=/var/tmp/paperless

# Software tweaks
PAPERLESS_TASK_WORKERS=2
PAPERLESS_THREADS_PER_WORKER=2
PAPERLESS_TIME_ZONE=Europe/Berlin
#PAPERLESS_CONSUMER_POLLING=10
PAPERLESS_CONSUMER_DELETE_DUPLICATES=false
PAPERLESS_CONSUMER_RECURSIVE=false
PAPERLESS_CONSUMER_IGNORE_PATTERNS=[".DS_STORE/*", "._*", ".stfolder/*", ".stversions/*", ".localized/*", "desktop.ini"]
PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS=false
PAPERLESS_CONSUMER_ENABLE_BARCODES=false
PAPERLESS_CONSUMER_ENABLE_BARCODES=PATCHT
#PAPERLESS_PRE_CONSUME_SCRIPT=/path/to/an/arbitrary/script.sh
#PAPERLESS_POST_CONSUME_SCRIPT=/path/to/an/arbitrary/script.sh
PAPERLESS_FILENAME_DATE_ORDER=YMD# Tika settings
PAPERLESS_TIKA_ENABLED=false
#PAPERLESS_TIKA_ENDPOINT=http://localhost:9998
#PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http://localhost:3000

# Binaries
PAPERLESS_CONVERT_BINARY=/usr/bin/convert
PAPERLESS_GS_BINARY=/usr/bin/gs
PAPERLESS_OPTIPNG_BINARY=/usr/bin/optipng

#PAPERLESS_FILENAME_PARSE_TRANSFORMS=[]
#PAPERLESS_THUMBNAIL_FONT_NAME=
#PAPERLESS_IGNORE_DATES=
#PAPERLESS_ENABLE_UPDATE_CHECK=


Das sollte zum Initialisieren fürs erste reichen. Dann werden wir mal die Paperless-NGX Rakete auf die Rampe schieben und ihre Requirements installieren. Damit wir so langsam aber sicher Startklar kriegen.

root@bammbamm:/opt/paperless-ngx# sudo -Hu paperless pip3 install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable
<snip>
Successfully installed pip-22.2.2


root@bammbamm:/opt/paperless-ngx# sudo -Hu paperless pip3 install -r requirements.txt
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.python.org/simple, https://www.piwheels.org/simple
Ignoring backports.zoneinfo: markers 'python_version < "3.9"' don't match your environment
Obtaining django-q from git+https://github.com/paperless-ngx/django-q.git@bf20d57f859a7d872d5979cd8879fac9c9df981c#egg=django-q (from -r requirements.txt (line 32))
<snip>
Successfully installed aioredis-1.3.1 anyio-3.6.1 arrow-1.2.2 asgiref-3.5.2 async-timeout-4.0.2 attrs-21.4.0 autobahn-22.6.1 blessed-1.19.1 certifi-2022.6.15 cffi-1.15.1 channels-3.0.5 channels-redis-3.4.1 charset-normalizer-2.1.0 click-8.1.3 coloredlogs-15.0.1 concurrent-log-handler-0.9.20 cryptography-37.0.4 daphne-3.0.2 dateparser-1.1.1 deprecated-1.2.13 deprecation-2.1.0 django-4.0.6 django-cors-headers-3.13.0 django-extensions-3.2.0 django-filter-22.1 django-picklefield-3.1 django-q-1.3.9 djangorestframework-3.13.1 filelock-3.7.1 fuzzywuzzy-0.18.0 gunicorn-20.1.0 h11-0.13.0 hiredis-2.0.0 httptools-0.4.0 humanfriendly-10.0 imap-tools-0.56.0 img2pdf-0.4.4 inotify-simple-1.3.5 inotifyrecursive-0.3.5 joblib-1.1.0 langdetect-1.0.9 lxml-4.9.1 msgpack-1.0.4 numpy-1.23.1 ocrmypdf-13.6.1 packaging-21.3 pathvalidate-2.5.0 pdf2image-1.16.0 pdfminer.six-20220524 pikepdf-5.4.0 pillow-9.2.0 pluggy-1.0.0 portalocker-2.5.1 psycopg2-2.9.3 pyasn1-modules-0.2.8 pycparser-2.21 pyopenssl-22.0.0 pyparsing-3.0.9 python-dateutil-2.8.2 python-dotenv-0.20.0 python-gnupg-0.4.9 python-levenshtein-0.12.2 python-magic-0.4.27 pytz-deprecation-shim-0.1.0.post0 pyyaml-6.0 pyzbar-0.1.9 redis-4.3.4 regex-2022.3.2 reportlab-3.6.11 requests-2.28.1 scikit-learn-1.1.1 scipy-1.8.1 service-identity-21.1.0 setuptools-63.2.0 sniffio-1.2.0 sqlparse-0.4.2 threadpoolctl-3.1.0 tika-1.24 tqdm-4.64.0 twisted-22.4.0 txaio-22.2.1 typing-extensions-4.3.0 tzdata-2022.1 tzlocal-4.2 urllib3-1.26.10 uvicorn-0.18.2 uvloop-0.16.0 watchdog-2.1.9 watchfiles-0.16.0 wcwidth-0.2.5 websockets-10.3 whitenoise-6.2.0 whoosh-2.7.4 wrapt-1.14.1
root@bammbamm:/opt/paperless-ngx# 

Bei einer Rakete wären wir jetzt quasi ready for ignition. Dann werde ich jetzt mal das startenden manage.py mit den Optionen migrate, createsuperuser und runserver nacheinander ausführen und gucken, ob die Rakete bockt oder startet.

root@bammbamm:/opt/paperless-ngx# cd src/
root@bammbamm:/opt/paperless-ngx/src# ls -la
total 48
drwxr-xr-x 10 paperless paperless 4096 Jul 28 23:33 .
drwxr-xr-x  9 paperless paperless 4096 Sep 26 15:27 ..
<snip>
-rw-r--r--  1 paperless paperless  254 Jul 28 23:33 manage.py
<snip>

root@bammbamm:/opt/paperless-ngx/src# sudo -Hu paperless python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, authtoken, contenttypes, django_q, documents, paperless_mail, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying authtoken.0001_initial... OK
  Applying authtoken.0002_auto_20160226_1747... OK
  Applying authtoken.0003_tokenproxy... OK
  Applying django_q.0001_initial... OK
  Applying django_q.0002_auto_20150630_1624... OK
  Applying django_q.0003_auto_20150708_1326... OK
  Applying django_q.0004_auto_20150710_1043... OK
  Applying django_q.0005_auto_20150718_1506... OK
  Applying django_q.0006_auto_20150805_1817... OK
  Applying django_q.0007_ormq... OK
  Applying django_q.0008_auto_20160224_1026... OK
  Applying django_q.0009_auto_20171009_0915... OK
  Applying django_q.0010_auto_20200610_0856... OK
  Applying django_q.0011_auto_20200628_1055... OK
  Applying django_q.0012_auto_20200702_1608... OK
  Applying django_q.0013_task_attempt_count... OK
  Applying django_q.0014_schedule_cluster... OK
  Applying documents.0001_initial... OK
  Applying documents.0002_auto_20151226_1316... OK
  Applying documents.0003_sender... OK
  Applying documents.0004_auto_20160114_1844... OK
  Applying documents.0005_auto_20160123_0313... OK
  Applying documents.0006_auto_20160123_0430... OK
  Applying documents.0007_auto_20160126_2114... OK
  Applying documents.0008_document_file_type... OK
  Applying documents.0009_auto_20160214_0040... OK
  Applying documents.0010_log... OK
  Applying documents.0011_auto_20160303_1929... OK
  Applying documents.0012_auto_20160305_0040... OK
  Applying documents.0013_auto_20160325_2111... OK
  Applying documents.0014_document_checksum... OK
  Applying documents.0015_add_insensitive_to_match... OK
  Applying documents.0016_auto_20170325_1558... OK
  Applying documents.0017_auto_20170512_0507... OK
  Applying documents.0018_auto_20170715_1712... OK
  Applying documents.0019_add_consumer_user... OK
  Applying documents.0020_document_added... OK
  Applying documents.0021_document_storage_type... OK
  Applying documents.0022_auto_20181007_1420... OK
  Applying documents.0023_document_current_filename... OK
  Applying documents.1000_update_paperless_all... OK
  Applying documents.1001_auto_20201109_1636... OK
  Applying documents.1002_auto_20201111_1105... OK
  Applying documents.1003_mime_types... OK
  Applying documents.1004_sanity_check_schedule... OK
  Applying documents.1005_checksums... OK
  Applying documents.1006_auto_20201208_2209... OK
  Applying documents.1007_savedview_savedviewfilterrule... OK
  Applying documents.1008_auto_20201216_1736... OK
  Applying documents.1009_auto_20201216_2005... OK
  Applying documents.1010_auto_20210101_2159... OK
  Applying documents.1011_auto_20210101_2340... OK
  Applying documents.1012_fix_archive_files... OK
  Applying documents.1013_migrate_tag_colour... OK
  Applying documents.1014_auto_20210228_1614... OK
  Applying documents.1015_remove_null_characters... OK
  Applying documents.1016_auto_20210317_1351... OK
  Applying documents.1017_alter_savedviewfilterrule_rule_type... OK
  Applying documents.1018_alter_savedviewfilterrule_value... OK
  Applying documents.1019_uisettings... OK
  Applying documents.1019_storagepath_document_storage_path... OK
  Applying documents.1020_merge_20220518_1839... OK
  Applying documents.1021_webp_thumbnail_conversion... OK
  Applying documents.1022_paperlesstask... OK
  Applying paperless_mail.0001_initial... OK
  Applying paperless_mail.0002_auto_20201117_1334... OK
  Applying paperless_mail.0003_auto_20201118_1940... OK
  Applying paperless_mail.0004_mailrule_order... OK
  Applying paperless_mail.0005_help_texts... OK
  Applying paperless_mail.0006_auto_20210101_2340... OK
  Applying paperless_mail.0007_auto_20210106_0138... OK
  Applying paperless_mail.0008_auto_20210516_0940... OK
  Applying paperless_mail.0009_mailrule_assign_tags... OK
  Applying paperless_mail.0010_auto_20220311_1602... OK
  Applying paperless_mail.0011_remove_mailrule_assign_tag... OK
  Applying paperless_mail.0012_alter_mailrule_assign_tags... OK
  Applying paperless_mail.0009_alter_mailrule_action_alter_mailrule_folder... OK
  Applying paperless_mail.0013_merge_20220412_1051... OK
  Applying paperless_mail.0014_alter_mailrule_action... OK
  Applying paperless_mail.0015_alter_mailrule_action... OK
  Applying sessions.0001_initial... OK

root@bammbamm:/opt/paperless-ngx/src# sudo -Hu paperless python3 manage.py createsuperuser
Username (leave blank to use 'paperless'): admin
Email address: 
Password: 'ober mega super geheim'
Password (again): 'ober mega super geheim' 
Superuser created successfully.

Dann werden wir die Rakete mal für einen kleinen Funktionstest an der Leine abheben lassen und von außen betrachten, ob sie ruhig in der Luft liegt.

root@bammbamm:/opt/paperless-ngx/src# sudo -Hu paperless python3 manage.py runserver
[2022-09-26 17:42:57,898] [INFO] [django.utils.autoreload] Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
September 26, 2022 - 17:42:58
Django version 4.0.6, using settings 'paperless.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

eric@bammbamm:~$ wget http://127.0.0.1:8000/home
--2022-09-26 15:43:51--  http://127.0.0.1:8000/home
Connecting to 127.0.0.1:8000... connected.
HTTP request sent, awaiting response... 302 Found
Location: /accounts/login/?next=/home [following]
--2022-09-26 15:43:51--  http://127.0.0.1:8000/accounts/login/?next=/home
Reusing existing connection to 127.0.0.1:8000.
HTTP request sent, awaiting response... 200 OK
Length: 8284 (8,1K) [text/html]
Saving to: ‘home’

home                                    100%[==============================================================================>]   8,09K  --.-KB/s    in 0s      

2022-09-26 15:43:51 (109 MB/s) - ‘home’ saved [8284/8284]

Fliegt gut, liegt ruhig in der Luft und gibt auf einen Klopfen an http:8000 eine Website (home.html) raus. Dann werden sie mal für den echten Start auf die Rampe schieben und die notwendigen systemd service definitions schreiben. Glücklicherweise wird das Paket bereits mit drei nur leicht modifizierungsbedürftigen Definitionen ausgeliefert. Diese liegen unter /opt/paperless-ngx/scripts und fangen alle mit paperless-*. Ich kopiere die alle in das passende systemd Verzeichnis /etc/systemd/system und editiere die dann dort an Ort und Stelle.

root@bammbamm:/opt/paperless-ngx/src# cd ..
root@bammbamm:/opt/paperless-ngx# cd scripts/
root@bammbamm:/opt/paperless-ngx/scripts# ls -la
total 28
drwxr-xr-x 2 paperless paperless 4096 Jul 28 23:33 .
drwxr-xr-x 9 paperless paperless 4096 Sep 26 15:27 ..
-rw-r--r-- 1 paperless paperless  223 Jul 28 23:33 paperless-consumer.service
-rw-r--r-- 1 paperless paperless  215 Jul 28 23:33 paperless-scheduler.service
-rw-r--r-- 1 paperless paperless  364 Jul 28 23:33 paperless-webserver.service
<snip>

root@bammbamm:/opt/paperless-ngx/scripts# cp -v paperless-* /etc/systemd/system/
'paperless-consumer.service' -> '/etc/systemd/system/paperless-consumer.service'
'paperless-scheduler.service' -> '/etc/systemd/system/paperless-scheduler.service'
'paperless-webserver.service' -> '/etc/systemd/system/paperless-webserver.service'

root@bammbamm:/opt/paperless-ngx/scripts# nano /etc/systemd/system/paperless-webserver.service
root@bammbamm:/opt/paperless-ngx/scripts# more /etc/systemd/system/paperless-webserver.service
[Unit]
Description=Paperless webserver
After=network.target
Wants=network.target
Requires=redis.service
#Requires=paperless-webserver.socket

[Service]
User=paperless
Group=paperless
WorkingDirectory=/opt/paperless-ngx/src
ExecStart=/opt/paperless-ngx/.local/bin/gunicorn -c /opt/paperless-ngx/gunicorn.conf.py paperless.asgi:application

[Install]
WantedBy=multi-user.target

root@bammbamm:/opt/paperless-ngx/scripts# nano /etc/systemd/system/paperless-scheduler.service
root@bammbamm:/opt/paperless-ngx/scripts# more /etc/systemd/system/paperless-scheduler.service
[Unit]
Description=Paperless scheduler
Requires=redis.service

[Service]
User=paperless
Group=paperless
WorkingDirectory=/opt/paperless-ngx/src
ExecStart=python3 manage.py qcluster

[Install]
WantedBy=multi-user.target

root@bammbamm:/opt/paperless-ngx/scripts# nano /etc/systemd/system/paperless-consumer.service
root@bammbamm:/opt/paperless-ngx/scripts# more /etc/systemd/system/paperless-consumer.service
[Unit]
Description=Paperless consumer
Requires=redis.service

[Service]
User=paperless
Group=paperless
WorkingDirectory=/opt/paperless-ngx/src
ExecStart=python3 manage.py document_consumer

[Install]
WantedBy=multi-user.target

Zeit für den eigentlich Start von Paperless-NGX. Ich werde jetzt alle Services von Paperless-NGX starten und enablen, sowie anschließend einen reboot ausführen. Das hat sich bei den Tests als positiv heraus gestellt, damit alles in der richtigen Reihenfolge gestartet wird; anderfalls war das Ergbnis nicht immer klar…

root@bammbamm:/opt/paperless-ngx/scripts# systemctl start paperless-scheduler.service
root@bammbamm:/opt/paperless-ngx/scripts# systemctl enable paperless-scheduler.service
Created symlink /etc/systemd/system/multi-user.target.wants/paperless-scheduler.service → /etc/systemd/system/paperless-scheduler.service.
root@bammbamm:/opt/paperless-ngx/scripts# systemctl start paperless-consumer.service 
root@bammbamm:/opt/paperless-ngx/scripts# systemctl enable paperless-consumer.service 
Created symlink /etc/systemd/system/multi-user.target.wants/paperless-consumer.service → /etc/systemd/system/paperless-consumer.service.
root@bammbamm:/opt/paperless-ngx/scripts# systemctl start paperless-webserver.service 
root@bammbamm:/opt/paperless-ngx/scripts# systemctl enable paperless-webserver.service 
Created symlink /etc/systemd/system/multi-user.target.wants/paperless-webserver.service → /etc/systemd/system/paperless-webserver.service.
root@bammbamm:/opt/paperless-ngx/scripts# reboot

Houston, we got a lift off… Die Rakete hat den Orbiot erfolgreich erreicht. Machen wir die ersten vorsichtigen Funktionstest, bevor sie ihre weitere Module verpassen und sie zur vollständigen DMS-Station ausbauen. Aus persönlicher Lust an der Freude habe ich den Paperless-NGX ein meinem IPv6 ULA-Adressspace hoch gezogen. 😉 Falls also jemand Fragen haben sollte, ob Paperless-NGX IPv6 ready ist und auch läuft: JA macht es

1st Login @ Paperless-NGX Server v1.8.0

Was brauche ich für den ersten echten Test? Einen User und eine PDF Dateien zum hinein werfen, um zu sehen was passiert. Also lege ich zu erst einmal einen User Namens Eric an.

Erster Funktionstest Paperless-NGX v1.8.0

Dann legen wir mal den User Eric an und geben ihm ein Passwort.

Auf die Admin-Eintrag in der linken Seitenleiste clicken.
Dort unter Benutzer +Hinzufügen clicken
Den Benutzer Eric mit einem sicheren Passwort anlegen.
Der Admin loggt sich dann oben rechts mit Abmelden mal aus.
Der User Eric loggt sich mit seinem Passwort einmal ein.
Dann geben wir ihm doch mal eine PDF vom OpenZFS Symposium 2019 zum Verarbeiten.
Er hat es importiert, den Content extrahiert und alles läuft sauber.

Die Rakete ist wirklich sauber im Orbit. Mit diesem kleinen Test wollte ich sicher gehen, dass die PostgreSQL auch sauber arbeitet, denn hier werden die User Themen gespeichert. Der Redis macht saubere Zuweisungen der Key-Values und der Tesseract hat ordentlich seinen OCR gemacht. Da freue ich mich erst einmal wie ein Schnitzel und mache dann mal weiter mit den zusätzlichen Modulen Tika und Gotenberg.

Tika und Gotenberg Installieren

Diese Services sind für mich zwar essentiell, jedoch werde ich sie der Austauschbarkeit bei späteren Updates dieser Services als Docker Container anlegen. Also holen wir mal die Pakete für eine Docker Umgebung ab und ziehen Docker hoch.

eric@bammbamm:~$ sudo apt-get install ca-certificates curl gnupg lsb-release
Paketlisten werden gelesen… Fertig
<snip>

eric@bammbamm:~$ sudo mkdir -p /etc/apt/keyrings

eric@bammbamm:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

eric@bammbamm:~$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

eric@bammbamm:~$ more /etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable

eric@bammbamm:~$ sudo apt-get update
OK:1 http://de.archive.ubuntu.com/ubuntu jammy InRelease
<snip>

eric@bammbamm:~$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
<snip>

eric@bammbamm:~$ sudo service docker status
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-09-26 16:34:32 UTC; 20s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 2566 (dockerd)
      Tasks: 9
     Memory: 23.9M
        CPU: 428ms
     CGroup: /system.slice/docker.service
             └─2566 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
<snip>

Dann werde ich mal Tika und Gotenberg aus dem DockerHub holen, installieren, starten und reboot fest einrichten.

eric@bammbamm:~$ sudo docker pull apache/tika
Using default tag: latest
latest: Pulling from apache/tika
d5fd17ec1767: Pull complete 
3d74ce657280: Pull complete 
8b587b148104: Extracting [==================>                                ]  36.21MB/96.1MB
a7ee74c4130d: Download complete 
cf5c1973ef27: Download complete 

eric@bammbamm:~$ sudo docker pull gotenberg/gotenberg
Using default tag: latest
latest: Pulling from gotenberg/gotenberg
7a6db449b51b: Pull complete 
9b3d1a56e5be: Pull complete 
8fbdaff3aac4: Pull complete 
1f65ba53270c: Pull complete 
e9035e1d0bab: Downloading [===========================>                       ]  343.7MB/623.8MB
e9a3914669f1: Download complete 
4f4fb700ef54: Download complete 


eric@bammbamm:~$ sudo docker images
REPOSITORY            TAG       IMAGE ID       CREATED        SIZE
gotenberg/gotenberg   latest    f153df718e41   3 weeks ago    1.51GB
apache/tika           latest    3a8c80c1ea4c   4 months ago   435MB

eric@bammbamm:~$ sudo docker run -d -p 9998:9998 --restart unless-stopped apache/tika
2d364bf6f654f2bc9ae1b5317429b7aac76342bd81e894cca6e167d76ca52eea

eric@bammbamm:~$ sudo docker run -d -p 3000:3000 --restart unless-stopped gotenberg/gotenberg
b58ef6f37dce7331189fba83c042556c857080a6e949bd7852ca69673c50910a

eric@bammbamm:~$ sudo docker container ls
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                       NAMES
b58ef6f37dce   gotenberg/gotenberg   "/usr/bin/tini -- go…"   9 seconds ago    Up 8 seconds    0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   jovial_cannon
2d364bf6f654   apache/tika           "/bin/sh -c 'exec ja…"   19 seconds ago   Up 18 seconds   0.0.0.0:9998->9998/tcp, :::9998->9998/tcp   festive_perlman

eric@bammbamm:~$ sudo reboot
Connection to 2a02:8108:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx closed by remote host

Damit diese beide Module nun auch vom Paperless-NGX genutzt werden ist eine Anpassung der /opt/paperless-ngx/paperles.conf notwendig und ein weiterer Reboot, damit Paperless-NGX diese Änderung auch einbindet und nutzt. Na dann werde ich mal Hand anlegen.

eric@bammbamm:~$ sudo nano /opt/paperless-ngx/paperless.conf

eric@bammbamm:~$ sudo grep -A 4 "Tika" /opt/paperless-ngx/paperless.conf
# Tika settings
PAPERLESS_TIKA_ENABLED=true
PAPERLESS_TIKA_ENDPOINT=http://localhost:9998
PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http://localhost:3000

eric@bammbamm:~$ sudo reboot
Connection to 2a02:8108:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx closed by remote host

Funktionstest Tike und Gotenberg

Aus dem DMS-Vergleich heraus habe ich noch 85 Dateien zum Prüfen da. Diese werde ich jetzt mal dem neuen Paperless-NGX Server zum Importieren geben und sehen was er daraus macht, wohl wissend das er davon nicht alle verarbeiten können wird. 😉

Augenscheinlich arbeiten Tika und Gotenberg sehr gut in diesem Setup zusammen. Da nutze ich doch gerne den Satz, welchen ich auf Youtube beim Klaus grillt Kanal zu erst gehört habe: Das sieht doch nach einem gültigen Versuch aus!

Das könnte dich auch interessieren …

6 Antworten

  1. Michael sagt:

    Hallo Eric,

    wieder super dargestellt.
    Hattest Du als Basis OS auch ein Red Hat Derivat betrachtet, 10 Jahre Support haben die?
    Hier bei denke ich an AlmaLinux 9 oder Oracle Linux 9, Oracle Linux 9 kann Kernelupdates ohne Reboot.

    Warum hast Du dich nicht für eine vollständige Containerlösung entschieden?

    So ein Flussdiargramm vermisse ich noch. 🙂 Beispiel: https://blog.armbruster-it.de/wp-content/uploads/2018/12/paperless-1024×539.jpg
    Dann ist deine Darstellung noch perfekter.

    Welchen Scanner willst Du benutzen?

    Danke fürs Sharen.
    VG
    Michael

    • admin sagt:

      Moin Micha,

      ich muss zugeben, dass ich vor Jahren mit Ubuntu angefangen habe und danach zu Linux Arch gewechselt bin.
      Für den Desktop bevorzuge ich Arch/KDE und bei Servern nehme ich gerne die Stabilität von Ubuntu.
      Ich hatte noch keine Überlappung mit Red Hat und Oracle Linux.. was vermutlich auich so bleiben wird.
      Allerdings glaube ich, dass mit geringen Anpassungen bei den Paketnamen das ganze auch unter Oracle und Red Hat funktionieren sollte.

      Beim Scanner bin ich mir noch nicht ganz sicher… ich bin gerade am studierender Specs. Stay tuned. 😉

      VG, Eric

  2. Michael sagt:

    Hallo Erik,
    hier werde ich einen Dokumenten Duplexdokumentenscanner auswählen:
    http://www.sane-project.org/sane-mfgs.html#Z-FUJITSU
    https://github.com/paperless-ngx/paperless-ngx/wiki/Scanner-&-Software-Recommendations
    Vermutlich wird es ein Fujitsu werden. Die Brother Duplexsanner sind mir zu teuer.
    Für Android schau dir evtl. vFlat https://play.google.com/store/apps/details?id=com.voyagerx.scanner&hl=de&gl=US an, evtl. genügt es ja. Wobei, wohin gehen die OCR Daten?????
    VG
    Michael

    • Eric Sobian sagt:

      Hallo Michael,

      ich danke dir für dein Feedback!
      Bin gerade am aufstellen eines Artikels für die Scanner und nehme deinen Input ganz klar als Anregung mit.
      Die Preislage der Scanner die ich mir vorstellen kann ist ja irgendwo bei ~250-350€ .
      Ein bisschen blöd bei meinem Vergleich wird ja, dass ich quasi trocken schwimmen übe.
      Denn ich treffe schreibe auf ja Bases der Specifics – kann also bei dem sich dann anschließenden Kauf immer noch tief ins Klo greifen..

      So wie ich die drei DMS Systeme verstanden habe gint es jeweils so etwas wie ein Importverzeichnis,
      aus dem sich das DMS dann in zeitlich definierten Abständen den Content hinein saugt.
      Meint also das Verzeichnis muss auf dem Server per FTP/SMB/NFS/etc. für den Scanner als beschreibbar von außen angelegt werden.
      Je nachdem, welches Protokoll der Scanner zum Export des Contents unterstützt.

      VG, Eric

  3. Jan sagt:

    Hi Erik,

    super Anleitung soweit. Lief auch alles gut bis auf das starten der Dienste.. diese starten irgendwie nicht.
    Ich habe soweit alles genau gemacht wie du. Hast du eine Idee?

    archon@shw-vm-docs-01:~$ systemctl –failed
    UNIT LOAD ACTIVE SUB DESCRIPTION
    ● paperless-consumer.service loaded failed failed Paperless consumer
    ● paperless-scheduler.service loaded failed failed Paperless scheduler
    ● paperless-webserver.service loaded failed failed Paperless webserver

    Wäre dankbar für eine Antwort.

    Grüße Jan

Schreibe einen Kommentar zu Michael Antworten abbrechen

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