<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tantivy-Archiv - Ivan Ivanov</title>
	<atom:link href="https://ivanivanov.de/blog/tag/tantivy/feed/" rel="self" type="application/rss+xml" />
	<link>https://ivanivanov.de/blog/tag/tantivy/</link>
	<description>Have you tried turning it off and on again?</description>
	<lastBuildDate>Tue, 18 Aug 2026 22:41:56 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
<site xmlns="com-wordpress:feed-additions:1">121858272</site>	<item>
		<title>Paperless-ngx Docker Upgrade: von 2.20.15 auf 3.0.4</title>
		<link>https://ivanivanov.de/blog/paperless-ngx-docker-upgrade-von-2-20-15-auf-3-0-4/</link>
		
		<dc:creator><![CDATA[Ivan]]></dc:creator>
		<pubDate>Tue, 18 Aug 2026 22:41:56 +0000</pubDate>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Docker Compose]]></category>
		<category><![CDATA[Homelab]]></category>
		<category><![CDATA[Paperless-ngx]]></category>
		<category><![CDATA[Self-Hosting]]></category>
		<category><![CDATA[Tantivy]]></category>
		<guid isPermaLink="false">https://ivanivanov.de/?p=5625</guid>

					<description><![CDATA[<p>Paperless-ngx Docker Upgrade: von 2.20.15 auf 3.0.4 Paperless-ngx 3.0 bringt Breaking Changes. Diese Anleitung zeigt das Upgrade einer Docker-Installation, Schritt für Schritt. Voraussetzung: Ausgangsversion muss 2.20.15 sein. Nur von dort aus ist der Sprung auf 3.0 offiziell unterstützt. Ältere Versionen zuerst auf 2.20.15 bringen. Was sich in 3.0 ändert Suchindex wechselt von Whoosh zu Tantivy [&#8230;]</p>
<p>Der Beitrag <a href="https://ivanivanov.de/blog/paperless-ngx-docker-upgrade-von-2-20-15-auf-3-0-4/">Paperless-ngx Docker Upgrade: von 2.20.15 auf 3.0.4</a> erschien zuerst auf <a href="https://ivanivanov.de">Ivan Ivanov</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="h-full" data-testid="chat-stale-nav-body">
<div class="flex flex-1 w-full -mt-[var(--df-header-h,0px)] h-[calc(100%+var(--df-header-h,0px))] overflow-hidden print:!h-auto print:!overflow-visible print:!mt-0">
<div class="z-20 draggable-none print:hidden overflow-hidden outline-none flex-grow-0 flex-shrink-0 basis-0 h-full pt-[var(--df-header-h,0px)]" tabindex="-1" aria-hidden="false">
<div class="flex flex-col h-full">
<div class="flex-1 overflow-hidden h-full bg-surface-1">
<div class="flex h-full flex-col relative outline-none bg-surface-3" tabindex="-1">
<div class="flex-1 min-h-0 bg-surface-3 overflow-auto">
<div class="flex h-full flex-col" data-skill-file-viewer="true">
<div class="min-h-0 flex-1">
<div class="h-full">
<div class="relative h-full">
<div class="absolute inset-0 overflow-auto scroll-fade-y scroll-fade-size-6">
<div class="mx-auto w-full max-w-3xl leading-[1.65rem] py-4 pl-6 pr-6 md:py-6 md:pl-11 md:pr-11">
<div>
<div class="standard-markdown grid-cols-1 grid [&amp;_&gt;_*]:min-w-0 gap-3 [&amp;_&gt;_*:last-child]:mb-0 print:block print:[&amp;_&gt;_:where(:not(:first-child))]:mt-3 font-claude-response">
<h1 class="mt-3 -mb-1 text-[1.375rem] font-bold" dir="ltr">Paperless-ngx Docker Upgrade: von 2.20.15 auf 3.0.4</h1>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Paperless-ngx 3.0 bringt Breaking Changes. Diese Anleitung zeigt das Upgrade einer Docker-Installation, Schritt für Schritt.</p>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr"><strong>Voraussetzung:</strong> Ausgangsversion muss 2.20.15 sein. Nur von dort aus ist der Sprung auf 3.0 offiziell unterstützt. Ältere Versionen zuerst auf 2.20.15 bringen.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Was sich in 3.0 ändert</h2>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1" dir="ltr">
<li class="font-claude-response-body whitespace-normal break-words pl-2">Suchindex wechselt von Whoosh zu Tantivy (Rust). Volltextindex muss neu aufgebaut werden, passiert im Docker-Image automatisch beim Start.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_SECRET_KEY</code> ist jetzt Pflicht.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_DBENGINE</code> ist bei PostgreSQL/MariaDB jetzt Pflicht (vorher aus <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_DBHOST</code> abgeleitet).</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Diverse SSL-/Timeout-/Pooling-Variablen der DB entfallen zugunsten von <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_DB_OPTIONS</code>.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">API-Version 1 fällt weg.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Dokument-Prüfsummen wechseln auf SHA-256.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Datenbankmigrationen sind nicht rückwärtskompatibel. Ohne Backup kein Rollback.</li>
</ul>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Vollständige Liste: <a class="underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current" href="https://github.com/paperless-ngx/paperless-ngx/releases">github.com/paperless-ngx/paperless-ngx/releases</a></p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 1: Backup</h2>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">cd /opt/paperless

docker compose stop

# Datenbank (Beispiel PostgreSQL)
docker compose exec -T db pg_dump -U paperless paperless &gt; /opt/backup/paperless-db-$(date +%F).sql

# Volumes sichern
sudo tar -czf /opt/backup/paperless-data-$(date +%F).tar.gz ./data
sudo tar -czf /opt/backup/paperless-media-$(date +%F).tar.gz ./media

# Compose-Files sichern
cp docker-compose.yml /opt/backup/docker-compose.yml.bak
cp docker-compose.env /opt/backup/docker-compose.env.bak</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Alternativ den eingebauten Paperless-Exporter nutzen:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"></div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">docker compose run --rm webserver document_exporter ../export</code></pre>
</div>
</div>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 2: Secret Key setzen</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Falls bisher kein <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_SECRET_KEY</code> gesetzt war, lief 2.x mit einem eingebauten Default-Key. Für 3.0 wird ein expliziter Key Pflicht.</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"></div>
<div class="text-text-500 font-small p-3.5 pb-0"></div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">openssl rand -base64 64</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">In <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">docker-compose.env</code> oder direkt in <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">docker-compose.yml</code> unter <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">environment</code> eintragen:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="yaml-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"></div>
</div>
<div class="text-text-500 font-small p-3.5 pb-0">yaml</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-yaml">PAPERLESS_SECRET_KEY: "&lt;generierter-wert&gt;"</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Wichtig: Wird ein neuer, zufälliger Key gesetzt statt des alten Default-Keys, werden bestehende Sessions und API-Tokens ungültig. Nutzer müssen sich neu anmelden.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 3: Datenbank-Engine explizit setzen</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Nur bei PostgreSQL oder MariaDB nötig, nicht bei SQLite.</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="yaml-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"></div>
</div>
<div class="text-text-500 font-small p-3.5 pb-0">yaml</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-yaml"># v2 (PostgreSQL wurde aus PAPERLESS_DBHOST abgeleitet)
PAPERLESS_DBHOST: postgres

# v3 (Engine muss explizit gesetzt sein)
PAPERLESS_DBENGINE: postgresql
PAPERLESS_DBHOST: postgres</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Zulässige Werte: <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">postgresql</code> oder <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">mariadb</code>. Bisherige einzelne SSL-/Timeout-/Pooling-Variablen durch <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_DB_OPTIONS</code> ersetzen, falls verwendet:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="yaml-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"></div>
</div>
<div class="text-text-500 font-small p-3.5 pb-0">yaml</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-yaml">PAPERLESS_DB_OPTIONS: "sslmode=require,pool.max_size=20"</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Alte Variablen funktionieren übergangsweise weiter, loggen aber eine Deprecation-Warnung beim Start.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 4: Image-Tag auf 3.0.4 setzen</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">In <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">docker-compose.yml</code>:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="yaml-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"></div>
</div>
<div class="text-text-500 font-small p-3.5 pb-0">yaml</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-yaml">services:
  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:2.20.15</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">ändern zu:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="yaml-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"></div>
</div>
<div class="text-text-500 font-small p-3.5 pb-0">yaml</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-yaml">services:
  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:3.0.4</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Wer bisher <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">:latest</code> nutzt: <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">:latest</code> zeigt seit Juli 2026 bereits auf 3.x. Für kontrollierte Major-Upgrades empfiehlt sich grundsätzlich ein fester Versions-Tag statt <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">:latest</code>.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 5: Neues Image ziehen und Container neu erstellen</h2>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">docker compose pull
docker compose up -d</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Der Suchindex-Rebuild (Whoosh → Tantivy) läuft beim ersten Start automatisch im Container. Bei größeren Archiven dauert das spürbar.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 6: Logs beobachten</h2>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">docker compose logs -f webserver</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Auf Migrationsfehler, fehlende Env-Variablen oder Reindex-Fortschritt achten.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 7: Verifikation</h2>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1" dir="ltr">
<li class="font-claude-response-body whitespace-normal break-words pl-2">Version in der Weboberfläche prüfen (Systemstatus zeigt 3.0.4).</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Volltextsuche testen, auch nach Umlauten und mehreren Suchbegriffen (Tantivy verknüpft Begriffe standardmäßig mit OR statt AND wie zuvor Whoosh).</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Ein Testdokument einscannen/konsumieren lassen, OCR-Ergebnis prüfen.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Download und Vorschau eines bestehenden Dokuments prüfen.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Login/API-Token testen, falls der Secret Key neu gesetzt wurde.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Containerstatus prüfen: <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">docker compose ps</code>.</li>
</ul>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Rollback</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Bei Problemen:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">docker compose down</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Alten Image-Tag (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">2.20.15</code>) in <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">docker-compose.yml</code> zurücksetzen, DB-Dump aus Schritt 1 einspielen, <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">data/</code> und <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">media/</code> aus dem Backup zurückkopieren, dann:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">docker compose up -d</code></pre>
</div>
</div>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Bekannte Stolperfallen</h2>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1" dir="ltr">
<li class="font-claude-response-body whitespace-normal break-words pl-2">Fehlender <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_SECRET_KEY</code> bricht den Start ab.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_DBENGINE</code> vergessen bei PostgreSQL/MariaDB führt zu Verbindungsfehlern.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Zusätzliche, verwaiste Container aus älteren Compose-Setups können mit dem neuen Consumer kollidieren.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Veraltete Syntax in globalen Dateinamensvorlagen kann nach dem Upgrade Fehler werfen.</li>
</ul>
<hr class="border-border-200 border-t-0.5 my-3 mx-1.5" />
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr"><strong>Quelle:</strong> <a class="underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current" href="https://github.com/paperless-ngx/paperless-ngx/releases">github.com/paperless-ngx/paperless-ngx/releases</a></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="contents print:hidden">
<div class="flex flex-col relative max-md:absolute max-md:inset-x-0 max-md:top-0 max-md:hidden md:z-0">
<div class="overflow-x-hidden overflow-y-auto md:h-[calc(100%-56px)] max-md:h-full max-md:border-t max-md:border-border-300 max-md:bg-surface-1 md:transition-[width] md:duration-300 md:ease-[cubic-bezier(0.4,0,0.2,1)] w-full md:mt-12 md:m-2 md:w-[384px] p-5 border-0.5 border-border-300 md:rounded-2xl max-md:border-0 md:absolute" aria-hidden="false">
<div class="md:w-[342px]">
<div class="flex flex-col gap-5 md:transition-opacity md:duration-300 md:animate-[fade_0.3s_ease-in-out_0.1s_forwards]">
<div class="flex flex-col gap-3">
<div class="flex flex-col gap-2">
<div id="_r_rm_" data-base-ui-tooltip-trigger="">
<div class="group/artifact-block relative flex text-left font-ui rounded-lg overflow-hidden border-0.5 transition duration-300 w-full hover:bg-bg-000/50 px-4 border-border-300 hover:border-border-200 !m-0">
<div class="artifact-block-cell flex flex-1 align-start justify-between w-full">
<div class="relative z-[1] flex items-center pointer-events-none [&amp;_button]:pointer-events-auto [&amp;_a]:pointer-events-auto">
<div class="flex min-w-0 items-center justify-center gap-2 shrink-0"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="absolute inset-x-0 bottom-0 -top-[var(--df-header-h,0px)] cursor-default" hidden="" data-testid="chat-stale-nav-shield" aria-hidden="true"></div>
<p>Der Beitrag <a href="https://ivanivanov.de/blog/paperless-ngx-docker-upgrade-von-2-20-15-auf-3-0-4/">Paperless-ngx Docker Upgrade: von 2.20.15 auf 3.0.4</a> erschien zuerst auf <a href="https://ivanivanov.de">Ivan Ivanov</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5625</post-id>	</item>
		<item>
		<title>Paperless-ngx Upgrade: von 2.20.15 auf 3.0.4 (Debian-VM auf Proxmox)</title>
		<link>https://ivanivanov.de/blog/paperless-ngx-upgrade-von-2-20-15-auf-3-0-4-debian-vm-auf-proxmox/</link>
		
		<dc:creator><![CDATA[Ivan]]></dc:creator>
		<pubDate>Tue, 18 Aug 2026 22:33:20 +0000</pubDate>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Homelab]]></category>
		<category><![CDATA[Paperless-ngx]]></category>
		<category><![CDATA[proxmox]]></category>
		<category><![CDATA[Self-Hosting]]></category>
		<category><![CDATA[Tantivy]]></category>
		<guid isPermaLink="false">https://ivanivanov.de/?p=5618</guid>

					<description><![CDATA[<p>Paperless-ngx Upgrade: von 2.20.15 auf 3.0.4 (Debian-VM auf Proxmox) Paperless-ngx 3.0 bringt Breaking Changes. Diese Anleitung zeigt das Bare-Metal-Upgrade auf einer Debian-VM unter Proxmox, Schritt für Schritt. Voraussetzung: Ausgangsversion muss 2.20.15 sein. Nur von dort aus ist der Sprung auf 3.0 offiziell unterstützt. Ältere Versionen zuerst auf 2.20.15 bringen. Was sich in 3.0 ändert Suchindex [&#8230;]</p>
<p>Der Beitrag <a href="https://ivanivanov.de/blog/paperless-ngx-upgrade-von-2-20-15-auf-3-0-4-debian-vm-auf-proxmox/">Paperless-ngx Upgrade: von 2.20.15 auf 3.0.4 (Debian-VM auf Proxmox)</a> erschien zuerst auf <a href="https://ivanivanov.de">Ivan Ivanov</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1 class="mt-3 -mb-1 text-[1.375rem] font-bold" dir="ltr">Paperless-ngx Upgrade: von 2.20.15 auf 3.0.4 (Debian-VM auf Proxmox)</h1>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Paperless-ngx 3.0 bringt Breaking Changes. Diese Anleitung zeigt das Bare-Metal-Upgrade auf einer Debian-VM unter Proxmox, Schritt für Schritt.</p>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr"><strong>Voraussetzung:</strong> Ausgangsversion muss 2.20.15 sein. Nur von dort aus ist der Sprung auf 3.0 offiziell unterstützt. Ältere Versionen zuerst auf 2.20.15 bringen.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Was sich in 3.0 ändert</h2>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1" dir="ltr">
<li class="font-claude-response-body whitespace-normal break-words pl-2">Suchindex wechselt von Whoosh zu Tantivy (Rust). Volltextindex muss neu aufgebaut werden.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_SECRET_KEY</code> ist jetzt Pflicht.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_DBENGINE</code> ist bei PostgreSQL/MariaDB jetzt Pflicht (vorher aus <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_DBHOST</code> abgeleitet).</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Diverse SSL-/Timeout-/Pooling-Variablen der DB entfallen zugunsten von <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_DB_OPTIONS</code>.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">API-Version 1 fällt weg.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Dokument-Prüfsummen wechseln auf SHA-256.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Consumer-/OCR-Variablen teils umbenannt, <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">OCR_MODE=skip</code>-Verhalten ändert sich.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Datenbankmigrationen sind nicht rückwärtskompatibel. Ohne Backup kein Rollback.</li>
</ul>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 1: Snapshot der Proxmox-VM</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Vor allem anderen: VM-Snapshot in Proxmox erstellen. Das ist der schnellste Rollback-Weg, unabhängig vom Applikations-Backup. Backup wichtig! Es kann immer was schief laufen!</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">qm snapshot &lt;VMID&gt; pre-paperless-3-0-4</code></pre>
</div>
</div>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 2: Anwendungs-Backup</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Zusätzlich zum Snapshot ein Paperless-eigenes Backup, da die DB-Migration nicht reversibel ist.</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">sudo systemctl stop paperless-webserver paperless-consumer paperless-scheduler paperless-task-queue

# Datenbank (Beispiel PostgreSQL)
sudo -u postgres pg_dump paperless &gt; /opt/backup/paperless-db-$(date +%F).sql

# Daten- und Medienverzeichnisse
sudo tar -czf /opt/backup/paperless-media-$(date +%F).tar.gz /opt/paperless/media
sudo tar -czf /opt/backup/paperless-data-$(date +%F).tar.gz /opt/paperless/data

# Konfiguration
sudo cp /opt/paperless/paperless.conf /opt/backup/paperless.conf.bak</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Bei SQLite genügt eine Kopie der <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">.sqlite3</code>-Datei aus dem Datenverzeichnis.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 3: Version prüfen</h2>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">cd /opt/paperless
sudo -Hu paperless git describe --tags</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Muss <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">v2.20.15</code> zeigen. Falls nicht: erst dorthin updaten, dann weiter.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 4: Secret Key sichern/setzen</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Falls bisher kein <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_SECRET_KEY</code> gesetzt war, lief 2.x mit einem eingebauten Default-Key. Für 3.0 wird ein expliziter Key Pflicht.</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">python3 -c "import secrets; print(secrets.token_urlsafe(64))"</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Wert in <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">paperless.conf</code> eintragen:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="ini-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"></div>
</div>
<div class="text-text-500 font-small p-3.5 pb-0">ini</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-ini">PAPERLESS_SECRET_KEY=&lt;generierter-wert&gt;</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Wichtig: Wird ein neuer, zufälliger Key gesetzt statt des alten Default-Keys, werden bestehende Sessions und API-Tokens ungültig. Nutzer müssen sich neu anmelden.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 5: Datenbank-Engine explizit setzen</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Nur bei PostgreSQL oder MariaDB nötig, nicht bei SQLite.</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="ini-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"></div>
</div>
<div class="text-text-500 font-small p-3.5 pb-0">ini</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-ini">PAPERLESS_DBENGINE=postgresql
PAPERLESS_DBHOST=postgres</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Zulässige Werte: <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">postgresql</code> oder <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">mariadb</code>. Bisherige einzelne SSL-/Timeout-/Pooling-Variablen durch <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_DB_OPTIONS</code> ersetzen, falls verwendet, z. B.:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="ini-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"></div>
</div>
<div class="text-text-500 font-small p-3.5 pb-0">ini</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-ini">PAPERLESS_DB_OPTIONS=sslmode=require,pool.max_size=20</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Alte Variablen funktionieren übergangsweise weiter, loggen aber eine Deprecation-Warnung beim Start.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 6: Systemabhängigkeiten aktualisieren</h2>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"></div>
</div>
<div class="text-text-500 font-small p-3.5 pb-0">bash</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">sudo apt update
sudo apt install --only-upgrade python3 python3-pip python3-dev imagemagick fonts-liberation \
  gnupg libpq-dev default-libmysqlclient-dev pkg-config libmagic-dev mime-support \
  libzbar0 poppler-utils unpaper ghostscript icc-profiles-free qpdf liblept5 \
  libxml2 pngquant zlib1g tesseract-ocr</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Ergänzend benötigte OCR-Sprachpakete (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">tesseract-ocr-deu</code> etc.) prüfen, falls sich Sprachvorgaben geändert haben.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 7: Dienste stoppen</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Falls Schritt 2 nicht schon erledigt:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">sudo systemctl stop paperless-webserver paperless-consumer paperless-scheduler paperless-task-queue</code></pre>
</div>
</div>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 8: Quellcode auf 3.0.4 bringen</h2>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right">
<div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"></div>
</div>
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">cd /opt/paperless
sudo -Hu paperless git fetch --all --tags
sudo -Hu paperless git checkout tags/v3.0.4</code></pre>
</div>
</div>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 9: Python-Abhängigkeiten aktualisieren</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Venv aktivieren und Requirements neu installieren:</p>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">sudo -Hu paperless bash -c '
  source /opt/paperless/venv/bin/activate
  pip install --upgrade pip
  pip install -r requirements.txt
'</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Danach die installierten Pakete gegen die neue <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">requirements.txt</code> abgleichen und nicht mehr benötigte Pakete entfernen, um Konflikte zu vermeiden.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 10: Datenbankmigration</h2>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">cd /opt/paperless/src
sudo -Hu paperless ../venv/bin/python3 manage.py migrate</code></pre>
</div>
</div>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 11: Statische Dateien und Suchindex</h2>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">sudo -Hu paperless ../venv/bin/python3 manage.py collectstatic --clear --no-input
sudo -Hu paperless ../venv/bin/python3 manage.py document_index reindex --if-needed</code></pre>
</div>
</div>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Der <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">--if-needed</code>-Flag prüft Schema-Version und Sprach-Sentinels und baut den Tantivy-Index nur neu, wenn nötig. Bei größeren Archiven (mehrere zehntausend Dokumente) dauert das spürbar; Fortschritt im Log beobachten.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 12: Dienste starten</h2>
<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100" tabindex="0" role="group" aria-label="bash-Code">
<div class="overflow-x-auto">
<pre class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5"><code class="language-bash">sudo systemctl start paperless-webserver paperless-consumer paperless-scheduler paperless-task-queue
sudo systemctl status paperless-webserver</code></pre>
</div>
</div>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Schritt 13: Verifikation</h2>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1" dir="ltr">
<li class="font-claude-response-body whitespace-normal break-words pl-2">Version in der Weboberfläche prüfen (Systemstatus zeigt 3.0.4).</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Volltextsuche testen, auch nach Umlauten und mehreren Suchbegriffen (Tantivy verknüpft Begriffe standardmäßig mit OR statt AND wie zuvor Whoosh).</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Ein Testdokument einscannen/konsumieren lassen, OCR-Ergebnis prüfen.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Download und Vorschau eines bestehenden Dokuments prüfen.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Login/API-Token testen, falls der Secret Key neu gesetzt wurde.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Log auf Fehler prüfen: <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">journalctl -u paperless-webserver -n 200</code>.</li>
</ul>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Rollback</h2>
<p class="font-claude-response-body break-words whitespace-normal" dir="ltr">Bei Problemen: Dienste stoppen, VM-Snapshot aus Schritt 1 zurückspielen. Alternativ Git-Checkout auf <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">v2.20.15</code>, DB-Dump aus Schritt 2 einspielen, altes <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">paperless.conf</code> zurückkopieren, Venv-Requirements der 2.20.15 neu installieren.</p>
<h2 class="mt-3 -mb-1 text-[1.125rem] font-bold" dir="ltr">Bekannte Stolperfallen</h2>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1" dir="ltr">
<li class="font-claude-response-body whitespace-normal break-words pl-2">Fehlender <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_SECRET_KEY</code> bricht den Start ab.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2"><code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">PAPERLESS_DBENGINE</code> vergessen bei PostgreSQL/MariaDB führt zu Verbindungsfehlern.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Veraltete Syntax in globalen Dateinamensvorlagen kann nach dem Upgrade Fehler werfen.</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Zusätzliche, nicht mehr benötigte Container/Prozesse aus älteren Setups können mit dem neuen Consumer kollidieren.</li>
</ul>
<p>Der Beitrag <a href="https://ivanivanov.de/blog/paperless-ngx-upgrade-von-2-20-15-auf-3-0-4-debian-vm-auf-proxmox/">Paperless-ngx Upgrade: von 2.20.15 auf 3.0.4 (Debian-VM auf Proxmox)</a> erschien zuerst auf <a href="https://ivanivanov.de">Ivan Ivanov</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5618</post-id>	</item>
	</channel>
</rss>
