<?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>Podcasts – Serverküche</title><link>https://serverkueche.de/tags/podcasts/</link><description>Podcasts – 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>Thu, 24 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/podcasts/index.xml" rel="self" type="application/rss+xml"/><item><title>Audiobookshelf: Hörbücher &amp; Podcasts selbst hosten</title><link>https://serverkueche.de/tutorials/audiobookshelf-hoerbuecher/</link><pubDate>Thu, 24 Sep 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/audiobookshelf-hoerbuecher/</guid><description>Audiobookshelf 2.36 mit Docker und Traefik einrichten: Hörbuch-Bibliothek mit Kapiteln, Podcast-Abos, serverseitiger Hörfortschritt und Apps fürs Handy.</description><content:encoded><![CDATA[<p>Hörbücher liegen bei den meisten als MP3-Sammlung auf einer Festplatte – und der Hörfortschritt
lebt im Kopf. Audiobookshelf macht daraus einen eigenen Hörbuch- und Podcast-Server, der sich
merkt, wo du stehen geblieben bist, auf dem Handy weiterspielt und Podcasts selbst nachlädt.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende läuft <strong>Audiobookshelf 2.36.0</strong> in Docker hinter deinem Traefik unter
<code>https://DEINE_DOMAIN</code>, mit gültigem Let&rsquo;s-Encrypt-Zertifikat. Du hast zwei Bibliotheken: eine
für <strong>Hörbücher</strong> (mit Kapiteln, Cover und Metadaten von Audible.de) und eine für <strong>Podcasts</strong>,
die neue Episoden automatisch holt. Der Hörfortschritt liegt serverseitig im Konto – du hörst
am Rechner dort weiter, wo das Handy aufgehört hat.</p>
<p>Für <strong>Musik</strong> ist Audiobookshelf nicht gedacht – dafür ist
<a href="/tutorials/navidrome-musik-streamen/">Navidrome</a> das passende Werkzeug, für Filme und
Serien <a href="/tutorials/jellyfin-medienserver/">Jellyfin</a>. Alle drei laufen problemlos parallel.</p>
<p>Audiobookshelf ist dabei erfreulich schlank: Der Container braucht im Leerlauf rund
<strong>55 MiB RAM</strong>, das Image ist 469 MB groß. Platz brauchen praktisch nur deine Audiodateien.</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein Server mit Debian 13 und Docker (getestet auf einem netcup VPS mit Docker 29.6.1 und
Compose v5.3.1)</li>
<li>Ein <strong>laufender Traefik</strong> samt <code>proxy</code>-Netz, wie im
<a href="/tutorials/reverse-proxy-traefik/">Reverse Proxy mit Traefik</a> eingerichtet</li>
<li>Eine Subdomain, die auf den Server zeigt – siehe
<a href="/tutorials/domain-mit-server-verbinden/">Domain mit dem Server verbinden</a></li>
<li>Grundlagen zu <a href="/tutorials/docker-compose-grundlagen/">Docker Compose</a> und
<a href="/tutorials/docker-volumes-vs-bind-mounts/">Bind Mounts</a></li>
<li>Deine Hörbuch-Dateien (MP3, M4B, FLAC …). Wenn du noch keine hast: LibriVox bietet
gemeinfreie Hörbücher, auch auf Deutsch.</li>
</ul>
<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"
     data-track-content data-content-name="Affiliate-Box · /tutorials/audiobookshelf-hoerbuecher/" data-content-piece="VPS 1000 G12.5">
  <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.5</p>
      <p class="mt-1 text-sm text-slate-600 dark:text-slate-300">4 vCore · 8 GB RAM · 128 GB SSD</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">ab 14,50 €/Monat</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">Reicht für Audiobookshelf locker – der Dienst selbst ist winzig, den Platz brauchen die Dateien.</p>
    </div>
    <a href="https://www.netcup.com/de/server/vps/vps-1000-g12.5-24m-eu?ref=44083#vps-1000-g12.5-12m-eu" rel="sponsored noopener" target="_blank"
   data-track-event="Affiliate|netcup: Affiliate-Box|VPS 1000 G12.5 · {page}"
   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"><div class="not-prose my-3 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"
     data-voucher-pool="vps-1000" data-voucher-codes="[&#34;6877nc17905136544&#34;,&#34;6877nc17905136543&#34;,&#34;6877nc17905136542&#34;,&#34;6877nc17905136541&#34;,&#34;6877nc17905136540&#34;,&#34;6877nc17905133999&#34;,&#34;6877nc17905133998&#34;,&#34;6877nc17905133997&#34;,&#34;6877nc17905133996&#34;,&#34;6877nc17905133995&#34;,&#34;6877nc17905133994&#34;,&#34;6877nc17905133993&#34;,&#34;6877nc17905133992&#34;,&#34;6877nc17905133991&#34;,&#34;6877nc17905133990&#34;]">
  <p class="flex flex-wrap items-center gap-x-2 gap-y-1">
    <span>💶 <span class="font-semibold">1 Monat gratis</span> für netcup-Neukunden:</span>
    <button type="button" data-voucher-code data-track-voucher="6877nc17905136544"
            title="Zum Kopieren klicken" class="cursor-pointer rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 hover:ring-2 hover:ring-herb-500/40 dark:bg-slate-800 dark:text-herb-400">6877nc17905136544</button>
    <button type="button" data-voucher-next hidden
            class="rounded border border-herb-500/40 px-2 py-0.5 text-xs text-herb-800 hover:bg-white dark:text-herb-400 dark:hover:bg-slate-800">anderer Code</button>
  </p>
  <p class="mt-1 text-xs text-slate-500 dark:text-slate-400">
    Einmal einlösbar, gilt für VPS 1000 G12.5.
    <a href="https://www.netcup.com/de/checkout/warenkorb?ref=44083" rel="sponsored noopener" target="_blank"
       data-track-event="Affiliate|netcup: Gutschein einlösen|VPS 1000 G12.5 · {page}"
       class="font-medium text-herb-800 underline underline-offset-2 hover:text-herb-900 dark:text-herb-400">Im Warenkorb einlösen →</a>
  </p><p class="mt-2 flex flex-wrap items-center gap-x-2 gap-y-1 border-t border-herb-500/30 pt-2">
    <span>💶 <span class="font-semibold">5 € Gutschein</span> für netcup-Neukunden:</span>
    <button type="button" data-voucher-code data-track-voucher="36nc17844976032"
            title="Zum Kopieren klicken" class="cursor-pointer rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 hover:ring-2 hover:ring-herb-500/40 dark:bg-slate-800 dark:text-herb-400">36nc17844976032</button>
    <span class="text-xs text-slate-500 dark:text-slate-400">immer gültig · nicht für Domains und VPS Lite</span>
  </p>
