<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Paperless – Serverküche</title><link>https://serverkueche.de/tags/paperless/</link><description>Paperless – Neueste Beiträge von Serverküche</description><generator>Hugo</generator><language>de-DE</language><managingEditor>feedback@serverkueche.de (Serverküche)</managingEditor><webMaster>feedback@serverkueche.de (Serverküche)</webMaster><copyright>2026 Serverküche</copyright><lastBuildDate>Mon, 20 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/paperless/index.xml" rel="self" type="application/rss+xml"/><item><title>Paperless-ngx selbst hosten: papierloses Büro mit OCR</title><link>https://serverkueche.de/tutorials/paperless-dokumentenverwaltung/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/paperless-dokumentenverwaltung/</guid><description>Paperless-ngx mit Docker hinter Traefik aufsetzen: Dokumente per OCR durchsuchbar archivieren – mit Volltextsuche, Tags und automatischem Import.</description><content:encoded><![CDATA[<p>Rechnungen, Verträge, Behördenpost – der Papierstapel wächst und wächst, und finden tust du
am Ende doch nie etwas. <strong>Paperless-ngx</strong> macht daraus ein durchsuchbares digitales Archiv: Du wirfst ein
Dokument hinein, es wird per <strong>OCR</strong> erkannt, verschlagwortet und ist über die
Volltextsuche in Sekunden wieder da. In diesem Rezept setzen wir es hinter Traefik auf.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende läuft <strong>Paperless-ngx 2.20</strong> hinter deinem Traefik-Proxy, erreichbar unter
<code>https://paperless.DEINE_DOMAIN</code> mit HTTPS. Paperless ist ein Dokumenten-Management-System:
Du fütterst es mit Scans oder PDFs, es liest den Text per <strong>OCR</strong> aus (auch aus reinen
Bild-Scans), erkennt Datum und Inhalt und legt alles durchsuchbar ab. Über Tags,
Korrespondenten und Dokumenttypen bringst du Ordnung hinein; die Volltextsuche findet
später jedes Dokument.</p>
<p>Der Clou ist der <strong>Consume-Ordner</strong>: Alles, was du dort ablegst (z. B. vom Netzwerk-Scanner),
wird automatisch importiert und verarbeitet. Paperless besteht aus <strong>fünf Containern</strong> –
dem Webserver, einer PostgreSQL-Datenbank, einem Redis-Broker für die
Hintergrundverarbeitung sowie <strong>Gotenberg</strong> und <strong>Tika</strong>, die Office-Dokumente in PDF
umwandeln. Die offizielle Vorlage liefert das komplette Gespann.</p>
<p>Der Gewinn gegenüber einem Ordner voller PDFs auf der Festplatte: Paperless macht jedes
Dokument <strong>durchsuchbar</strong> (auch eingescanntes Papier), hält Original und Archivversion
sauber getrennt und lässt sich per Regeln automatisieren. Deine Unterlagen bleiben dabei
auf deinem Server – kein Cloud-Dienst liest mit, und du bist nicht an ein proprietäres
Format gebunden.</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein laufender <strong>Traefik-Reverse-Proxy</strong> mit dem <code>proxy</code>-Netzwerk und dem Resolver <code>le</code>
– siehe <a href="/tutorials/reverse-proxy-traefik/">Reverse Proxy mit Traefik</a>.</li>
<li>Eine Subdomain <code>paperless.DEINE_DOMAIN</code> mit DNS-Record auf deine Server-IP – siehe
<a href="/tutorials/domain-mit-server-verbinden/">Domain mit Server verbinden</a>.</li>
<li>Ein <strong>Backup</strong>. In Paperless landen deine wichtigsten Unterlagen – richte zuerst
<a href="/tutorials/backups-mit-restic/">Backups mit Restic</a> ein.</li>
</ul>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Wie groß muss der Server sein?
  </p>
  <div class="prose-kitchen text-sm">Paperless selbst ist genügsam, aber es sind fünf Container, und die <strong>OCR-Verarbeitung ist
