<?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>Linkding – Serverküche</title><link>https://serverkueche.de/tags/linkding/</link><description>Linkding – 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>Sat, 19 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/linkding/index.xml" rel="self" type="application/rss+xml"/><item><title>linkding: Lesezeichen selbst hosten</title><link>https://serverkueche.de/tutorials/linkding-lesezeichen/</link><pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/linkding-lesezeichen/</guid><description>Alle Lesezeichen an einem Ort, geräteübergreifend und ohne Browser-Zwang: linkding als schlanker Bookmark-Manager hinter Traefik – mit Tags und API.</description><content:encoded><![CDATA[<p>Lesezeichen im Browser sind an ein Gerät gebunden, chaotisch organisiert und weg, sobald das Profil kaputtgeht. linkding sammelt deine Links zentral auf dem eigenen Server: über den Browser, per Extension, per API – durchsuchbar, verschlagwortet und geräteübergreifend.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Einen schlanken, selbst gehosteten Bookmark-Manager mit <strong>linkding</strong> (v1.46.2) hinter <a href="/tutorials/reverse-proxy-traefik/">Traefik</a>. Am Ende speicherst du Links mit einem Klick, versiehst sie mit Tags, findest sie per Volltextsuche wieder – und linkding holt Titel und Beschreibung automatisch von der verlinkten Seite. linkding ist bewusst minimalistisch und extrem genügsam (SQLite, kaum RAM).</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein Server mit laufendem <a href="/tutorials/reverse-proxy-traefik/">Traefik</a> und <a href="/tutorials/docker-compose-grundlagen/">Docker Compose</a></li>
<li>Eine <a href="/tutorials/domain-mit-server-verbinden/">Subdomain, die auf den Server zeigt</a> – im Folgenden <code>DEINE_DOMAIN</code></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/linkding-lesezeichen/" 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">linkding ist winzig – selbst der kleinste VPS langweilt sich damit.</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">
  <p class="flex flex-wrap items-center gap-x-2 gap-y-1">
    <span>💶 <strong>5 € Gutschein</strong> 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">(nicht für Domains und VPS Lite)</span>
  </p>
  <p class="mt-1 text-xs text-slate-500 dark:text-slate-400">
    <a href="https://www.netcup.com/de/checkout/warenkorb?ref=44083" rel="sponsored noopener" target="_blank"
       data-track-event="Affiliate|netcup: Gutschein einlösen|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>
</div></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-projekt-und-compose-datei">Schritt 1: Projekt und Compose-Datei</h3>
<p>linkding speichert alles (Datenbank, Einstellungen) in einem <code>data</code>-Ordner. Lege das Projekt an:</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/linkding/data <span class="o">&amp;&amp;</span> <span class="nb">cd</span> /opt/linkding</span></span></code></pre></div>
</div>
<p>Die <code>compose.yaml</code> – ersetze <code>DEINE_DOMAIN</code>. Das Admin-Konto erzeugt linkding beim ersten Start aus den Umgebungsvariablen:</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">linkding</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">sissbruecker/linkding:1.46.2</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">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:/etc/linkding/data</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">LD_SUPERUSER_NAME</span><span class="p">:</span><span class="w"> </span><span class="l">koch</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">LD_SUPERUSER_PASSWORD</span><span class="p">:</span><span class="w"> </span><span class="l">DEIN_STARKES_PASSWORT</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">LD_CSRF_TRUSTED_ORIGINS</span><span class="p">:</span><span class="w"> </span><span class="l">https://DEINE_DOMAIN</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.linkding.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.linkding.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.linkding.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.linkding.loadbalancer.server.port=9090&#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>
<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>LD_CSRF_TRUSTED_ORIGINS nicht vergessen
  </p>
  <div class="prose-kitchen text-sm">Wie viele Django-Anwendungen hinter einem Reverse Proxy braucht linkding die Angabe <code>LD_CSRF_TRUSTED_ORIGINS</code> mit deiner vollständigen HTTPS-Domain – sonst schlägt das Anmeldeformular mit einem CSRF-Fehler fehl. Die Login-<em>Seite</em> lädt zwar, aber das Absenden wird abgelehnt.</div>
