Docspell auf Ubuntu 22.04lts installieren

Nach dem ich mir Paperless-NGX angesehen habe und mir der Umfang an supporteten Dokumenten durch das DMS nicht ausreichte sehe ich mir in diesem Beitrag das DMS Docspell an. Es scheint durch seine Nutzung von Tools im Umfeld eine größere Anzahl von Dokumententypen zu unterstützen. Wenn ich mich richtig orientiert habe besteht das Docspell Framework aus folgenden Komponenten.

Etwas verwundert es mich, dass Unoconv genutzt wird da das auf Github als “deprecated” deklariert ist. Wir werden sehen, in wie Weit das relevant ist.

Nachdem ich mir dazu auf YT einige echt gute Beiträge von Christian Zengel angesehen habe, will ich mir mal eine VitualBox bauen um mir selbst eine Meinung zu dem Thema bilden zu können.

Ich habe mir für solche Zwecke eine standard Ubuntu22.04lts Server aus Ausgangspunkt aufgesetzt und den Klone ich dann je nachdem, was ich testen/probieren möchte.

Die Prerequisites auf der Docspell Website sind schon sehr umfangreich, also zerlegen wir das mal wie immer in handliche Portionen.

1. Update des Ubuntu Server 22.04lts

Zu erst einmal machen wir einen Update des Ubuntu Servers, um ein saubere Ausgangssituation zu haben.

user@2204lts:~$ sudo apt-get update
user@2204lts:~$ sudo apt-get upgrade
user@2204lts:~$ sudo reboot


2. Postgre-SQL Datenbank installieren

In diesem Abschnitt geht es um die Installation und Konfiguration einer lokalen PostgreSQL-Datenbank.

sudo apt install -y postgresql

Sobald PostgreSQL installiert ist, starten wir den Dienst und aktivieren Sie ihn für die Ausführung beim Booten:

Wie bei Paperless-ngx konnte ich auch bei Docspell kein Requirement zur Version der Postgre-SQL Datenbank finden, aber ich vermute “latest and greatest” kann nicht schaden. Sehen wir uns mal an, welche Version wir von Postgre-SQL erwischt haben.
user@2204lts:~$ psql -V
psql (PostgreSQL) 14.3 (Ubuntu 14.3-0ubuntu0.22.04.1)

3. Erstellung der Portgre-SQL Datenbank für Docspell

Wir müssen zumindest eine Datenbank für Docspell erstellen und ihr einen Benutzernamen und ein Passwort für die Authentifizierung zuweisen. Rufen wir zunächst die PostgreSQL-Shell als Postgres-Systembenutzer auf.

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

postgres=# 

Geben wir in der Shell die folgenden Befehle ein, um die Datenbank und den Benutzer (die Rolle) anzulegen, und ersetzen Sie das Passwort durch Ihren eigenen Wert:

postgres=# CREATE DATABASE docspell;
CREATE DATABASE
postgres=# CREATE USER docspell WITH PASSWORD 'docspell';
CREATE ROLE
postgres=# GRANT ALL PRIVILEGES ON DATABASE docspell to docspell;
GRANT
postgres=# 

Wenn ihr das macht verwendet bitte ein sichere Passwort!

Verwende nicht das Passwort aus dem Beispiel. Wählen ein sicheres, zufälliges Passwort, um eine sichere Datenbankauthentifizierung für deine Paperless-ngx Installation zu gewährleisten.

Wenn du fertig bist, gib \q ein, um die PostgreSQL-Shell zu beenden.

4. Überprüfen des Postgre-SQL Datenbankstatus

Wir können überprüfen, ob die Authentifizierung funktioniert, indem Sie den Befehl psql ausführen und den konfigurierten Benutzernamen und das Passwort übergeben. (Ersetzen Sie localhost durch Ihren Datenbankserver, wenn Sie eine Remote-Datenbank verwenden).