CPU-lastig</strong>: Beim Erkennen eines Scans läuft ein Kern für einige Sekunden bis Minuten auf
Anschlag. Für den privaten Gebrauch reichen <strong>2 vCPU und 4 GB RAM</strong> gut; der getestete VPS
1000 (4 vCore / 8 GB) hat reichlich Luft. Beim Massenimport vieler Dokumente merkst du die
CPU-Last – dann verarbeitet Paperless die Warteschlange eben nach und nach ab.</div>
</div>
<p>Unsicher, welche Server-Größe reicht? Der <a href="/serverempfehlung/">Server-Rechner</a> rechnet dir
RAM- und CPU-Bedarf für deine Dienste aus.</p>
<div class="not-prose my-6 overflow-hidden rounded-xl border border-paprika-200 bg-paprika-50 dark:border-paprika-800 dark:bg-paprika-900/20">
  <div class="flex items-center justify-between border-b border-paprika-200 bg-paprika-100 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-paprika-700 dark:border-paprika-800 dark:bg-paprika-900/40 dark:text-paprika-300">
    <span>🍳 Empfehlung</span>
    <span title="Mit * markierte Links sind Affiliate-Links.">Anzeige</span>
  </div>
  <div class="flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:justify-between">
    <div>
      <p class="text-lg font-bold text-slate-900 dark:text-white">VPS 1000 G12</p>
      <p class="mt-1 text-sm text-slate-600 dark:text-slate-300">4 vCore · 8 GB RAM · 256 GB NVMe</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">ab 10,36 €/Monat</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">Der VPS 1000 stemmt Paperless samt OCR locker.</p>
    </div>
    <a href="https://www.netcup.com/de/server/vps/vps-1000-g12-12m?ref=44083" rel="sponsored noopener" target="_blank"
   class="inline-flex shrink-0 items-center justify-center rounded-lg bg-paprika-600 px-5 py-2.5 font-semibold text-white transition-colors hover:bg-paprika-700">
  Zu netcup →
</a>

  </div><div class="px-4 pb-4"><p class="not-prose my-3 flex flex-wrap items-center gap-x-2 gap-y-1 rounded-lg border border-herb-500/40 bg-herb-50 px-3 py-2 text-sm text-slate-700 dark:bg-herb-900/20 dark:text-slate-200">
  <span>💶 <strong>5 € Gutschein</strong> für netcup-Neukunden:</span>
  <code class="rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 dark:bg-slate-800 dark:text-herb-400">36nc17844976032</code>
  <span class="text-xs text-slate-500 dark:text-slate-400">(nur Neukunden, keine Domains)</span>