</div>
<h3 id="schritt-2-starten-und-anmelden">Schritt 2: Starten und anmelden</h3>
<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></code></pre></div>
</div>
<p>Das Image bringt einen Healthcheck mit; Traefik leitet erst weiter, wenn linkding <code>healthy</code> ist (etwa 30 Sekunden). Öffne dann <code>https://DEINE_DOMAIN/</code>:</p>
<p><figure class="my-6"><img src="/tutorials/linkding-lesezeichen/ld-login_hu_79919b2d44682b79.webp" srcset="/tutorials/linkding-lesezeichen/ld-login_hu_d077e8827c1bce63.webp 480w, /tutorials/linkding-lesezeichen/ld-login_hu_79919b2d44682b79.webp 768w, /tutorials/linkding-lesezeichen/ld-login_hu_444f43acce17ec79.webp 1200w, /tutorials/linkding-lesezeichen/ld-login_hu_af8a018e463ec8e4.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/linkding-lesezeichen/ld-login_hu_63401009cb83b200.webp"
    alt="Die Anmeldeseite von linkding unter der eigenen HTTPS-Domain" title="Der linkding-Login – die Zugangsdaten stammen aus der Compose-Datei"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Der linkding-Login – die Zugangsdaten stammen aus der Compose-Datei</figcaption></figure></p>