</div></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="1-verzeichnisse-anlegen">1. Verzeichnisse anlegen</h3>
<p>Audiobookshelf trennt vier Datenbereiche – und genau diese Trennung macht das Backup später
einfach: <strong>Konfiguration</strong> (Datenbank, Konten), <strong>Metadaten</strong> (Cover, Cache, interne
Sicherungen) und deine <strong>Medien</strong> in eigenen Ordnern.</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 /opt/audiobookshelf/<span class="o">{</span>config,metadata,audiobooks,podcasts<span class="o">}</span></span></span></code></pre></div>
</div>
<p>Das Image startet von Haus aus als <code>root</code>; mit dem <code>user: &quot;1000:1000&quot;</code> oben läuft der Prozess
stattdessen unter UID/GID 1000. Die Ordner müssen deshalb
diesem Benutzer gehören, sonst kann Audiobookshelf weder scannen noch Podcasts ablegen:</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">chown -R 1000:1000 /opt/audiobookshelf</span></span></code></pre></div>
</div>
<h3 id="2-hörbücher-ablegen--die-ordnerstruktur-entscheidet">2. Hörbücher ablegen – die Ordnerstruktur entscheidet</h3>
<p>Audiobookshelf leitet Autor und Titel <strong>aus der Ordnerstruktur</strong> ab und ergänzt sie um die
Tags in den Dateien. Halte dich an <code>Autor/Titel/</code>, dann stimmt die Zuordnung von Anfang an:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/opt/audiobookshelf/audiobooks/
</span></span><span class="line"><span class="cl">└── Franz Kafka/
</span></span><span class="line"><span class="cl">    └── Ein Landarzt/
</span></span><span class="line"><span class="cl">        ├── landarzt_01.mp3
</span></span><span class="line"><span class="cl">        ├── landarzt_02.mp3
</span></span><span class="line"><span class="cl">        ├── landarzt_03.mp3
</span></span><span class="line"><span class="cl">        └── landarzt_04.mp3</span></span></code></pre></div>
</div>
<p>Mehrere Dateien in <strong>einem</strong> Titel-Ordner werden zu einem Hörbuch mit Kapiteln
zusammengefasst – nicht zu vier einzelnen Büchern. Nach dem Kopieren die Rechte nachziehen:</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">chown -R 1000:1000 /opt/audiobookshelf/audiobooks</span></span></code></pre></div>
</div>
<h3 id="3-compose-datei-schreiben">3. Compose-Datei schreiben</h3>
<p>Lege <code>/opt/audiobookshelf/compose.yaml</code> an und ersetze <code>DEINE_DOMAIN</code> durch deine echte
Subdomain:</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">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">audiobookshelf</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/advplyr/audiobookshelf:2.36.0</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 class="nt">user</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1000:1000&#34;</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">TZ</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">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">./config:/config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./metadata:/metadata</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./audiobooks:/audiobooks</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./podcasts:/podcasts</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">proxy]</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.abs.rule=Host(`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.abs.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.abs.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.abs.loadbalancer.server.port=80&#34;</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">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>Drei Details sind hier wichtig:</p>
<ul>
<li><strong><code>loadbalancer.server.port=80</code></strong> – Audiobookshelf lauscht im Container auf Port 80. Die
13378 aus der offiziellen Beispiel-Compose ist nur der Port, den man ohne Reverse Proxy
nach außen veröffentlicht. Wir veröffentlichen <strong>keinen</strong> Port: Traefik erreicht den
Container über das <code>proxy</code>-Netz.</li>
<li><strong>Die gepinnte Version</strong> <code>2.36.0</code> statt <code>latest</code> – so kommen Updates dann, wenn du sie
einplanst, und nicht mitten in der Woche.</li>
<li><strong><code>user: &quot;1000:1000&quot;</code></strong> passt zu den Rechten aus Schritt 1.</li>
</ul>
<p>Starte den Stack:</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"><span class="nb">cd</span> /opt/audiobookshelf <span class="o">&amp;&amp;</span> docker compose up -d</span></span></code></pre></div>
</div>
<p>Prüfe, dass der Container läuft:</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>Up</code> sehen, nicht <code>Restarting</code>:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">NAME                              STATUS         IMAGE
</span></span><span class="line"><span class="cl">audiobookshelf-audiobookshelf-1   Up 8 seconds   ghcr.io/advplyr/audiobookshelf:2.36.0</span></span></code></pre></div>
</div>
<h3 id="4-tls-prüfen-bevor-du-klickst">4. TLS prüfen, bevor du klickst</h3>
<p>Traefik braucht ein paar Sekunden für das Zertifikat. Ob alles steht, verrät der
Status-Endpunkt – er antwortet ohne Login:</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">curl https://DEINE_DOMAIN/status</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">{&#34;app&#34;:&#34;audiobookshelf&#34;,&#34;serverVersion&#34;:&#34;2.36.0&#34;,&#34;isInit&#34;:false,&#34;language&#34;:&#34;en-us&#34;,
</span></span><span class="line"><span class="cl"> &#34;authMethods&#34;:[&#34;local&#34;],&#34;ConfigPath&#34;:&#34;/config&#34;,&#34;MetadataPath&#34;:&#34;/metadata&#34;}</span></span></code></pre></div>
</div>
<p>Damit stehen zwei Dinge fest: Es läuft wirklich <strong>2.36.0</strong>, und <code>isInit:false</code> heißt, der
Server wartet noch auf das erste Konto. Kommt hier ein Zertifikatsfehler, schau zuerst in die
Traefik-Logs – nicht in Audiobookshelf.</p>
<h3 id="5-erstes-konto-anlegen">5. Erstes Konto anlegen</h3>
<p>Ruf <code>https://DEINE_DOMAIN</code> im Browser auf. Beim ersten Aufruf verlangt Audiobookshelf
Benutzername und Passwort für das <strong>Root-Konto</strong>, also den Administrator.</p>
<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>Keine Registrierung – und keine Passwort-Wiederherstellung
  </p>
  <div class="prose-kitchen text-sm">Audiobookshelf hat bewusst <strong>keine</strong> offene Registrierung: Weitere Nutzer legst du später
selbst unter „Einstellungen → Benutzer&quot; an. Für das Root-Konto gibt es aber auch kein
„Passwort vergessen&quot; – notiere es im Passwortmanager, z. B. in
<a href="/tutorials/vaultwarden-passwortmanager/">Vaultwarden</a>.</div>
</div>
<p>Danach fällt dir auf, dass die Adresse auf <code>https://DEINE_DOMAIN/audiobookshelf/</code> springt. Das
ist Absicht des Projekts: Die Weboberfläche wird mit dem festen Router-Pfad <code>/audiobookshelf</code>
gebaut. Es gibt zwar eine Variable <code>ROUTER_BASE_PATH</code>, sie hilft zur Laufzeit aber nicht – der
Pfad steckt im fertig gebauten Frontend im Image (getestet: mit <code>ROUTER_BASE_PATH: &quot;&quot;</code> lädt die
Oberfläche weiterhin aus <code>/audiobookshelf/_nuxt/…</code>). Der Aufruf von <code>https://DEINE_DOMAIN</code>
funktioniert trotzdem, deine Lesezeichen tragen nur den Zusatz.</p>
<h3 id="6-oberfläche-auf-deutsch-stellen">6. Oberfläche auf Deutsch stellen</h3>
<p>Klick oben rechts auf deinen Benutzernamen und wähle unter <strong>Language</strong> „Deutsch&quot;.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-sky-300 bg-sky-50 dark:border-sky-800 dark:bg-sky-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">ℹ️</span>Hinweis
  </p>
  <div class="prose-kitchen text-sm">Die Sprache ist eine Einstellung <strong>pro Browser</strong>, nicht pro Konto – Audiobookshelf legt sie
lokal ab und speichert sie nicht am Benutzer. Auf jedem neuen Gerät stellst du sie also erneut
ein.</div>
</div>
<h3 id="7-hörbuch-bibliothek-anlegen">7. Hörbuch-Bibliothek anlegen</h3>
<p>Unter <strong>Einstellungen → Bibliotheken</strong> legst du die erste Bibliothek an:</p>
<p><figure class="my-6"><img src="/tutorials/audiobookshelf-hoerbuecher/bibliothek-anlegen_hu_91c854955d8db9d3.webp" srcset="/tutorials/audiobookshelf-hoerbuecher/bibliothek-anlegen_hu_dbe06d5c5a25acaa.webp 480w, /tutorials/audiobookshelf-hoerbuecher/bibliothek-anlegen_hu_91c854955d8db9d3.webp 768w, /tutorials/audiobookshelf-hoerbuecher/bibliothek-anlegen_hu_6c44906461e66332.webp 1200w, /tutorials/audiobookshelf-hoerbuecher/bibliothek-anlegen_hu_1c9b5707a363b267.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/audiobookshelf-hoerbuecher/bibliothek-anlegen_hu_cf2141e8c893866.webp"
    alt="Der Dialog „Neue Bibliothek&quot; in Audiobookshelf mit Medientyp Bücher, dem Namen Hörbücher, Audible.de als Metadatenanbieter und dem Verzeichnis /audiobooks" title="Neue Bibliothek: Medientyp, Name, Metadatenanbieter und Verzeichnis"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Neue Bibliothek: Medientyp, Name, Metadatenanbieter und Verzeichnis</figcaption></figure></p>
<ul>
<li><strong>Medientyp:</strong> <code>Bücher</code></li>
<li><strong>Bibliotheksname:</strong> z. B. <code>Hörbücher</code></li>
<li><strong>Metadatenanbieter:</strong> <code>Audible.de</code> – für deutsche Titel liefert der deutlich bessere Treffer
als der Standard <code>Google Books</code>. Zur Wahl stehen außerdem iTunes, FantLab.ru und die anderen
Audible-Länderkataloge.</li>
<li><strong>Verzeichnisse:</strong> <code>/audiobooks</code> eintragen und mit Enter bestätigen. Das ist der Pfad <strong>im
Container</strong> – er zeigt dank Bind Mount auf <code>/opt/audiobookshelf/audiobooks</code>.</li>
</ul>
<p>Dann auf <strong>Erstellen</strong>.</p>
<h3 id="8-den-ersten-scan-selbst-auslösen">8. Den ersten Scan selbst auslösen</h3>
<p>Hier stolpern die meisten: Die Bibliothek bleibt zunächst leer.</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Hörbücher Bibliothek ist leer!</span></span></code></pre></div>
</div>
<p>Der <strong>erste Scan startet nicht von allein</strong> – auch nach Minuten nicht (nachgemessen). Klick in
der Bibliotheksansicht auf <strong>Bibliothek scannen</strong>. Bei vier Dateien und 14 MB war der Scan in
unter vier Sekunden durch, danach steht das Hörbuch mit Cover in der Übersicht:</p>
<p><figure class="my-6"><img src="/tutorials/audiobookshelf-hoerbuecher/bibliothek_hu_582572279b1fdd8d.webp" srcset="/tutorials/audiobookshelf-hoerbuecher/bibliothek_hu_88288015491a315e.webp 480w, /tutorials/audiobookshelf-hoerbuecher/bibliothek_hu_582572279b1fdd8d.webp 768w, /tutorials/audiobookshelf-hoerbuecher/bibliothek_hu_9126071276688917.webp 1200w, /tutorials/audiobookshelf-hoerbuecher/bibliothek_hu_9e5c92f6f9d201b.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/audiobookshelf-hoerbuecher/bibliothek_hu_5cebbe9725ce124a.webp"
    alt="Die Audiobookshelf-Bibliothek mit dem eingelesenen Hörbuch „Ein Landarzt&quot; von Franz Kafka unter „Kürzlich hinzugefügt&quot;" title="Nach dem Scan erscheint das Hörbuch mit Cover in der Bibliothek"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Nach dem Scan erscheint das Hörbuch mit Cover in der Bibliothek</figcaption></figure></p>
<p>Ab jetzt beobachtet Audiobookshelf den Ordner selbst: Neu hinzukopierte Dateien werden erkannt,
ein manueller Scan ist nur beim Anlegen nötig.</p>
<h3 id="9-hören--kapitel-tempo-sleeptimer">9. Hören – Kapitel, Tempo, Sleeptimer</h3>
<p>Ein Klick auf das Cover öffnet die Detailseite. Aus den vier MP3s ist ein Hörbuch mit <strong>vier
Kapiteln</strong> geworden, Laufzeit und Größe stehen oben:</p>
<p><figure class="my-6"><img src="/tutorials/audiobookshelf-hoerbuecher/player_hu_26221f5ab2144750.webp" srcset="/tutorials/audiobookshelf-hoerbuecher/player_hu_929ceaa943682fd1.webp 480w, /tutorials/audiobookshelf-hoerbuecher/player_hu_26221f5ab2144750.webp 768w, /tutorials/audiobookshelf-hoerbuecher/player_hu_475ef9b179b38505.webp 1200w, /tutorials/audiobookshelf-hoerbuecher/player_hu_4488dbaf1021411c.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/audiobookshelf-hoerbuecher/player_hu_b750f176e29129df.webp"
    alt="Die Detailseite des Hörbuchs mit laufender Wiedergabe, Kapitel- und Dateiliste sowie dem Player am unteren Rand" title="Detailseite mit Kapiteln und laufendem Player"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Detailseite mit Kapiteln und laufendem Player</figcaption></figure></p>
<p>Der Player unten bleibt beim Navigieren stehen. Dort findest du Tempo (<code>1.0x</code>), Sprungmarken,
Lesezeichen, die Kapitelliste und den <strong>Sleeptimer</strong> (Schlummer-Symbol). Der Fortschritt – im
Bild <code>0:06 / 28:52</code> – landet serverseitig im Konto und nicht im Browser. Genau deshalb hostet
man dieses Ding selbst.</p>
<h3 id="10-podcasts-abonnieren">10. Podcasts abonnieren</h3>
<p>Podcasts brauchen eine <strong>eigene Bibliothek</strong>, weil Audiobookshelf sie anders behandelt:
Episoden, Feeds, automatische Downloads. Also nochmal <strong>Einstellungen → Bibliotheken →
Bibliothek hinzufügen</strong>, diesmal mit:</p>
<ul>
<li><strong>Medientyp:</strong> <code>Podcasts</code></li>
<li><strong>Name:</strong> z. B. <code>Podcasts</code></li>
<li><strong>Metadatenanbieter:</strong> <code>iTunes</code></li>
<li><strong>Verzeichnis:</strong> <code>/podcasts</code></li>
</ul>
<p>In der neuen Bibliothek klickst du auf <strong>Hinzufügen</strong>. In das Feld „Suchbegriff oder RSS-Feed
URL eingeben&quot; kommt entweder ein Suchbegriff – dann durchsucht der <strong>Server</strong> den
iTunes-Katalog – oder direkt die Feed-URL:</p>
<p><figure class="my-6"><img src="/tutorials/audiobookshelf-hoerbuecher/podcast-suche_hu_507402c124fdcadd.webp" srcset="/tutorials/audiobookshelf-hoerbuecher/podcast-suche_hu_2ae43881df699f35.webp 480w, /tutorials/audiobookshelf-hoerbuecher/podcast-suche_hu_507402c124fdcadd.webp 768w, /tutorials/audiobookshelf-hoerbuecher/podcast-suche_hu_bc210e4b65e91459.webp 1200w, /tutorials/audiobookshelf-hoerbuecher/podcast-suche_hu_ca34aa8896b70917.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/audiobookshelf-hoerbuecher/podcast-suche_hu_35b9dac5eadecfc.webp"
    alt="Die Podcast-Suche in Audiobookshelf mit zwei Treffern zum Suchbegriff netzpolitik samt Episodenzahl" title="Podcast-Suche: Treffer aus dem iTunes-Katalog samt Episodenzahl"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Podcast-Suche: Treffer aus dem iTunes-Katalog samt Episodenzahl</figcaption></figure></p>
<p>Beim Abonnieren legst du fest, ob <strong>neue Episoden automatisch heruntergeladen</strong> werden und wie
viele Audiobookshelf vorhalten soll. Denk an den Plattenplatz: Ein wöchentlicher Podcast mit
60-Minuten-Episoden schlägt je Episode mit etwa 30 MB (64 kbps) bis 55 MB (128 kbps) zu Buche –
über ein Jahr also grob 1,5 bis 3 GB.</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>Feed statt Suche
  </p>
  <div class="prose-kitchen text-sm">Die Suche fragt den iTunes-Katalog ab. Findet sie einen Podcast nicht, weil er dort nicht
eingetragen ist, füg ihn direkt über seine RSS-Adresse hinzu – dasselbe Eingabefeld akzeptiert
beides.</div>
</div>
<h3 id="11-weitere-nutzer-anlegen">11. Weitere Nutzer anlegen</h3>
<p>Der Hörfortschritt hängt am Konto – für Partner oder Kinder legst du also eigene Nutzer an, statt
das Root-Konto zu teilen. Das geht unter <strong>Einstellungen → Benutzer → Benutzer hinzufügen</strong>.</p>
<p>Es gibt drei Kontotypen: <code>root</code> (nur einmal, das erste Konto), <code>admin</code> (darf Einstellungen und
Bibliotheken ändern) und <code>user</code> für den Normalfall. Ein frisch angelegtes <code>user</code>-Konto bekommt
diese Rechte:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">download: true       – darf Titel herunterladen (fürs Offline-Hören in der App)
</span></span><span class="line"><span class="cl">update: false        – darf keine Metadaten ändern
</span></span><span class="line"><span class="cl">delete: false        – darf nichts löschen
</span></span><span class="line"><span class="cl">upload: false        – darf keine Dateien hochladen
</span></span><span class="line"><span class="cl">accessAllLibraries:  true    – sieht ALLE Bibliotheken
</span></span><span class="line"><span class="cl">accessExplicitContent: false – Titel mit Explicit-Kennzeichnung bleiben verborgen</span></span></code></pre></div>
</div>
<p>Die vorletzte Zeile ist die wichtige: Standardmäßig sieht ein neuer Nutzer <strong>alle</strong>
Bibliotheken. Wenn die Kinder nicht in die Erwachsenen-Hörbücher schauen sollen, schalte
<code>accessAllLibraries</code> im Benutzerdialog ab und wähle die erlaubten Bibliotheken einzeln aus.</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>Tipp
  </p>
  <div class="prose-kitchen text-sm">Unter <strong>Einstellungen → Bibliotheksstatistiken</strong> und <strong>Eigene Statistiken</strong> siehst du, wie
viele Stunden gehört wurden und was am häufigsten läuft – nett, aber auch praktisch, um
ungenutzte Podcast-Abos zu finden, die nur Platz verbrauchen.</div>
</div>
<h3 id="12-apps-fürs-handy">12. Apps fürs Handy</h3>
<p>Der Alltag läuft am Telefon. Es gibt eine offizielle Audiobookshelf-App für <strong>Android</strong> (Play
Store und F-Droid) und für <strong>iOS</strong>. Beim ersten Start gibst du an:</p>
<ul>
<li><strong>Server-Adresse:</strong> <code>https://DEINE_DOMAIN</code> – mit <code>https://</code>, ohne Pfad</li>
<li><strong>Benutzername und Passwort</strong> deines Kontos</li>
</ul>
<p>Danach lädt die App Titel offline herunter und meldet den Fortschritt an den Server zurück. Für
iOS gibt es zusätzlich Alternativen wie Plappa oder ShelfPlayer, die dieselbe API nutzen.</p>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<div class="troubleshoot not-prose">
<p><strong>Die Bibliothek bleibt nach dem Anlegen leer.</strong> Der erste Scan läuft nicht automatisch – das
ist kein Fehler, sondern Audiobookshelfs Verhalten. Klick in der Bibliotheksansicht auf
<strong>Bibliothek scannen</strong>. Bleibt sie danach leer, prüfe mit <code>docker compose exec audiobookshelf ls -R /audiobooks</code>, ob der Container die Dateien überhaupt
sieht, und mit <code>ls -ln /opt/audiobookshelf/audiobooks</code>, dass alles UID 1000 gehört.</p>
<p><strong>Aus vier MP3-Dateien werden vier Hörbücher statt vier Kapitel.</strong> Die Dateien liegen direkt im
Autoren-Ordner statt in einem gemeinsamen Titel-Ordner. Audiobookshelf gruppiert nach
<code>Autor/Titel/</code> – Dateien in einen Unterordner mit dem Buchtitel legen und erneut scannen.</p>
<p><strong>Traefik antwortet mit 404, obwohl der Container läuft.</strong> Meist fehlt
<code>traefik.http.services.abs.loadbalancer.server.port=80</code>. Audiobookshelf lauscht im Container auf
<strong>80</strong>; ohne diese Zeile rät Traefik und trifft daneben. Prüfe außerdem, dass der Container
wirklich im <code>proxy</code>-Netz hängt.</p>
<p><strong>Die Adresse springt auf <code>/audiobookshelf/</code>.</strong> Das ist normal: Das Frontend wird mit diesem
festen Router-Pfad ausgeliefert, und <code>ROUTER_BASE_PATH</code> ändert daran zur Laufzeit nichts, weil
der Pfad im Image eingebaut ist. <code>https://DEINE_DOMAIN</code> bleibt als Einstieg gültig.</p>
<p><strong>Nach dem Gerätewechsel ist die Oberfläche wieder englisch.</strong> Die Sprachwahl liegt lokal im
Browser, nicht am Konto. Auf dem neuen Gerät einmal über den Benutzernamen → <code>Language</code> →
„Deutsch&quot; setzen.</p>
<p><strong>Der Podcast wird nicht gefunden.</strong> Die Suche fragt den iTunes-Katalog ab; ein Tippfehler oder
ein dort fehlender Eintrag führt zu „Keine Suchergebnisse&quot;. Nimm stattdessen die RSS-URL des
Podcasts – dasselbe Feld akzeptiert beides.</p>

</div>
<p class="mt-3 text-sm text-slate-500 dark:text-slate-400">
  Dein Problem ist nicht dabei?
  <a href="/fehler/" class="font-medium text-paprika-700 hover:underline dark:text-paprika-400">Alle Fehlermeldungen durchsuchen →</a>
</p>

<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<p><strong>Updates.</strong> Audiobookshelf erscheint häufig, grob monatlich eine neue Minor-Version. Weil die
Version gepinnt ist, aktualisierst du bewusst: Tag in der <code>compose.yaml</code> erhöhen, dann</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"><span class="nb">cd</span> /opt/audiobookshelf <span class="o">&amp;&amp;</span> docker compose pull <span class="o">&amp;&amp;</span> docker compose up -d</span></span></code></pre></div>
</div>
<p>Vor einem Sprung über mehrere Versionen lohnt der Blick in die Release-Notes – und ein frisches
Backup. Wie du das systematisch machst, steht in
<a href="/tutorials/docker-stack-aktuell-halten/">Docker-Stack aktuell halten</a>.</p>
<p><strong>Eingebaute Sicherung – erst mal einschalten.</strong> Audiobookshelf kann selbst Archive schreiben,
tut es aber <strong>nicht von Haus aus</strong>: Unter <strong>Einstellungen → Sicherungen</strong> steht der Schalter
„Automatische Sicherung&quot; standardmäßig auf <strong>aus</strong>.</p>
<p><figure class="my-6"><img src="/tutorials/audiobookshelf-hoerbuecher/sicherungen_hu_eb16476a1752e421.webp" srcset="/tutorials/audiobookshelf-hoerbuecher/sicherungen_hu_ebd9144afc15c49.webp 480w, /tutorials/audiobookshelf-hoerbuecher/sicherungen_hu_eb16476a1752e421.webp 768w, /tutorials/audiobookshelf-hoerbuecher/sicherungen_hu_c531f2f58f8928f1.webp 1200w, /tutorials/audiobookshelf-hoerbuecher/sicherungen_hu_cc8b464c4d9b03.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/audiobookshelf-hoerbuecher/sicherungen_hu_586c3f33b6aa9e41.webp"
    alt="Die Einstellungsseite „Sicherungen&quot; in Audiobookshelf mit ausgeschalteter automatischer Sicherung, Backup-Ort /metadata/backups, Aufbewahrung 2 und maximaler Größe 1 GB" title="Sicherungen: automatische Sicherung ist im Standard aus"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Sicherungen: automatische Sicherung ist im Standard aus</figcaption></figure></p>
<p>Schalte sie ein und prüfe die zwei Grenzwerte darunter, denn beide sind knapp gesetzt:</p>
<ul>
<li><strong>Anzahl der aufzubewahrenden Sicherungen: 2</strong> – ältere werden gelöscht. Für „ich merke einen
Fehler erst nach zwei Wochen&quot; ist das zu wenig; 7 bis 14 sind realistischer.</li>
<li><strong>Maximale Sicherungsgröße: 1 GB</strong> – wird das Archiv größer, bricht die Sicherung ab. Mit
vielen Covern in <code>/metadata</code> kann das passieren; <code>0</code> bedeutet „keine Begrenzung&quot;.</li>
</ul>
<p>Die Archive landen unter <code>/metadata/backups</code>, bei uns also in
<code>/opt/audiobookshelf/metadata/backups</code>. Enthalten sind Benutzer, Hörfortschritt, Details der
Bibliotheksobjekte, Servereinstellungen und die Bilder aus <code>/metadata/items</code> und
<code>/metadata/authors</code>. Die Oberfläche sagt es selbst deutlich: <strong>Dateien aus deinen
Medien-Ordnern sind nicht enthalten.</strong></p>
<p>Zurückspielen geht auf derselben Seite über <strong>Sicherung hochladen</strong> – gut zu wissen, denn damit
zieht ein Umzug auf einen neuen Server auf zwei Schritte zusammen: Archiv hochladen, Medien
kopieren.</p>
<p><strong>Echtes Backup.</strong> Damit ergibt sich eine klare Aufteilung:</p>
<ul>
<li><code>config/</code> und <code>metadata/</code> sind klein (bei uns 480 KB und 112 KB) und gehören <strong>täglich</strong> ins
Backup – dort steckt die eigentliche Arbeit: Konten, Fortschritt, Metadaten.</li>
<li><code>audiobooks/</code> und <code>podcasts/</code> sind groß und ändern sich selten. Sie brauchen ebenfalls eine
Sicherung, aber in anderem Rhythmus – Podcast-Episoden kannst du auch als „jederzeit
nachladbar&quot; einstufen.</li>
</ul>
<p>Beides erledigt <a href="/tutorials/backups-mit-restic/">Restic</a> zuverlässig. Prüfe einmal im Quartal
mit einem echten Restore, dass die Sicherung auch zurückläuft.</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>Scan per API auslösen
  </p>
  <div class="prose-kitchen text-sm"><p>Wenn du Hörbücher per Skript oder Syncthing auf den Server schiebst, musst du nicht in die
Oberfläche: Audiobookshelf hat eine HTTP-API. Unter <strong>Einstellungen → API-Schlüssel</strong> erzeugst
du ein Token, danach startet dieser Aufruf den Scan einer Bibliothek:</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">curl -X POST https://DEINE_DOMAIN/api/libraries/DEINE_LIBRARY_ID/scan <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s2">&#34;Authorization: Bearer DEIN_TOKEN&#34;</span></span></span></code></pre></div>
</div>
<p>Die IDs deiner Bibliotheken liefert <code>GET /api/libraries</code> mit demselben Header. Praktisch für
einen Cronjob nach dem nächtlichen Datei-Sync – wie du solche Jobs überwachst, steht in
<a href="/tutorials/healthchecks-jobs-ueberwachen/">Healthchecks</a>.</p>
</div>
</div>
<p><strong>Platz im Auge behalten.</strong> Audiodateien und automatisch geladene Episoden sind die einzigen
echten Platzfresser:</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">du -sh /opt/audiobookshelf/*</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">14M     /opt/audiobookshelf/audiobooks
</span></span><span class="line"><span class="cl">480K    /opt/audiobookshelf/config
</span></span><span class="line"><span class="cl">112K    /opt/audiobookshelf/metadata
</span></span><span class="line"><span class="cl">4.0K    /opt/audiobookshelf/podcasts</span></span></code></pre></div>
</div>
<p>Wird es dir zu viel, ist zusätzlicher Block-Storage für die Medienordner die günstigere Antwort
als ein größerer Server – der Rest von Audiobookshelf bleibt winzig.</p>
]]></content:encoded></item></channel></rss>