</p></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-dns-record-anlegen">Schritt 1: DNS-Record anlegen</h3>
<p>Lege <code>paperless.DEINE_DOMAIN</code> an (A/AAAA auf deine Server-IP) und prüfe:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dig +short paperless.DEINE_DOMAIN</span></span></code></pre></div>
</div>
<p>Es muss deine Server-IP zurückkommen – sonst holt Traefik später kein Zertifikat.</p>
<h3 id="schritt-2-einen-secret-key-erzeugen">Schritt 2: Einen Secret Key erzeugen</h3>
<p>Paperless verschlüsselt Sitzungen mit einem geheimen Schlüssel. Der Default ist <strong>öffentlich
bekannt</strong> – bei einer Instanz im Internet ein echtes Risiko. Erzeuge einen eigenen:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">head -c <span class="m">50</span> /dev/urandom <span class="p">|</span> base64</span></span></code></pre></div>
</div>
<p>Kopiere die Ausgabe – sie kommt gleich als <code>PAPERLESS_SECRET_KEY</code> in die Konfiguration.</p>
<h3 id="schritt-3-die-composeyaml-anlegen">Schritt 3: Die compose.yaml anlegen</h3>
<p>Leg das Projekt an – <strong>inklusive</strong> der beiden Bind-Mount-Ordner:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p ~/paperless/<span class="o">{</span>consume,export<span class="o">}</span> <span class="o">&amp;&amp;</span> <span class="nb">cd</span> ~/paperless</span></span></code></pre></div>
</div>
<p>Die Unterordner <code>consume</code> und <code>export</code> legst du bewusst <strong>jetzt, als normaler
Benutzer</strong> an: Würde erst der Docker-Daemon sie beim Start erzeugen, gehörten sie
<code>root</code> – dann könnten weder du (<code>cp</code> in den Consume-Ordner) noch Paperless selbst
(läuft via <code>USERMAP_UID</code> als UID 1000) hineinschreiben.</p>
<p>Erstelle <code>compose.yaml</code>. Ersetze <code>paperless.DEINE_DOMAIN</code>, die Passwörter und den
<code>PAPERLESS_SECRET_KEY</code>:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">paperless</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">broker</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">docker.io/library/redis:8</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">redisdata:/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">networks</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">default]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">db</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">docker.io/library/postgres:18</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">POSTGRES_DB</span><span class="p">:</span><span class="w"> </span><span class="l">paperless</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">POSTGRES_USER</span><span class="p">:</span><span class="w"> </span><span class="l">paperless</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">POSTGRES_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="l">EIN_STARKES_DB_PASSWORT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">pgdata:/var/lib/postgresql</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">networks</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">default]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">gotenberg</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">docker.io/gotenberg/gotenberg:8.34</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;gotenberg&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--chromium-disable-javascript=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;--chromium-allow-list=file:///tmp/.*&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">networks</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">default]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">tika</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">docker.io/apache/tika:3.3.1.0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">networks</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">default]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">webserver</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ghcr.io/paperless-ngx/paperless-ngx:2.20.15</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">depends_on</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">db, broker, gotenberg, tika]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_REDIS</span><span class="p">:</span><span class="w"> </span><span class="l">redis://broker:6379</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_DBHOST</span><span class="p">:</span><span class="w"> </span><span class="l">db</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_DBUSER</span><span class="p">:</span><span class="w"> </span><span class="l">paperless</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_DBPASS</span><span class="p">:</span><span class="w"> </span><span class="l">EIN_STARKES_DB_PASSWORT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_TIKA_ENABLED</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_TIKA_GOTENBERG_ENDPOINT</span><span class="p">:</span><span class="w"> </span><span class="l">http://gotenberg:3000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_TIKA_ENDPOINT</span><span class="p">:</span><span class="w"> </span><span class="l">http://tika:9998</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_URL</span><span class="p">:</span><span class="w"> </span><span class="l">https://paperless.DEINE_DOMAIN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_SECRET_KEY</span><span class="p">:</span><span class="w"> </span><span class="l">DEIN_LANGER_SECRET_KEY</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_OCR_LANGUAGE</span><span class="p">:</span><span class="w"> </span><span class="l">deu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_TIME_ZONE</span><span class="p">:</span><span class="w"> </span><span class="l">Europe/Berlin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_ADMIN_USER</span><span class="p">:</span><span class="w"> </span><span class="l">admin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">PAPERLESS_ADMIN_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="l">EIN_STARKES_ADMIN_PASSWORT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">USERMAP_UID</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1000&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">USERMAP_GID</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1000&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">data:/usr/src/paperless/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">media:/usr/src/paperless/media</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./export:/usr/src/paperless/export</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./consume:/usr/src/paperless/consume</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.enable=true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.ppl.rule=Host(`paperless.DEINE_DOMAIN`)&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.ppl.entrypoints=websecure&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.routers.ppl.tls.certresolver=le&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;traefik.http.services.ppl.loadbalancer.server.port=8000&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">networks</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">default, proxy]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">data</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">media</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">pgdata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">redisdata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">networks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">default</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">proxy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">external</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div>
</div>
<p>Die wichtigsten Punkte:</p>
<ul>
<li><strong>Nur <code>webserver</code> hängt im <code>proxy</code>-Netz</strong> und trägt Traefik-Labels (Port <strong>8000</strong>). Die
vier Hilfsdienste (db, broker, gotenberg, tika) bleiben intern.</li>
<li><strong><code>PAPERLESS_URL</code></strong> ist Pflicht hinter einem Proxy. Fehlt sie, weist Paperless den Login
mit einem CSRF-/„403 Forbidden&quot;-Fehler ab. Sie setzt zugleich die erlaubten Hosts und die
vertrauenswürdigen Ursprünge.</li>
<li><strong><code>PAPERLESS_OCR_LANGUAGE: deu</code></strong> stellt die Texterkennung auf Deutsch. Deutsch, Englisch
und ein paar weitere Sprachen sind im Image bereits enthalten – kein Zusatzpaket nötig.</li>
<li><strong><code>PAPERLESS_ADMIN_USER</code> / <code>_PASSWORD</code></strong> legen beim ersten Start automatisch den
Superuser an, sodass du dich direkt anmelden kannst.</li>
<li><strong><code>USERMAP_UID</code>/<code>GID</code></strong> sollten zur Kennung deines Server-Benutzers passen (per <code>id -u</code>
bzw. <code>id -g</code> ermitteln, meist <code>1000</code>). Sonst gibt es „Permission denied&quot; im Consume-Ordner.</li>
<li><strong><code>export</code> und <code>consume</code></strong> sind bewusst Ordner im Projektverzeichnis (Bind-Mounts):
<code>consume</code> ist der Eingangskorb, <code>export</code> das Ziel für Backups.</li>
</ul>
<p>Paperless nutzt insgesamt <strong>vier Speicherbereiche</strong>, die du auseinanderhalten solltest:
<code>media</code> enthält deine <strong>verarbeiteten Dokumente</strong> (das Herzstück!), <code>data</code> den Suchindex und
Hilfsdaten, <code>consume</code> ist der Eingangskorb und <code>export</code> das Backup-Ziel. Fürs Backup zählen
<code>media</code> und <code>data</code> sowie die Datenbank – genau das nimmt dir der <code>document_exporter</code> weiter
unten ab.</p>
<h3 id="schritt-4-starten-und-anmelden">Schritt 4: Starten und anmelden</h3>
<p>Zieh die Images (mehrere GB) und starte:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose up -d
</span></span><span class="line"><span class="cl">docker compose logs -f webserver</span></span></code></pre></div>
</div>
<p>Beim ersten Start richtet Paperless die Datenbank ein (Migrationen) – das dauert einen
Moment. Prüfe, dass alle fünf Container laufen:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose ps</span></span></code></pre></div>
</div>
<p>Du solltest <code>webserver</code>, <code>db</code>, <code>broker</code>, <code>gotenberg</code> und <code>tika</code> mit Status <code>running</code> sehen
(der <code>webserver</code> wird nach kurzer Zeit <code>healthy</code>). Ist der Worker bereit (<code>celery@… ready</code>
im Log), ruf <code>https://paperless.DEINE_DOMAIN</code> auf. Es erscheint die Anmeldeseite:</p>
<p><figure class="my-6"><img src="/tutorials/paperless-dokumentenverwaltung/paperless-login_hu_13e9e045d044f4df.webp" srcset="/tutorials/paperless-dokumentenverwaltung/paperless-login_hu_250396419bfda38b.webp 480w, /tutorials/paperless-dokumentenverwaltung/paperless-login_hu_13e9e045d044f4df.webp 768w, /tutorials/paperless-dokumentenverwaltung/paperless-login_hu_1d250bfe93a42aaf.webp 1200w, /tutorials/paperless-dokumentenverwaltung/paperless-login_hu_2f11ff58ed680cd4.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/paperless-dokumentenverwaltung/paperless-login_hu_14bc256f3e25ec2b.webp"
    alt="Die Anmeldeseite von Paperless-ngx unter der eigenen Domain" title="Die Anmeldung – Superuser wurde per Umgebungsvariable angelegt"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Die Anmeldung – Superuser wurde per Umgebungsvariable angelegt</figcaption></figure></p>