user@2204lts:~$ psql --username docspell --host localhost
Password for user docspell: 
psql (14.3 (Ubuntu 14.3-0ubuntu0.22.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

docspell=> \conninfo
You are connected to database "docspell" as user "docspell" 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)
docspell=> \q
user@2204lts:~$ 

Wenn die Verbindung erfolgreich war, wird nach der Passwort Eingabeaufforderung der Postgre-SQL Prompt docspell=> angezeigt. Geben Sie \conninfo ein, um Ihre Verbindung zu bestätigen und anschließend geben Sie \q ein, um die Verbindung zu beenden.

5. Tesseract Installation

Die hereinkommenden Dokumente, Zeichnungen, Grafiken werden bei docspell durch die OCR Software Tesseract analysiert. Laut PreRequisites wird Version 3 oder 4 erwartet. Meine Dokumente sind aus den Deutsch- und Englisch-Raum, weshalb ich gleich die passenden OCR Module mit installiere.

user@2204lts:~$ sudo apt-get install tesseract-ocr tesseract-ocr-frk tesseract-ocr-deu tesseract-ocr-eng 
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Die folgenden zusätzlichen Pakete werden installiert:
  fontconfig fontconfig-config fonts-dejavu-core libcairo2 libdatrie1 libdeflate0 libfontconfig1 libgif7 libgomp1 libgraphite2-3
  libharfbuzz0b libjbig0 libjpeg-turbo8 libjpeg8 liblept5 libopenjp2-7 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0
  libpixman-1-0 libtesseract4 libthai-data libthai0 libtiff5 libwebp7 libwebpmux3 libxcb-render0 libxcb-shm0 libxrender1
  tesseract-ocr-osd
Die folgenden NEUEN Pakete werden installiert:
<snip>

Bevor wir fortfahren, vergewissern wir uns, dass die installierte Version von Tesseract mindestens v4.0.0 ist:

user@2204lts:~$ tesseract --version
tesseract 4.1.1
 leptonica-1.82.0
  libgif 5.1.9 : libjpeg 8d (libjpeg-turbo 2.1.1) : libpng 1.6.37 : libtiff 4.3.0 : zlib 1.2.11 : libwebp 1.2.2 : libopenjp2 2.4.0
 Found AVX2
 Found AVX
 Found SSE
 Found libarchive 3.6.0 zlib/1.2.11 liblzma/5.2.5 bz2lib/1.0.8 liblz4/1.9.3 libzstd/1.4.8
user@2204lts:~$ 




Das sieht gut aus, im verwendeten Ubuntu 22.04lts ist zur Zeit Tesseract Version 4.1.1 am Start.

6. OpenJDK Installation

Da ich nicht unter Java entwickele reicht mir der OpenJDK aus. Ich hoffe, dass das Docspell genauso sieht. Prüfen wir kurz, ob Ubuntu Server 22.04lts nicht irgend ein Java Paket mit installiert hat.

user@2204lts:~$ java -version
Command 'java' not found, but can be installed with:
sudo apt install openjdk-11-jre-headless  # version 11.0.15+10-0ubuntu0.22.04.1, or
sudo apt install default-jre              # version 2:1.11-72build2
sudo apt install openjdk-17-jre-headless  # version 17.0.3+7-0ubuntu0.22.04.1
sudo apt install openjdk-18-jre-headless  # version 18~36ea-1
sudo apt install openjdk-8-jre-headless   # version 8u312-b07-0ubuntu1

Also es sieht nicht danach aus, also installieren wir OpenJDK-18 ohne die Entwicklerumgebung und ohne GUI.

user@2204lts:~$ sudo apt-get install openjdk-18-jdk-headless
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Die folgenden zusätzlichen Pakete werden installiert:
  alsa-topology-conf alsa-ucm-conf ca-certificates-java java-common libasound2 libasound2-data libavahi-client3
  libavahi-common-data libavahi-common3 libcups2 liblcms2-2 libpcsclite1 openjdk-18-jre-headless
Vorgeschlagene Pakete:
<snip>

Eine kurzer Check, was wir jetzt als Java haben:

user@2204lts:~$ java -version
openjdk version "18-ea" 2022-03-22
OpenJDK Runtime Environment (build 18-ea+36-Ubuntu-1)
OpenJDK 64-Bit Server VM (build 18-ea+36-Ubuntu-1, mixed mode, sharing)

Wir werden sehen, ob das Docspell reicht oder wir etwas hinterer schieben müssen.

7. Ghostscript Installation

Auch für Ghostscript wird keine erwartete Versionsnummer vorgegeben, dem entsprechend nehmen wir einfach das aktuelle aus dem Ubuntu Repository und installieren es.

user@2204lts:~$ sudo apt-get install ghostscript
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Die folgenden zusätzlichen Pakete werden installiert:
  fonts-droid-fallback fonts-noto-mono fonts-urw-base35 libgs9 libgs9-common libidn12 libijs-0.35 libjbig2dec0 libpaper-utils
  libpaper1 poppler-data

Ein kurzer Check auch hier, was wir als Ghostscript installiert haben:

user@2204lts:~$ gs --help
GPL Ghostscript 9.55.0 (2021-09-27)
Copyright (C) 2021 Artifex Software, Inc.  All rights reserved.

Version 9.55.0 aus dem Jahre 2021. Wir werden auch hier sehen, ob das Docspell reicht.

8. Unpaper Installieren

So wie ich das in den PreRequisites lese, handelt es sich hier um ein Tool, was das OCR Ergebnis von Tesseract verbessern soll und da ja besser immer angestrebt wird, installieren wir das mal mit. Laut apt-cache search unpaper handelt es sich um ein “Werkzeug zum Nachbearbeiten von eingescannten Seiten”.

user@2204lts:~$ sudo apt-get install unpaper
[sudo] password for user: 
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Die folgenden zusätzlichen Pakete werden installiert:
  i965-va-driver intel-media-va-driver libaacs0 libaom3 libavcodec58 libavformat58 libavutil56 libbdplus0 libbluray2
  libcairo-gobject2 libchromaprint1 libcodec2-1.0 libdav1d5 libdrm-amdgpu1 libdrm-intel1 libdrm-nouveau2 libdrm-radeon1
  libgdk-pixbuf-2.0-0 libgdk-pixbuf2.0-bin libgdk-pixbuf2.0-common libgme0 libgsm1 libigdgmm12 libllvm13 libmfx1 libmp3lame0
  libmpg123-0 libnorm1 libogg0 libopenmpt0 libopus0 libpciaccess0 libpgm-5.3-0 librabbitmq4 librsvg2-2 librsvg2-common libshine3
  libsnappy1v5 libsoxr0 libspeex1 libsrt1.4-gnutls libssh-gcrypt-4 libswresample3 libtheora0 libtwolame0 libudfread0 libva-drm2
  libva-x11-2 libva2 libvdpau1 libvorbis0a libvorbisenc2 libvorbisfile3 libvpx7 libx11-xcb1 libx264-163 libx265-199 libxcb-dri2-0
  libxcb-dri3-0 libxcb-present0 libxcb-sync1 libxcb-xfixes0 libxfixes3 libxshmfence1 libxvidcore4 libzmq5 libzvbi-common libzvbi0
  mesa-va-drivers mesa-vdpau-drivers ocl-icd-libopencl1 va-driver-all vdpau-driver-all
<snip>

Prüfen wir einmal, ob es läuft und in welcher Version unpaper installiert wurde. Hier schweigen sich die PreRequisites leider auch darüber aus, welche Version benötigt oder gewünscht wird.

user@2204lts:~$ unpaper --help
unpaper 6.1
License GPLv2: GNU GPL version 2.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Usage: unpaper [options] <input-file(s)> <output-file(s)>

Filenames may contain a formatting placeholder starting with '%%' to insert a
page counter for multi-page processing. E.g.: 'scan%%03d.pbm' to process files
scan001.pbm, scan002.pbm, scan003.pbm etc.

See 'man unpaper' for options details
Report bugs at https://github.com/Flameeyes/unpaper/issues

user@2204lts:~$

Okay, unpaper springt an und sagt es hat den Versionsstand 6.1

9. Unoconv Installieren

Jetzt ist das Tool unoconv dran, welches laut Github seit 2017 nicht mehr weiter entwickelt oder gebugfixt wird. Auf Github ist der letzte Versionstand die 0.8.2. Das schöne an Ubuntu ist ja, das es gerne mal hoffnungslos veraltete Software im Repository hat.. (seufz)

Aber sei es drum, ich möchte mir in diesem Artiekl nur einen ersten Eindruck von Docspell verschaffen und kann mir dann später ggf. Gedanken um diesen alten Schinken machen.

user@2204lts:~$ sudo apt-get install unoconv
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Die folgenden zusätzlichen Pakete werden installiert:
  adwaita-icon-theme at-spi2-core cpp cpp-11 dconf-gsettings-backend dconf-service dictionaries-common emacsen-common
  fonts-liberation2 fonts-opensymbol gcc-11-base gsettings-desktop-schemas gstreamer1.0-plugins-base gtk-update-icon-cache
  hicolor-icon-theme humanity-icon-theme hunspell-en-us libabsl20210324 libabw-0.1-1 libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data
  libatspi2.0-0 libauthen-sasl-perl libboost-filesystem1.74.0 libboost-iostreams1.74.0 libboost-locale1.74.0 libboost-thread1.74.0
  libcdparanoia0 libcdr-0.1-1 libclone-perl libclucene-contribs1v5 libclucene-core1v5 libcolamd2 libcolord2 libdata-dump-perl
  libdconf1 libe-book-0.1-1 libencode-locale-perl libeot0 libepoxy0 libepubgen-0.1-1 libetonyek-0.1-1 libexttextcat-2.0-0
  libexttextcat-data libfile-basedir-perl libfile-desktopentry-perl libfile-listing-perl libfile-mimeinfo-perl libfont-afm-perl
  libfontenc1 libfreehand-0.1-1 libgl1 libgl1-amber-dri libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0 libglx0 libgpgmepp6
  libgstreamer-plugins-base1.0-0 libgtk-3-0 libgtk-3-bin libgtk-3-common libgtkd-3-0 libharfbuzz-icu0 libhtml-form-perl
  libhtml-format-perl libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl
  libhttp-date-perl libhttp-message-perl libhttp-negotiate-perl libhunspell-1.7-0 libhyphen0 libice6 libio-html-perl
  libio-socket-ssl-perl libio-stringy-perl libipc-system-simple-perl libisl23 liblangtag-common liblangtag1 libllvm11 libltdl7
  liblwp-mediatypes-perl liblwp-protocol-https-perl libmailtools-perl libmhash2 libmpc3 libmspub-0.1-1 libmwaw-0.3-3
  libmythes-1.2-0 libnet-dbus-perl libnet-http-perl libnet-smtp-ssl-perl libnet-ssleay-perl libodfgen-0.1-1 liborc-0.4-0
  liborcus-0.17-0 liborcus-parser-0.17-0 libpagemaker-0.0-0 libphobos2-ldc-shared98 libpoppler118 libraptor2-0 librasqal3 librdf0
  libreoffice-base-core libreoffice-calc libreoffice-common libreoffice-core libreoffice-draw libreoffice-impress libreoffice-math
  libreoffice-style-colibre libreoffice-writer librevenge-0.0-0 libsm6 libsuitesparseconfig5 libtie-ixhash-perl libtimedate-perl
  libtry-tiny-perl libuno-cppu3 libuno-cppuhelpergcc3-3 libuno-purpenvhelpergcc3-3 libuno-sal3 libuno-salhelpergcc3-3 liburi-perl
  libvisio-0.1-1 libvisual-0.4-0 libvte-2.91-0 libvte-2.91-common libvted-3-0 libvulkan1 libwayland-client0 libwayland-cursor0
  libwayland-egl1 libwpd-0.10-10 libwpg-0.3-3 libwps-0.4-4 libwww-perl libwww-robotrules-perl libx11-protocol-perl libxaw7
  libxcb-glx0 libxcb-randr0 libxcb-shape0 libxcomposite1 libxcursor1 libxdamage1 libxft2 libxi6 libxinerama1 libxkbcommon0
  libxkbfile1 libxml-parser-perl libxml-twig-perl libxml-xpathengine-perl libxmlsec1-nss libxmu6 libxpm4 libxrandr2 libxt6
  libxtst6 libxv1 libxxf86dga1 libxxf86vm1 libyajl2 lp-solve mesa-vulkan-drivers perl-openssl-defaults python3-uno
  session-migration tilix tilix-common ubuntu-mono uno-libs-private ure x11-common x11-utils x11-xserver-utils xdg-utils
Vorgeschlagene Pakete:
<snip>

Dieses kleine Tool scheint doch recht bedürftige bei der Menge der von ihm gewünschten Pakete zu sein. Mal abgesehen von seinem Status Deprecated scheint es das Tool zu sein, welches alle Dokumente, welche nicht durch den OCR Wolf gedreht werden in ein verarbeitbares Format wandelt. Ich denke, dass es genau dieses Dingelchen ist, was bei Paperless-NGX fehlt, um alle möglichen Arten von Dokumenten erst zu Wandeln und dann zu Verarbeiten. Prüfen wir also kurz nach, welche Deprecated-Version wir uns eingetreten haben:

user@2204lts:~$ unoconv --version
/usr/bin/unoconv:19: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives
  from distutils.version import LooseVersion
unoconv 0.7
Written by Dag Wieers <dag@wieers.com>
Homepage at http://dag.wieers.com/home-made/unoconv/

platform posix/linux
python 3.10.4 (main, Apr  2 2022, 09:04:19) [GCC 11.2.0]
LibreOffice 7.3.3.2

Möglicherweise ist der Unoserver im Folgenden ein Kandidat als Nachfolger für dieses Tool..

10. WKHTMLTOPDF Installieren

Nach so ein Tool, bei dem ich vermute, dass es die Artenvielfalt der von Docspell supporteten Filetypes erhöhen dürfte. Dann wollen wir das mal installieren.

user@2204lts:~$ sudo apt-get install wkhtmltopdf
[sudo] password for user: 
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Die folgenden zusätzlichen Pakete werden installiert:
  avahi-daemon geoclue-2.0 glib-networking glib-networking-common glib-networking-services iio-sensor-proxy libavahi-core7
  libavahi-glib1 libdaemon0 libdouble-conversion3 libegl-mesa0 libegl1 libgbm1 libinput-bin libinput10 libmd4c0 libmtdev1
  libnl-route-3-200 libnotify4 libnss-mdns libpcre2-16-0 libproxy1v5 libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5
  libqt5positioning5 libqt5printsupport5 libqt5qml5 libqt5qmlmodels5 libqt5quick5 libqt5sensors5 libqt5svg5 libqt5webchannel5
  libqt5webkit5 libqt5widgets5 libsoup2.4-1 libsoup2.4-common libwacom-bin libwacom-common libwacom9 libwayland-server0 libwoff1
  libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-util1 libxcb-xinerama0 libxcb-xinput0 libxcb-xkb1
  libxfont2 libxkbcommon-x11-0 qt5-gtk-platformtheme qttranslations5-l10n wpasupplicant x11-xkb-utils xfonts-base xfonts-encodings
  xfonts-utils xnest xserver-common
<snip>

Oh man, das Tool bringt einen XServer mit. Genau das, was man auf einem Headless Server haben möchte… (seufz)

Prüfen wir mal den Versionsstand, auch wenn die PreRquisites hier ja auch keine Forderung stellen.

user@2204lts:~$ wkhtmltopdf --help
Name:
  wkhtmltopdf 0.12.6

Synopsis:
  wkhtmltopdf [GLOBAL OPTION]... [OBJECT]... <output file>

Der Stand der Version ist 0.12.6, was sich mit dem Stand auf Github zumindest deckt.

11. OCRmyPDF Installieren

Bei dem Tool brauche ich glaube nicht zu erwähnen, dass es keine Forderung zum Versionsstand gibt.. Also installieren wir es flott.

user@2204lts:~$ sudo apt-get install ocrmypdf
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Die folgenden zusätzlichen Pakete werden installiert:
  bzip2 icc-profiles-free libimagequant0 libqpdf28 libraqm0 libwebpdemux2 mailcap mime-support pngquant python3-bs4
  python3-coloredlogs python3-html5lib python3-humanfriendly python3-img2pdf python3-lxml python3-olefile python3-packaging
  python3-pdfminer python3-pikepdf python3-pil python3-pluggy python3-renderpm python3-reportlab python3-reportlab-accel
  python3-soupsieve python3-tqdm python3-webencodings
<snip>

Zumindest frißt dieses Tool nicht unendlich viel Speicherplatz auf der Festplatte. Schauen wir uns den Versionsstand an.

user@2204lts:~$ ocrmypdf --version
13.4.0+dfsg

Zumindest eine 13 als Major-Release, was mir zwar auch nichts sagt, aber so what…

12. SOLR Installieren

Fehlt mir als letzte PreRequisite noch die SOLR Searchengine. Laut Website benötigt diese mindestens Java Version 11, was bereits gegeben ist. Dann werden wir diese mal herunter laden und zwar am besten nach /opt.

user@2204lts:/opt$ sudo wget https://archive.apache.org/dist/solr/solr/9.0.0/solr-9.0.0.tgz 
[sudo] password for user: 
--2022-06-08 06:55:06--  https://archive.apache.org/dist/solr/solr/9.0.0/solr-9.0.0.tgz
Resolving archive.apache.org (archive.apache.org)... 2a01:4f8:172:2ec5::2, 138.201.131.134
Connecting to archive.apache.org (archive.apache.org)|2a01:4f8:172:2ec5::2|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 223857836 (213M) [application/x-gzip]
Saving to: ‘solr-9.0.0.tgz’

solr-9.0.0.tgz                   100%[==========================================================>] 213,49M  4,72MB/s    in 53s     

2022-06-08 06:56:00 (4,00 MB/s) - ‘solr-9.0.0.tgz’ saved [223857836/223857836]

user@2204lts:/opt$ 

In /opt werden wir es auch gleich auspacken.

user@2204lts:/opt$ sudo tar xzfv solr-9.0.0.tgz
solr-9.0.0/
solr-9.0.0/LICENSE.txt
solr-9.0.0/NOTICE.txt
solr-9.0.0/CHANGES.txt
solr-9.0.0/README.md
solr-9.0.0/bin/
solr-9.0.0/bin/install_solr_service.sh
solr-9.0.0/bin/oom_solr.sh
solr-9.0.0/bin/post
solr-9.0.0/bin/postlogs
solr-9.0.0/bin/solr
solr-9.0.0/bin/solr.cmd
solr-9.0.0/bin/solr.in.cmd
solr-9.0.0/bin/solr.in.sh
solr-9.0.0/bin/init.d/
solr-9.0.0/bin/init.d/solr
<snip>

Das ist ja ein ziemliches Ungetüm, dieses Solr. Aber dafür hat es laut Wiki eine eigene Installationsroutine, welche wir gleich mal nutzen werden.

user@2204lts:/opt/solr-9.0.0/bin$ sudo bash ./install_solr_service.sh /opt/solr-9.0.0.tgz
id: ‘solr’: no such user
Creating new user: solr
Adding system user `solr' (UID 116) ...
Adding new group `solr' (GID 123) ...
Adding new user `solr' (UID 116) with group `solr' ...
Creating home directory `/var/solr' ...

WARNING: /opt/solr-9.0.0 already exists! Skipping extract ...


Installing symlink /opt/solr -> /opt/solr-9.0.0 ...


Installing /etc/init.d/solr script ...


Installing /etc/default/solr.in.sh ...

Service solr installed.
Customize Solr startup configuration in /etc/default/solr.in.sh
● solr.service - LSB: Controls Apache Solr as a Service
     Loaded: loaded (/etc/init.d/solr; generated)
     Active: active (exited) since Wed 2022-06-08 07:12:28 UTC; 5s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 1399 ExecStart=/etc/init.d/solr start (code=exited, status=0/SUCCESS)
        CPU: 11ms

Jun 08 07:12:23 2204lts systemd[1]: Starting LSB: Controls Apache Solr as a Service...
Jun 08 07:12:23 2204lts su[1401]: (to solr) root on none
Jun 08 07:12:23 2204lts su[1401]: pam_unix(su-l:session): session opened for user solr(uid=116) by (uid=0)
Jun 08 07:12:28 2204lts solr[1465]: Started Solr server on port 8983 (pid=1461). Happy searching!
Jun 08 07:12:28 2204lts systemd[1]: Started LSB: Controls Apache Solr as a Service.
user@2204lts:/opt/solr-9.0.0/bin$ 

Das Script läuft ohne zu meckern. Noch ein kurzer Check, ob SOLR eine Socket gheöffnet hat. Mist, ich hatte vergessen die Net-Tools zu installieren. Dann hole ich das eben schnell nach und sehe dann nach dem von dem Install-Script angebenen Port 8983.

user@2204lts:/opt/solr-9.0.0/bin$ sudo apt-get install net-tools
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Die folgenden NEUEN Pakete werden installiert:
  net-tools
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 3 nicht aktualisiert.
Es müssen 204 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 819 kB Plattenplatz zusätzlich benutzt.
Holen:1 http://de.archive.ubuntu.com/ubuntu jammy/main amd64 net-tools amd64 1.60+git20181103.0eebece-1ubuntu5 [204 kB]
Es wurden 204 kB in 0s geholt (1.011 kB/s).
Vormals nicht ausgewähltes Paket net-tools wird gewählt.
(Lese Datenbank ... 136361 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../net-tools_1.60+git20181103.0eebece-1ubuntu5_amd64.deb ...
<snip>


user@2204lts:/opt/solr-9.0.0/bin$ netstat -tunelp | grep 8983
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp6       0      0 127.0.0.1:8983          :::*                    LISTEN      116        24402      -                   
user@2204lts:/opt/solr-9.0.0/bin$

user@2204lts:/opt/solr-9.0.0/bin$ sudo systemctl status solr
● solr.service - LSB: Controls Apache Solr as a Service
     Loaded: loaded (/etc/init.d/solr; generated)
     Active: active (exited) since Wed 2022-06-08 07:12:28 UTC; 5min ago
       Docs: man:systemd-sysv-generator(8)
    Process: 1399 ExecStart=/etc/init.d/solr start (code=exited, status=0/SUCCESS)
        CPU: 11ms

Jun 08 07:12:23 2204lts systemd[1]: Starting LSB: Controls Apache Solr as a Service...
Jun 08 07:12:23 2204lts su[1401]: (to solr) root on none
Jun 08 07:12:23 2204lts su[1401]: pam_unix(su-l:session): session opened for user solr(uid=116) by (uid=0)
Jun 08 07:12:28 2204lts solr[1465]: Started Solr server on port 8983 (pid=1461). Happy searching!
Jun 08 07:12:28 2204lts systemd[1]: Started LSB: Controls Apache Solr as a Service.
user@2204lts:/opt/solr-9.0.0/bin$ 

Der Solr-Service läuft, sicherheitshalber geben ich nochmal hinein ins System zum Starten nach reboot.

user@2204lts:/opt/solr-9.0.0/bin$ sudo systemctl enable solr
solr.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable solr
user@2204lts:/opt/solr-9.0.0/bin$ 

Diese Meldung sagt mir als Nutzer von systemctl jetzt nicht soviel, aber nach einem Reboot ist der Solr-Service auf Port 8983 ohne mein zu tun wieder da. Das Install-Script scheint alles richtig gemacht zu haben.

Prüfen wir, ob auf Port8983 auch wirklich ein SOLR Server antwortet. Das macht er intern:

user@2204lts:~$ wget 127.0.0.1:8983/solr
--2022-06-10 14:29:25--  http://127.0.0.1:8983/solr
Connecting to 127.0.0.1:8983... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://127.0.0.1:8983/solr/ [following]
--2022-06-10 14:29:25--  http://127.0.0.1:8983/solr/
Reusing existing connection to 127.0.0.1:8983.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘solr’

solr                                        [ <=>                                                                           ]  15,86K  --.-KB/s    in 0s      

2022-06-10 14:29:25 (163 MB/s) - ‘solr’ saved [16242]

user@2204lts:~$ 

Doch leider will er von extern nicht anworten. Mal in den Configs suchen, an welcher Stellschraube man hier drehen muss. Ich hab es gefunden, es ist in der Solr Config Datei /etc/default/solr.in.sh das Feld SOLR_JETTY_HOST, welches man ändern muss. Da ich in meinem Testfall keine großen Sicherheitsbedenken einplanen muss, mach ich den Solr Server einfach komplett auf mit:

# Sets the network interface the Solr binds to. To prevent administrators from
# accidentally exposing Solr more widely than intended, this defaults to 127.0.0.1.
# Administrators should think carefully about their deployment environment and
# set this value as narrowly as required before going to production. In
# environments where security is not a concern, 0.0.0.0 can be used to allow
# Solr to accept connections on all network interfaces.
SOLR_JETTY_HOST="0.0.0.0"

Und siehe da, schon antwortet der Solr Server auf Anfragen von außen mit einem Webinterface.

13. Docspell Installieren

Nach dem wir uns also mächtig durch die Prerequisites geqäult haben kommt jetzt endlich die Installation von Docspell. Dieses scheint aus zwei Paketen zu bestehen, dem Docspell-Restserver und dem Docspell-Joex. Mein bedarf an Sourcecode kompilieren hält sich nach dem Vorlauf in Grenzen, also nehme ich die .Deb Pakete direkt vom Github und hoffe, dass diese laufen. Na dnan holen wir uns die Software mal ins /opt Verzeichnis.

user@2204lts:~$ cd /opt/
user@2204lts:/opt$ sudo wget https://github.com/eikek/docspell/releases/download/v0.37.0/docspell-joex_0.37.0_all.deb
[sudo] password for user: 
--2022-06-11 10:52:41--  https://github.com/eikek/docspell/releases/download/v0.37.0/docspell-joex_0.37.0_all.deb
Resolving github.com (github.com)... 140.82.121.3
Connecting to github.com (github.com)|140.82.121.3|:443... connected.
<snip>
HTTP request sent, awaiting response... 200 OK
Length: 404633792 (386M) [application/octet-stream]
Saving to: ‘docspell-joex_0.37.0_all.deb’

docspell-joex_0.37.0_all.deb            100%[==============================================================================>] 385,89M  11,4MB/s    in 21s     

2022-06-11 10:53:03 (18,1 MB/s) - ‘docspell-joex_0.37.0_all.deb’ saved [404633792/404633792]

user@2204lts:/opt$ sudo wget https://github.com/eikek/docspell/releases/download/v0.37.0/docspell-restserver_0.37.0_all.deb
--2022-06-11 10:53:17--  https://github.com/eikek/docspell/releases/download/v0.37.0/docspell-restserver_0.37.0_all.deb
Resolving github.com (github.com)... 140.82.121.3
Connecting to github.com (github.com)|140.82.121.3|:443... connected.
<snip>
Length: 134246592 (128M) [application/octet-stream]
Saving to: ‘docspell-restserver_0.37.0_all.deb’

docspell-restserver_0.37.0_all.deb      100%[==============================================================================>] 128,03M  7,57MB/s    in 9,0s    

2022-06-11 10:53:27 (14,2 MB/s) - ‘docspell-restserver_0.37.0_all.deb’ saved [134246592/134246592]

user@2204lts:/opt$
user@2204lts:/opt$ ls -la
total 744888
drwxr-xr-x  3 root root      4096 Jun 11 10:53 .
drwxr-xr-x 19 root root      4096 Apr 24 10:30 ..
-rw-r--r--  1 root root 404633792 Jun  4 21:27 docspell-joex_0.37.0_all.deb
-rw-r--r--  1 root root 134246592 Jun  4 21:27 docspell-restserver_0.37.0_all.deb
lrwxrwxrwx  1 root root        15 Jun  8 07:12 solr -> /opt/solr-9.0.0
drwxr-xr-x 10 root root      4096 Mai  4 23:00 solr-9.0.0
-rw-r--r--  1 root root 223857836 Mai  5 07:00 solr-9.0.0.tgz
user@2204lts:/opt$ 

Das abholen vom Github prima geklappt. All fingers crossed, dass die Installation jetzt auch so gut läuft.

user@2204lts:/opt$ sudo dpkg -i docspell-joex_0.37.0_all.deb docspell-restserver_0.37.0_all.deb
Vormals nicht ausgewähltes Paket docspell-joex wird gewählt.
(Lese Datenbank ... 136410 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von docspell-joex_0.37.0_all.deb ...
Entpacken von docspell-joex (0.37.0) ...
Vormals nicht ausgewähltes Paket docspell-restserver wird gewählt.
Vorbereitung zum Entpacken von docspell-restserver_0.37.0_all.deb ...
Entpacken von docspell-restserver (0.37.0) ...
docspell-joex (0.37.0) wird eingerichtet ...
Creating system group: docspell
Creating system user: docspell in docspell with docspell-joex daemon-user and shell /bin/false
Created symlink /etc/systemd/system/multi-user.target.wants/docspell-joex.service → /lib/systemd/system/docspell-joex.service.
docspell-restserver (0.37.0) wird eingerichtet ...
Created symlink /etc/systemd/system/multi-user.target.wants/docspell-restserver.service → /lib/systemd/system/docspell-restserver.service.
user@2204lts:/opt$ 

Die Installgötter sind mir heute offensichtlich hold! Lief ohne zu mucken. Jetzt bin ich gespannt, wie die Konfiguration von dem beiden Pakten abläuft. Sehen wir mal vorsichtig ins /etc Verzeichnis, ob die Pakete vielleicht eine Beispiel-Konfig mit bringen.

user@2204lts:/opt$ ls -la /etc/doc*
lrwxrwxrwx 1 root root 29 Jun  4 21:27 /etc/docspell-joex -> /usr/share/docspell-joex/conf
lrwxrwxrwx 1 root root 35 Jun  4 21:26 /etc/docspell-restserver -> /usr/share/docspell-restserver/conf

user@2204lts:/opt$ ls -la /etc/docspell-joex/
total 40
drwxr-xr-x 2 root root  4096 Jun 11 10:55 .
drwxr-xr-x 5 root root  4096 Jun 11 10:55 ..
-rw-r--r-- 1 root root 29944 Jun  4 21:08 docspell-joex.conf

user@2204lts:/opt$ ls -la /etc/docspell-restserver/
total 28
drwxr-xr-x 2 root root  4096 Jun 11 10:55 .
drwxr-xr-x 5 root root  4096 Jun 11 10:55 ..
-rw-r--r-- 1 root root 19058 Jun  4 21:08 docspell-server.conf
user@2204lts:/opt$ 

So idt es, beide bringen Examples mit. Nun steigt die Hoffnung, das die auch schon gut befüllt sind. M;ein Hoffnung wird nicht enttäuscht, da beide Konfigs sehr gut dokumentiert und befüllt sind.

Tragen wir zu erst einmal unsere lokale Postgre-SQL Datenbank beim Docspell-Joex ein.

user@2204lts:~$ sudo nano /etc/docspell-joex/docspell-joex.conf

  jdbc {

    # The JDBC url to the database. By default a H2 file-based
    # database is configured. You can provide a postgresql or mariadb
    # connection here. When using H2 use the PostgreSQL compatibility
    # mode and AUTO_SERVER feature.
    #url = "jdbc:h2://"${java.io.tmpdir}"/docspell-demo.db;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;AUTO_SERVER=TRUE"

    # The database user.
    #user = "sa"

    # The database password.
    #password = ""
    url = "jdbc:postgresql://localhost:5432/docspell"
    user = "docspell"
    password = "docspell"
 }

Das Selbe machen wir auch beim Docspell-Restserver.

user@2204lts:~$ sudo nano /etc/docspell-restserver/docspell-server.conf

    # Configuration for PostgreSQL backend
    postgresql = {
      # Whether to use the default database, only works if it is
      # postgresql
      use-default-connection = true

      # The database connection.
      jdbc {
        url = "jdbc:postgresql://localhostr:5432/docspell"
        user = "docspell"
        password = "docspell"
      }

Komsicherweise ist die vordefinierte H2 Datenbank auch drinn, welche wir dann mal auskommentieren. Raus damit..

    # The database connection.
    #jdbc {
      # The JDBC url to the database. By default a H2 file-based
      # database is configured. You can provide a postgresql or
      # mariadb connection here. When using H2 use the PostgreSQL
      # compatibility mode and AUTO_SERVER feature.
      #url = "jdbc:h2://"${java.io.tmpdir}"/docspell-demo.db;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;AUTO_SERVER=TRUE"

      # The database user.
      #user = "sa"

      # The database password.
      #password = ""
    #}


So die Konfigs sehen nach meiner Meinung, bezogen auf Postgre-SQL, gut aus. Schauen wir uns mal den Service Status vom Docspell-Restserver an:

user@2204lts:~$ sudo systemctl status docspell-restserver.service
● docspell-restserver.service - Docspell Rest server
     Loaded: loaded (/lib/systemd/system/docspell-restserver.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-06-11 11:47:54 UTC; 6min ago
    Process: 707 ExecStartPre=/bin/mkdir -p /run/docspell-restserver (code=exited, status=0/SUCCESS)
    Process: 724 ExecStartPre=/bin/chown docspell:docspell /run/docspell-restserver (code=exited, status=0/SUCCESS)
    Process: 726 ExecStartPre=/bin/chmod 755 /run/docspell-restserver (code=exited, status=0/SUCCESS)
   Main PID: 732 (java)
      Tasks: 44 (limit: 9410)
     Memory: 291.8M
        CPU: 20.538s
     CGroup: /system.slice/docspell-restserver.service
             └─732 java -Dconfig.file=/usr/share/docspell-restserver/bin/../conf/docspell-server.conf -cp /usr/share/docspell-restserver/lib/com.github.eikek.>

Jun 11 11:48:04 2204lts docspell-restserver[732]: 2022.06.11 11:48:03:0037 [io-comp...] [INFO ] org.flywaydb.core.internal.command.DbMigrate - Migrating schem>
Jun 11 11:48:04 2204lts docspell-restserver[732]: 2022.06.11 11:48:04:0000 [io-comp...] [INFO ] org.flywaydb.core.internal.command.DbMigrate - Migrating schem>
Jun 11 11:48:04 2204lts docspell-restserver[732]: 2022.06.11 11:48:04:0001 [io-comp...] [INFO ] org.flywaydb.core.internal.command.DbMigrate - Migrating schem>
Jun 11 11:48:04 2204lts docspell-restserver[732]: 2022.06.11 11:48:04:0002 [io-comp...] [INFO ] org.flywaydb.core.internal.command.DbMigrate - Successfully ap>
Jun 11 11:48:04 2204lts docspell-restserver[732]: 2022.06.11 11:48:04:0003 [io-comp...] [INFO ] docspell.backend.ops.ONode.register:52 - Registering node rest1
Jun 11 11:48:05 2204lts docspell-restserver[732]: 2022.06.11 11:48:05:0000 [io-comp...] [INFO ] docspell.notification.api.EventExchange.consume:48 - Starting >
Jun 11 11:48:05 2204lts docspell-restserver[732]: 2022.06.11 11:48:05:0000 [io-comp...] [INFO ] docspell.pubsub.naive.NaivePubSub.subscribe:89 - Adding subscr>
Jun 11 11:48:05 2204lts docspell-restserver[732]: 2022.06.11 11:48:05:0001 [io-comp...] [INFO ] docspell.pubsub.naive.NaivePubSub.subscribe:89 - Adding subscr>
Jun 11 11:48:05 2204lts docspell-restserver[732]: 2022.06.11 11:48:05:0000 [io-comp...] [INFO ] org.http4s.blaze.channel.nio1.NIO1SocketServerGroup - Service >
Jun 11 11:48:05 2204lts docspell-restserver[732]: 2022.06.11 11:48:04:0004 [io-comp...] [INFO ] org.http4s.blaze.server.BlazeServerBuilder - http4s v0.23.12 o>
lines 1-23/23 (END)

Scheint zu laufen und irgend etwas mit der Datenbank zu machen(???). Wie gehts dem Docspell-Joex Service:

user@2204lts:~$ sudo systemctl status docspell-joex.service 
● docspell-joex.service - Docspell Joex
     Loaded: loaded (/lib/systemd/system/docspell-joex.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-06-11 11:53:06 UTC; 2min 55s ago
    Process: 1854 ExecStartPre=/bin/mkdir -p /run/docspell-joex (code=exited, status=0/SUCCESS)
    Process: 1855 ExecStartPre=/bin/chown docspell:docspell /run/docspell-joex (code=exited, status=0/SUCCESS)
    Process: 1856 ExecStartPre=/bin/chmod 755 /run/docspell-joex (code=exited, status=0/SUCCESS)
   Main PID: 1857 (java)
      Tasks: 41 (limit: 9410)
     Memory: 251.4M
        CPU: 16.140s
     CGroup: /system.slice/docspell-joex.service
             └─1857 java -Dconfig.file=/usr/share/docspell-joex/bin/../conf/docspell-joex.conf -cp /usr/share/docspell-joex/lib/com.github.eikek.docspell-joex>

Jun 11 11:53:13 2204lts docspell-joex[1857]: 2022.06.11 11:53:13:0002 [io-comp...] [INFO ] docspell.scheduler.impl.LogSink.logInternal:41 - >>> 2022-06-11T11:>
Jun 11 11:53:13 2204lts docspell-joex[1857]: 2022.06.11 11:53:12:0001 [io-comp...] [INFO ] docspell.scheduler.impl.LogSink.logInternal:41 - >>> 2022-06-11T11:>
Jun 11 11:53:13 2204lts docspell-joex[1857]: 2022.06.11 11:53:12:0003 [io-comp...] [INFO ] docspell.scheduler.impl.LogSink.logInternal:41 - >>> 2022-06-11T11:>
Jun 11 11:53:13 2204lts docspell-joex[1857]: 2022.06.11 11:53:12:0004 [io-comp...] [INFO ] docspell.scheduler.impl.SchedulerImpl.wrapTask:270 - Job execution >
Jun 11 11:53:13 2204lts docspell-joex[1857]: 2022.06.11 11:53:13:0000 [io-comp...] [INFO ] docspell.scheduler.impl.LogSink.logInternal:41 - >>> 2022-06-11T11:>
Jun 11 11:53:13 2204lts docspell-joex[1857]: 2022.06.11 11:53:12:0002 [io-comp...] [INFO ] docspell.scheduler.impl.LogSink.logInternal:41 - >>> 2022-06-11T11:>
Jun 11 11:53:13 2204lts docspell-joex[1857]: 2022.06.11 11:53:13:0001 [io-comp...] [INFO ] docspell.scheduler.impl.LogSink.logInternal:41 - >>> 2022-06-11T11:>
Jun 11 11:53:13 2204lts docspell-joex[1857]: 2022.06.11 11:53:12:0003 [io-comp...] [INFO ] docspell.scheduler.impl.SchedulerImpl.wrapTask:270 - Job execution >
Jun 11 11:53:13 2204lts docspell-joex[1857]: 2022.06.11 11:53:13:0003 [io-comp...] [INFO ] docspell.scheduler.impl.LogSink.logInternal:41 - >>> 2022-06-11T11:>
Jun 11 11:53:13 2204lts docspell-joex[1857]: 2022.06.11 11:53:13:0004 [io-comp...] [INFO ] docspell.scheduler.impl.LogSink.logInternal:41 - >>> 2022-06-11T11:>
lines 1-23/23 (END)

Ist ebenfalls UP and RUNNING. Klopfen wir mal von innen an dem HTTP Port 7880 mit /app an.

user@2204lts:~$ wget http://localhost:7880/app
--2022-06-11 11:57:10--  http://localhost:7880/app
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:7880... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4658 (4,5K) [text/html]
Saving to: ‘app’

app                                     100%[==============================================================================>]   4,55K  --.-KB/s    in 0s      

2022-06-11 11:57:11 (562 MB/s) - ‘app’ saved [4658/4658]


user@2204lts:~$ ls -la
total 72
drwxr-x--- 5 user user  4096 Jun 11 11:57 .
drwxr-xr-x 3 root root  4096 Apr 24 10:31 ..
-rw-rw-r-- 1 user user  4658 Jun 11 11:57 app

Ja, da ist jemand zu Hause und antwortet auch. Kurzer Test von Außen.. natürlich macht keiner das Türchen auf. Also auf in die Konfig vom Docspell-Joex. Hier bringt ein drehen an der Base-RL nix. Was könnte es denn sonst noch so sein?? Möglicherweise die bindings {}. Also drehen wir mal daran und gucken, ob dann anspringt. Zu erst in der Konfiguration vom Docspell-Joex, welche unter folgendem Pfad zu finden ist: /etc/docspell-joex/docspell-joex.conf

  bind {
#    address = "localhost"
    address = "0.0.0.0"
    port = 7878
  }

Und dann noch die Konfiguration vom Docspell-Restserver, welche unter folgendem Pfad zu finden ist: /etc/docspell-restserver/docspell-server.conf

  bind {
#    address = "localhost"
    address = "0.0.0.0"
    port = 7880
  }

Jetzt sollten die beiden Services auch von Außen zu erreichen sein. Testen wir das mal mit dem 7880 Socket.

Eureka!! Der Websever ist am Start! Dann wollen wir mal einen neuen User Anlegen, zum Testen nehme ich
Collective ID: docspell
User: docspell
Password: docspell

Und mach anschließend den Login mit diesen Credentionalls…

Und siehe da, das Docspell Dashboard meldet sich wie erhöfft.

Das macht doch einen sehr aufgeräumten Eindruck. Dann werden wir ihm doch gleich mal ein paar Pdfs und PPtx zum verarbeiten hineinwerfen und sehen, was Docspell daraus macht.

Nach dem Clicken auf Submit legt Docspell nun los. Zu erkennen ist dieses an der Rückmeldung.

Und anschließend an Processing.

Irgendwo scheint es jetzt aber noch zu klemmen. Die zu importierenden Dateien hängen jetzt seit 15 Minuten in der Processing Queue werden nicht weniger…

Nach einiger Suche in der Dokumentation und anschließend in den Configs stellte sich heraus, das Solr nicht sauber als Backend eingebunden war und nun alles läuft.

14. Erstes Fazit

Ich habe Docspell mall 99 PDF Files für den Import angeboten. Diese werden über alle vier CPUs der VM importiert in worklich flottem Tempo. Von den nun 16GByte für die VM werden dabei 6GByte genutzt und 10GByte bleiben verfügbar.

Von den im Feature-Guide als supporteten Filetypes habe ich mal die für mich gängigen überprüft und ja, diese werden zum einen Supportet und damit sauber importiert.

Die von mir am meistens genutzten Standard-Typen liefen ohne Probleme:

doc/x + xls/x+ pdf + odt + ods + txt + jpg + png + html

Positiv zu erwähnen ist die autemberaubt schnelle Context-Suche mittels Solr, das Ding zieht mal richtig die Wurst vom Teller!

Ich werde in der nächsten Zeit noch einmal Docspell und Paperless-ngx einem detaillierten Stresstest unterziehen und berichten, bevor ich einen Schritt weiter gehe und mal meinen gesamten Papierberg auf das mögliche Tool der Wahl werfe.

Das könnte dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.