<p>Melde dich mit dem in der Compose-Datei gesetzten Konto an.</p>
<h3 id="schritt-3-das-erste-lesezeichen-speichern">Schritt 3: Das erste Lesezeichen speichern</h3>
<p>Klicke oben auf <strong>Add bookmark</strong> und füge eine URL ein. Der Clou: linkding ruft die Seite auf und <strong>füllt Titel und Beschreibung automatisch</strong> aus – du musst nur noch Tags vergeben (durch Leerzeichen getrennt, ohne <code>#</code>):</p>
<p><figure class="my-6"><img src="/tutorials/linkding-lesezeichen/ld-add_hu_d095319ce7e648d1.webp" srcset="/tutorials/linkding-lesezeichen/ld-add_hu_3fc76596871ed221.webp 480w, /tutorials/linkding-lesezeichen/ld-add_hu_d095319ce7e648d1.webp 768w, /tutorials/linkding-lesezeichen/ld-add_hu_18c0109475f059cb.webp 1200w, /tutorials/linkding-lesezeichen/ld-add_hu_187db8e433aa47e6.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/linkding-lesezeichen/ld-add_hu_b15a5bceb87c08f.webp"
    alt="Das Formular zum Anlegen eines Lesezeichens mit automatisch gefülltem Titel und Beschreibung" title="„Add bookmark“: linkding holt Titel und Beschreibung selbst von der Seite; du ergänzt Tags"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">„Add bookmark“: linkding holt Titel und Beschreibung selbst von der Seite; du ergänzt Tags</figcaption></figure></p>
<p>Optional kannst du ein Lesezeichen als <strong>ungelesen</strong> markieren („Mark as unread“) – praktisch als Leseliste für später.</p>
<h3 id="schritt-4-sammlung-durchsuchen-und-filtern">Schritt 4: Sammlung durchsuchen und filtern</h3>
<p>Die Übersicht zeigt deine Lesezeichen chronologisch, rechts eine anklickbare Tag-Wolke. Über die Suche findest du Links nach Wörtern oder <code>#tags</code>:</p>
<p><figure class="my-6"><img src="/tutorials/linkding-lesezeichen/ld-list_hu_5dde5f65a7e63c9d.webp" srcset="/tutorials/linkding-lesezeichen/ld-list_hu_a71d2b0c0ed716b4.webp 480w, /tutorials/linkding-lesezeichen/ld-list_hu_5dde5f65a7e63c9d.webp 768w, /tutorials/linkding-lesezeichen/ld-list_hu_4efd6c66402162cf.webp 1200w, /tutorials/linkding-lesezeichen/ld-list_hu_5dc87daac13b997f.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/linkding-lesezeichen/ld-list_hu_c12a886c6d6001dd.webp"
    alt="Die linkding-Übersicht mit mehreren Lesezeichen, Tags und Suchfeld" title="Die Bookmark-Liste: Titel, Tags und automatische Beschreibung, rechts die Tag-Navigation"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Die Bookmark-Liste: Titel, Tags und automatische Beschreibung, rechts die Tag-Navigation</figcaption></figure></p>
<p>Ein Klick auf ein Tag filtert sofort; mehrere Tags kombinieren die Filter. So bleibt auch eine große Sammlung übersichtlich – ganz ohne Ordnerhierarchie.</p>
<h3 id="schritt-5-schnell-speichern-aus-dem-browser">Schritt 5: Schnell speichern aus dem Browser</h3>
<p>Für den Alltag willst du nicht jedes Mal die Weboberfläche öffnen. linkding bietet zwei bequeme Wege:</p>
<ul>
<li><strong>Browser-Extension:</strong> Es gibt eine offizielle linkding-Erweiterung für Firefox und Chrome. In deren Einstellungen trägst du <code>https://DEINE_DOMAIN</code> und einen <strong>API-Token</strong> ein (den findest du in linkding unter <strong>Settings → Integrations → REST API</strong>). Danach speicherst du die aktuelle Seite per Klick.</li>
<li><strong>Bookmarklet:</strong> Alternativ bietet linkding unter Settings ein Bookmarklet an – ein Lesezeichen in der Browser-Leiste, das die aktuelle Seite direkt an linkding schickt. Funktioniert ohne Extension, auch auf dem Handy.</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>Bestehende Lesezeichen importieren
  </p>
  <div class="prose-kitchen text-sm">Wechselst du vom Browser oder einem anderen Dienst, exportiere dort deine Lesezeichen als <strong>HTML-Datei</strong> (das Standardformat aller Browser) und importiere sie unter <strong>Settings → Import</strong>. So ziehen alle Links auf einen Schlag um – inklusive Ordnerstruktur, die linkding in Tags umwandelt.</div>
</div>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<div class="troubleshoot not-prose">
<p><strong>Login scheitert mit CSRF-Fehler.</strong> <code>LD_CSRF_TRUSTED_ORIGINS: https://DEINE_DOMAIN</code> fehlt oder ist falsch (muss mit <code>https://</code> und ohne Pfad angegeben sein). Ergänzen und <code>docker compose up -d</code> (siehe Warnung in Schritt 1).</p>
<p><strong>Die Seite kommt nicht (Traefik-404), obwohl der Container läuft.</strong> Der Healthcheck ist noch nicht <code>healthy</code> – Traefik leitet dann bewusst nicht. Rund 30 Sekunden nach dem Start abwarten; Status mit <code>docker inspect -f '{{.State.Health.Status}}' linkding-linkding-1</code> prüfen.</p>
<p><strong>Titel/Beschreibung werden nicht automatisch geholt.</strong> Die Zielseite blockiert automatisierte Zugriffe oder antwortet zu langsam. Du kannst Titel und Beschreibung dann einfach von Hand eintragen – die Felder stehen im selben Formular.</p>
<p><strong>Das Admin-Konto wurde nicht angelegt.</strong> <code>LD_SUPERUSER_NAME</code>/<code>LD_SUPERUSER_PASSWORD</code> greifen nur beim <strong>ersten</strong> Start mit leerer Datenbank. Existiert die <code>data</code>-Datenbank schon, ändert eine spätere Anpassung nichts. Konto nachträglich anlegen: <code>docker compose exec linkding python manage.py createsuperuser</code>.</p>
<p><strong>Die Extension verbindet sich nicht.</strong> Fast immer der API-Token oder die URL. Token unter Settings → Integrations neu erzeugen und exakt <code>https://DEINE_DOMAIN</code> als Server eintragen.</p>

</div>

<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<ul>
<li><strong>Updates.</strong> Setze den Image-Tag (<code>sissbruecker/linkding:1.46.2</code>) gelegentlich auf die aktuelle Version und <code>docker compose up -d</code>; die Datenbank migriert beim Start automatisch. Der Rest läuft über deinen normalen <a href="/tutorials/docker-stack-aktuell-halten/">Update-Prozess</a>.</li>
<li><strong>Backup ist winzig.</strong> Der gesamte Zustand liegt im <code>data</code>-Ordner (SQLite-Datenbank). Ihn ins <a href="/tutorials/backups-mit-restic/">Restic-Backup</a> aufnehmen – dann sind alle Lesezeichen, Tags und Einstellungen gesichert. Zusätzlich lohnt gelegentlich ein <strong>HTML-Export</strong> (Settings → Export) als browser-lesbares, dienstunabhängiges Backup.</li>
<li><strong>Aufwand geht gegen null.</strong> linkding ist ein „einrichten und vergessen&quot;-Dienst. Die einzige wiederkehrende Aktivität ist das Speichern neuer Links – und das erledigst du künftig per Extension oder Bookmarklet in einer Sekunde.</li>
</ul>
]]></content:encoded></item></channel></rss>