<p>Melde dich mit <code>admin</code> und deinem Passwort an. Du landest auf der <strong>Startseite</strong> mit einer
kurzen Willkommensmeldung und ersten Statistiken. Ganz unten links siehst du die laufende
<strong>Version</strong> – praktisch, um vor einem Update den Ausgangsstand zu kennen. Die Sprache
kannst du bei Bedarf unter <strong>Einstellungen</strong> umstellen; standardmäßig folgt Paperless der
Sprache deines Browsers:</p>
<p><figure class="my-6"><img src="/tutorials/paperless-dokumentenverwaltung/paperless-dashboard_hu_6220515987835f18.webp" srcset="/tutorials/paperless-dokumentenverwaltung/paperless-dashboard_hu_a2ec722d2c48e2cc.webp 480w, /tutorials/paperless-dokumentenverwaltung/paperless-dashboard_hu_6220515987835f18.webp 768w, /tutorials/paperless-dokumentenverwaltung/paperless-dashboard_hu_4fa62c1cd86dc4cf.webp 1200w, /tutorials/paperless-dokumentenverwaltung/paperless-dashboard_hu_dbff5143da947ab3.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/paperless-dokumentenverwaltung/paperless-dashboard_hu_c1999cd8336d31ca.webp"
    alt="Die Startseite von Paperless-ngx mit Willkommensmeldung und Statistik-Widget" title="Die Startseite nach dem ersten Login"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Die Startseite nach dem ersten Login</figcaption></figure></p>
<h3 id="schritt-5-das-erste-dokument-einlesen">Schritt 5: Das erste Dokument einlesen</h3>
<p>Jetzt der Kern. Es gibt drei Wege, ein Dokument hineinzubekommen:</p>
<ol>
<li><strong>Über die Weboberfläche:</strong> oben rechts auf <strong>Dokumente hochladen</strong> und eine PDF- oder
Bilddatei auswählen.</li>
<li><strong>Über den Consume-Ordner:</strong> Leg eine Datei in <code>~/paperless/consume</code> – Paperless erkennt
sie automatisch, verarbeitet sie und löscht sie danach aus dem Ordner. Ideal für einen
Netzwerk-Scanner, der direkt dorthin scannt.</li>
<li><strong>Aus einem Postfach:</strong> Paperless kann unter <strong>E-Mail</strong> ein IMAP-Konto abrufen und
Anhänge automatisch einlesen – praktisch für Rechnungen, die dir ohnehin per Mail kommen.</li>
</ol>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp ~/eine-rechnung.pdf ~/paperless/consume/</span></span></code></pre></div>
</div>
<p>Paperless nimmt PDFs, Bilder (JPG/PNG/TIFF) und – dank Gotenberg und Tika – auch
Office-Dateien wie Word oder Excel an. Bei einem reinen Bild-Scan liest die <strong>OCR</strong> den Text
aus und legt ihn als durchsuchbare Ebene über das Dokument; bei einem PDF mit vorhandenem
Textlayer überspringt Paperless die Erkennung und ist entsprechend schneller. Das Original
bleibt dabei unangetastet erhalten – Paperless erzeugt zusätzlich eine durchsuchbare
Archiv-Version.</p>
<p>Nach ein paar Sekunden (OCR braucht etwas Zeit) taucht das Dokument unter <strong>Dokumente</strong> auf –
mit einer Vorschau und dem erkannten Titel:</p>
<p><figure class="my-6"><img src="/tutorials/paperless-dokumentenverwaltung/paperless-dokumente_hu_aa3ea386e65762ca.webp" srcset="/tutorials/paperless-dokumentenverwaltung/paperless-dokumente_hu_6d8fc0b01dfc2042.webp 480w, /tutorials/paperless-dokumentenverwaltung/paperless-dokumente_hu_aa3ea386e65762ca.webp 768w, /tutorials/paperless-dokumentenverwaltung/paperless-dokumente_hu_5a95a611ea70adf4.webp 1200w, /tutorials/paperless-dokumentenverwaltung/paperless-dokumente_hu_ae6c8e64a39d2558.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/paperless-dokumentenverwaltung/paperless-dokumente_hu_fabb843514ed759b.webp"
    alt="Die Dokumentenliste von Paperless-ngx mit einem verarbeiteten Dokument als Kachel" title="Die Dokumentenliste – das eingelesene Dokument ist sofort durchsuchbar"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Die Dokumentenliste – das eingelesene Dokument ist sofort durchsuchbar</figcaption></figure></p>
<p>Ein Klick öffnet die <strong>Detailansicht</strong>: links die Metadaten (Titel, Datum, Korrespondent,
Tags) und die Reiter für Inhalt, Metadaten und Verlauf, rechts das Dokument mit einer
zoombaren Vorschau. Paperless hat aus dem Scan bereits das <strong>Datum erkannt</strong> und
schlägt es zur Bestätigung vor – genau das leistet die OCR im Hintergrund für dich:</p>
<p><figure class="my-6"><img src="/tutorials/paperless-dokumentenverwaltung/paperless-dokument-detail_hu_a62a5197dcfa1428.webp" srcset="/tutorials/paperless-dokumentenverwaltung/paperless-dokument-detail_hu_853b7adaaa974b3d.webp 480w, /tutorials/paperless-dokumentenverwaltung/paperless-dokument-detail_hu_a62a5197dcfa1428.webp 768w, /tutorials/paperless-dokumentenverwaltung/paperless-dokument-detail_hu_f2c15bca02914d94.webp 1200w, /tutorials/paperless-dokumentenverwaltung/paperless-dokument-detail_hu_4898762c6bc95430.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/paperless-dokumentenverwaltung/paperless-dokument-detail_hu_5304402e81a3d611.webp"
    alt="Die Detailansicht eines Dokuments in Paperless-ngx mit Metadaten links und dem erkannten Dokument rechts" title="Detailansicht: OCR hat Text und Datum erkannt, Metadaten lassen sich ergänzen"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Detailansicht: OCR hat Text und Datum erkannt, Metadaten lassen sich ergänzen</figcaption></figure></p>
<h3 id="schritt-6-ordnung-mit-tags-korrespondenten--dokumenttypen">Schritt 6: Ordnung mit Tags, Korrespondenten &amp; Dokumenttypen</h3>
<p>Damit die Suche später greift, vergibst du <strong>Tags</strong> (z. B. <code>Steuer</code>, <code>Versicherung</code>),
ordnest einen <strong>Korrespondenten</strong> (den Absender) und einen <strong>Dokumenttyp</strong> (Rechnung,
Vertrag …) zu. Das kannst du von Hand machen – oder Paperless über <strong>Arbeitsabläufe</strong>
automatisieren: Regeln, die eingehende Dokumente anhand ihres Inhalts automatisch
verschlagworten. So sortiert sich dein Archiv mit der Zeit von selbst.</p>
<p>Die <strong>Volltextsuche</strong> oben durchsucht danach nicht nur Titel und Tags, sondern den
kompletten erkannten Text – eine Suche nach <code>Rechnungsbetrag</code> oder einem Kundennamen findet
das passende Dokument in Sekunden. Kombiniert mit den Filtern (Korrespondent, Zeitraum,
Dokumenttyp) wird der Papierstapel endgültig zum durchsuchbaren Archiv.</p>
<p>Ein einfaches Beispiel für einen <strong>Arbeitsablauf</strong>: Enthält ein neues Dokument das Wort
„Stromabrechnung&quot;, vergib automatisch den Tag <code>Energie</code>, setz den Korrespondenten auf deinen
Stromanbieter und den Dokumenttyp auf <code>Rechnung</code>. Solche Regeln legst du unter
<strong>Verwaltung → Arbeitsabläufe</strong> an; sie greifen bei jedem eingehenden Dokument. Anfangs
lohnt es sich, ein paar Dokumente von Hand zu sortieren – daraus siehst du schnell, welche
Regeln sich wiederholen und automatisieren lassen. Nach ein paar Wochen landet der Großteil
deiner Post ohne dein Zutun am richtigen Platz.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Scanner direkt in den Consume-Ordner
  </p>
  <div class="prose-kitchen text-sm">Der volle Komfort entsteht mit einem Dokumentenscanner. Richte auf dem Server eine
Netzwerkfreigabe (z. B. Samba) ein, die auf <code>~/paperless/consume</code> zeigt, und stelle deinen
Scanner so ein, dass er dorthin scannt. Ab dann gilt: Blatt einlegen, Knopf drücken – wenige
Sekunden später ist das Dokument erkannt, verschlagwortet und durchsuchbar im Archiv. Für
unterwegs gibt es zudem Community-Apps (z. B. „Paperless Mobile&quot;), die sich mit deiner
Instanz verbinden.</div>
</div>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Deine Unterlagen hängen im Internet
  </p>
  <div class="prose-kitchen text-sm">In Paperless liegen sensible Dokumente – Rechnungen, Verträge, Behördenpost. Sobald die
Instanz über <code>paperless.DEINE_DOMAIN</code> erreichbar ist, steht die Anmeldeseite offen im Netz.
Vergib deshalb ein <strong>langes, einmaliges Passwort</strong>, und aktiviere unter <strong>Einstellungen</strong> die
<strong>Zwei-Faktor-Authentifizierung</strong>. Wer maximale Sicherheit will, macht Paperless nur über ein
VPN erreichbar – für ein reines Privatarchiv, das nur du nutzt, ist das eine Überlegung wert.</div>
</div>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<p><strong>Symptom:</strong> Beim Login erscheint „<strong>Forbidden (403)</strong>&quot; oder „CSRF verification failed&quot;.</p>
<p><strong>Ursache &amp; Lösung:</strong> <code>PAPERLESS_URL</code> ist nicht oder falsch gesetzt. Sie muss exakt deiner
HTTPS-Adresse entsprechen (<code>https://paperless.DEINE_DOMAIN</code>, ohne Schrägstrich am Ende).
Nach der Korrektur <code>docker compose up -d</code>.</p>
<p><strong>Symptom:</strong> Dateien im Consume-Ordner werden nicht verarbeitet, „permission denied&quot;.</p>
<p><strong>Ursache &amp; Lösung:</strong> Häufigste Ursache: Die Ordner wurden nicht vorab angelegt
(Schritt 3), sondern beim ersten Start vom Docker-Daemon erzeugt – dann gehören sie
<code>root</code>. Mit <code>sudo chown -R $(id -u):$(id -g) ~/paperless/consume ~/paperless/export</code>
gehören sie wieder dir. Ansonsten: <code>USERMAP_UID</code>/<code>USERMAP_GID</code> passen nicht zum
Besitzer des Ordners – ermittle deine Kennung mit <code>id -u</code> und <code>id -g</code>, trag die Werte
ein und starte neu.</p>
<p><strong>Symptom:</strong> Hochgeladene Dokumente bleiben „in Bearbeitung&quot; hängen.</p>
<p><strong>Ursache &amp; Lösung:</strong> Die Hintergrundverarbeitung läuft über Redis. Prüfe, dass der
<code>broker</code>-Container läuft, und sieh unter <strong>Dateiaufgaben</strong> nach der Fehlermeldung der
fehlgeschlagenen Aufgabe.</p>
<p><strong>Symptom:</strong> Die Texterkennung liefert Unsinn oder erkennt nichts.</p>
<p><strong>Ursache &amp; Lösung:</strong> Falsche OCR-Sprache. Setz <code>PAPERLESS_OCR_LANGUAGE=deu</code> (oder
<code>deu+eng</code> für gemischte Dokumente). Nur installierte Sprachen funktionieren.</p>
<p><strong>Symptom:</strong> Office-Dokumente (Word, Excel) werden nicht angenommen oder enden im Timeout.</p>
<p><strong>Ursache &amp; Lösung:</strong> Dafür sind Gotenberg und Tika zuständig. Prüfe, dass beide Container
laufen und <code>PAPERLESS_TIKA_ENABLED=1</code> samt der beiden Endpoint-Variablen gesetzt ist.</p>
<p><strong>Symptom:</strong> Beim Massenimport wird der Server sehr langsam, die CPU ist dauerhaft am Anschlag.</p>
<p><strong>Ursache &amp; Lösung:</strong> OCR ist rechenintensiv, und Paperless nutzt standardmäßig alle Kerne.
Auf kleinen Servern kannst du die Last drosseln, indem du die Zahl der Worker bzw. Threads
begrenzt (<code>PAPERLESS_TASK_WORKERS</code>, <code>PAPERLESS_THREADS_PER_WORKER</code>). Dann dauert der Import
länger, aber die Oberfläche bleibt bedienbar.</p>
<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<ul>
<li>
<p><strong>Das saubere Backup macht der <code>document_exporter</code>.</strong> Er schreibt alle Dokumente,
Vorschaubilder, Metadaten und den Datenbankinhalt in den <code>export</code>-Ordner – portabel und
wieder importierbar:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose <span class="nb">exec</span> -T webserver document_exporter ../export</span></span></code></pre></div>
</div>
<p>Sichere den <code>export</code>-Ordner anschließend <strong>verschlüsselt und off-site</strong> mit
<a href="/tutorials/backups-mit-restic/">Restic</a>. Alternativ sicherst du die Volumes <code>media</code>,
<code>data</code> und die Datenbank direkt – der Exporter ist aber der empfohlene, umzugssichere Weg.</p>
</li>
<li>
<p><strong>Beim Wiederherstellen die gleiche Version verwenden.</strong> Ein Export enthält ein Abbild
passend zum Datenbank-Schema; spiel ihn nur in eine Paperless-Instanz <strong>derselben Version</strong>
ein (<code>document_importer ../export</code>).</p>
</li>
<li>
<p><strong>Updates.</strong> Vor dem Update ein Backup ziehen, dann den Image-Tag erhöhen (z. B.
<code>2.20.15</code> → nächste Version), <code>docker compose pull</code> und <code>docker compose up -d</code>. Die
Datenbank-Migrationen laufen beim Start automatisch. Bleib bei der stabilen <code>2.x</code>-Reihe –
die <code>3.0</code>-Beta ist noch nicht für den Produktivbetrieb gedacht.</p>
</li>
<li>
<p><strong>Backup automatisieren.</strong> Den <code>document_exporter</code> legst du am besten in einen täglichen
Cron-Job (z. B. nachts), der anschließend den <code>export</code>-Ordner per Restic sichert. So hast
du jeden Morgen einen frischen, wiederherstellbaren Stand – ohne daran denken zu müssen.</p>
</li>
<li>
<p><strong>Ehrlich zum Aufwand:</strong> Paperless läuft danach sehr wartungsarm. Der eigentliche Aufwand
ist das Einsortieren neuer Dokumente – das nimmt dir mit etwas eingerichteter Automatik
aber zunehmend die Software ab. Plane einmal die grobe Tag-Struktur, dann trägt sich das
Archiv weitgehend selbst.</p>
</li>
</ul>
]]></content:encoded></item></channel></rss>