<?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>Rss – Serverküche</title><link>https://serverkueche.de/tags/rss/</link><description>Rss – 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, 05 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/rss/index.xml" rel="self" type="application/rss+xml"/><item><title>FreshRSS: der eigene RSS-Reader</title><link>https://serverkueche.de/tutorials/freshrss-rss-reader/</link><pubDate>Sat, 05 Sep 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/freshrss-rss-reader/</guid><description>Alle Nachrichtenquellen an einem Ort, ohne Algorithmus und Tracking: FreshRSS als selbstgehosteter RSS-Reader hinter Traefik – mit App-Anbindung und Backup.</description><content:encoded><![CDATA[<p>RSS ist das beste Nachrichtenformat, das die meisten vergessen haben: Du abonnierst Quellen direkt, ohne Algorithmus, ohne Werbung, ohne dass jemand mitliest, was du liest. FreshRSS bündelt all deine Quellen an einem selbstgehosteten Ort – und synchronisiert sogar mit den RSS-Apps auf dem Handy.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Einen eigenen RSS-Reader mit <strong>FreshRSS</strong> (v1.29.1) hinter <a href="/tutorials/reverse-proxy-traefik/">Traefik</a>, der deine Nachrichtenquellen sammelt und im Hintergrund per Cron aktuell hält. Am Ende liest du heise, Blogs, YouTube-Kanäle und Podcasts an einem Ort, gruppiert in Kategorien – und kannst über die eingebaute Google-Reader-API mobile Apps wie Reeder oder FeedMe anbinden. FreshRSS ist erfrischend leichtgewichtig: Es genügt SQLite, keine separate Datenbank nötig.</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> (z. B. <code>rss.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/freshrss-rss-reader/" data-content-piece="VPS 1000 G12">
  <div class="flex items-center justify-between border-b border-paprika-200 bg-paprika-100 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-paprika-700 dark:border-paprika-800 dark:bg-paprika-900/40 dark:text-paprika-300">
    <span>🍳 Empfehlung</span>
    <span title="Mit * markierte Links sind Affiliate-Links.">Anzeige</span>
  </div>
  <div class="flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:justify-between">
    <div>
      <p class="text-lg font-bold text-slate-900 dark:text-white">VPS 1000 G12</p>
      <p class="mt-1 text-sm text-slate-600 dark:text-slate-300">4 vCore · 8 GB RAM · 256 GB NVMe</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">ab 10,36 €/Monat</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">FreshRSS ist genügsam – der kleinste VPS reicht auch für viele Feeds.</p>
    </div>
    <a href="https://www.netcup.com/de/server/vps/vps-1000-g12-12m?ref=44083" rel="sponsored noopener" target="_blank"
   data-track-event="Affiliate|netcup: Affiliate-Box|VPS 1000 G12 · {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"><p class="not-prose my-3 flex flex-wrap items-center gap-x-2 gap-y-1 rounded-lg border border-herb-500/40 bg-herb-50 px-3 py-2 text-sm text-slate-700 dark:bg-herb-900/20 dark:text-slate-200">
  <span>💶 <strong>5 € Gutschein</strong> für netcup-Neukunden:</span><code data-track-voucher="36nc17844976032"
        class="rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 dark:bg-slate-800 dark:text-herb-400">36nc17844976032</code>
  <span class="text-xs text-slate-500 dark:text-slate-400">(nur Neukunden, keine Domains)</span>
</p></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-compose-datei-anlegen">Schritt 1: Compose-Datei anlegen</h3>
<p>FreshRSS speichert alles in einem <code>data</code>-Verzeichnis (SQLite-Datenbank, Konfiguration, Cache). 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/freshrss <span class="o">&amp;&amp;</span> <span class="nb">cd</span> /opt/freshrss</span></span></code></pre></div>
</div>
<p>Die <code>compose.yaml</code> – ersetze <code>DEINE_DOMAIN</code>:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">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">freshrss</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">freshrss/freshrss:1.29.1</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:/var/www/FreshRSS/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./extensions:/var/www/FreshRSS/extensions</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">CRON_MIN</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;13,43&#39;</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.freshrss.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.freshrss.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.freshrss.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.freshrss.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><code>CRON_MIN</code> ist ein nettes Detail des offiziellen Images: Es startet einen internen Cron, der die Feeds zu den genannten Minuten (hier 13 und 43 jeder Stunde) automatisch aktualisiert – du brauchst keinen externen Timer.</p>
<h3 id="schritt-2-starten">Schritt 2: Starten</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>Prüfe, dass FreshRSS mit gültigem HTTPS antwortet (die 302 ist die Weiterleitung zum Installations-Assistenten):</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 -sI https://DEINE_DOMAIN/ <span class="p">|</span> head -1</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">HTTP/2 302</span></span></code></pre></div>
</div>
<h3 id="schritt-3-der-installations-assistent">Schritt 3: Der Installations-Assistent</h3>
<p>Öffne <code>https://DEINE_DOMAIN/</code> im Browser. Der Assistent führt dich in fünf Schritten durch die Einrichtung – Sprache, Systemprüfung, Datenbank, Konto:</p>
<p><figure class="my-6"><img src="/tutorials/freshrss-rss-reader/frss-wizard_hu_ade8b900c09d624f.webp" srcset="/tutorials/freshrss-rss-reader/frss-wizard_hu_3d26f45d8eb05b74.webp 480w, /tutorials/freshrss-rss-reader/frss-wizard_hu_ade8b900c09d624f.webp 768w, /tutorials/freshrss-rss-reader/frss-wizard_hu_69a6f8b46a7324a3.webp 1200w, /tutorials/freshrss-rss-reader/frss-wizard_hu_4d8802b8f5411f56.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/freshrss-rss-reader/frss-wizard_hu_84c7e7cbce5e6374.webp"
    alt="Der FreshRSS-Installationsassistent, Schritt 1: Sprachauswahl mit Versionsangabe 1.29.1" title="Der Installationsassistent führt durch Sprache, Systemcheck, Datenbank und Admin-Konto"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Der Installationsassistent führt durch Sprache, Systemcheck, Datenbank und Admin-Konto</figcaption></figure></p>
<p>Wähle als Datenbanktyp <strong>SQLite</strong> (keine weiteren Angaben nötig), als Authentifizierung <strong>Formular-basiert</strong> und lege dein Administrator-Konto mit einem starken Passwort an. Nach dem letzten Schritt bist du eingeloggt.</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>Alternative: Einrichtung per Kommandozeile
  </p>
  <div class="prose-kitchen text-sm">Wer die Ersteinrichtung skripten will, kann sie ohne Browser erledigen: <code>docker compose exec -u www-data freshrss ./cli/do-install.php --default-user admin --auth-type form --db-type sqlite --language de</code>, danach <code>./cli/create-user.php --user admin --password 'DEIN_PASSWORT'</code>. Praktisch für reproduzierbare Setups – für den Einstieg ist der grafische Assistent aber bequemer.</div>
</div>
<h3 id="schritt-4-erste-feeds-abonnieren">Schritt 4: Erste Feeds abonnieren</h3>
<p>Klicke oben links auf <strong>Abonnementverwaltung → Feed oder Kategorie hinzufügen</strong>. Trage die Feed-URL einer Quelle ein (z. B. <code>https://www.heise.de/rss/heise-atom.xml</code>) und ordne sie einer Kategorie zu. FreshRSS erkennt das Feed-Format automatisch. Nach dem Hinzufügen mehrerer Quellen sieht die Verwaltung so aus:</p>
<p><figure class="my-6"><img src="/tutorials/freshrss-rss-reader/frss-subs_hu_668ae170dd3e3d81.webp" srcset="/tutorials/freshrss-rss-reader/frss-subs_hu_3a955ae903bbcb7b.webp 480w, /tutorials/freshrss-rss-reader/frss-subs_hu_668ae170dd3e3d81.webp 768w, /tutorials/freshrss-rss-reader/frss-subs_hu_d7b83a452ed18056.webp 1200w, /tutorials/freshrss-rss-reader/frss-subs_hu_dd25b39ac9f770d.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/freshrss-rss-reader/frss-subs_hu_41d9e4b0ad19db6b.webp"
    alt="Die FreshRSS-Abonnementverwaltung mit Feeds in den Kategorien Nachrichten und Unkategorisiert" title="Die Abonnementverwaltung: Feeds in Kategorien gruppiert, mit Import/Export und Statistiken"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Die Abonnementverwaltung: Feeds in Kategorien gruppiert, mit Import/Export und Statistiken</figcaption></figure></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>Bestehende Feeds per OPML übernehmen
  </p>
  <div class="prose-kitchen text-sm">Wechselst du von einem anderen Reader (Feedly, Inoreader, altes Google Reader), exportiere dort eine <strong>OPML-Datei</strong> und importiere sie unter „Importieren / Exportieren“. So ziehen all deine Abos mit einem Klick um – inklusive Kategoriestruktur.</div>
</div>
<h3 id="schritt-5-lesen">Schritt 5: Lesen</h3>
<p>Zurück in der Leseansicht sammelt FreshRSS die Artikel aller Quellen chronologisch, gruppiert nach Kategorie. Ungelesene Zähler pro Feed, Sternchen für Favoriten, Volltextsuche – alles da:</p>
<p><figure class="my-6"><img src="/tutorials/freshrss-rss-reader/frss-read_hu_32e47ce72da844d5.webp" srcset="/tutorials/freshrss-rss-reader/frss-read_hu_e056ca3657c63c39.webp 480w, /tutorials/freshrss-rss-reader/frss-read_hu_32e47ce72da844d5.webp 768w, /tutorials/freshrss-rss-reader/frss-read_hu_254dd068f2a21d3a.webp 1200w, /tutorials/freshrss-rss-reader/frss-read_hu_48a83f2154c7163e.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/freshrss-rss-reader/frss-read_hu_224c4bc1c01d15a6.webp"
    alt="Die FreshRSS-Leseansicht mit aktuellen Artikeln von heise online und t3n, gruppiert in Kategorien" title="Die Leseansicht: alle Quellen an einem Ort, mit Ungelesen-Zählern und Suche"
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Die Leseansicht: alle Quellen an einem Ort, mit Ungelesen-Zählern und Suche</figcaption></figure></p>
<h3 id="schritt-6-handy-apps-anbinden-optional">Schritt 6: Handy-Apps anbinden (optional)</h3>
<p>FreshRSS spricht die <strong>Google-Reader-API</strong>, sodass viele mobile Apps es als Sync-Backend nutzen können. Aktiviere sie unter <strong>Einstellungen → Profil → Externer Zugriff via API</strong> und vergib dort ein separates API-Passwort. In der App (z. B. Reeder, FeedMe, NetNewsWire) wählst du „FreshRSS“ oder „Google Reader API“, trägst <code>https://DEINE_DOMAIN/api/greader.php</code>, deinen Benutzernamen und das API-Passwort ein – und liest unterwegs synchron weiter.</p>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<div class="troubleshoot not-prose">
<p><strong>Der Assistent meldet Schreibrechte-Fehler beim <code>data</code>-Ordner.</strong> Der Container läuft als <code>www-data</code> (UID 33). Bei bind-gemountetem <code>./data</code> müssen die Rechte passen: <code>chown -R 33:33 /opt/freshrss/data</code> (siehe <a href="/tutorials/linux-benutzer-und-rechte/">Benutzer &amp; Rechte</a>).</p>
<p><strong>Feeds werden nicht automatisch aktualisiert.</strong> Prüfe, ob <code>CRON_MIN</code> gesetzt ist und der interne Cron läuft: <code>docker compose logs freshrss | grep -i cron</code>. Manuell anstoßen kannst du jederzeit über den Aktualisieren-Knopf oben rechts oder <code>docker compose exec -u www-data freshrss ./cli/actualize-user.php --user admin</code>.</p>
<p><strong>Ein Feed bleibt leer / wird als „inaktiv&quot; markiert.</strong> Die Quelle liefert kein gültiges RSS/Atom, oder die URL ist eine HTML-Seite statt des Feeds. Viele Seiten verstecken den Feed – suche im Seitenquelltext nach <code>application/rss+xml</code>. Unter „Statistiken → Inaktive Feeds“ findest du Problemquellen gebündelt.</p>
<p><strong>Login klappt nicht, obwohl das Passwort stimmt.</strong> FreshRSS verschlüsselt das Passwort im Browser (JavaScript). Ist JavaScript deaktiviert oder die Verbindung nicht wirklich HTTPS (Zertifikatswarnung), scheitert der Login. Über Traefik ist HTTPS gegeben – prüfe im Zweifel das Zertifikat.</p>
<p><strong>Nach einem Update fehlen Artikel.</strong> FreshRSS bereinigt alte Artikel nach einer einstellbaren Frist (Standard: einige Wochen). Das ist gewollt und hält die Datenbank klein; erhöhe bei Bedarf die Aufbewahrung pro Feed in dessen Einstellungen.</p>

</div>

<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<ul>
<li><strong>Updates.</strong> Setze den Image-Tag (<code>freshrss/freshrss:1.29.1</code>) gelegentlich auf die neue Version und <code>docker compose up -d</code>; FreshRSS wandert seine Datenbank beim Start automatisch mit. Größere Sprünge kündigt das Projekt in den Release-Notes an – meist ist nichts weiter zu tun. Den Rest erledigt dein normaler <a href="/tutorials/docker-stack-aktuell-halten/">Update-Prozess</a>.</li>
<li><strong>Backup.</strong> Der gesamte Zustand liegt im <code>data</code>-Ordner (SQLite-Datenbank + Konfiguration). Ihn ins <a href="/tutorials/backups-mit-restic/">Restic-Backup</a> aufnehmen – dann sind Abos, Kategorien und gelesene Markierungen gesichert. Zusätzlich lohnt ein regelmäßiger <strong>OPML-Export</strong> deiner Feed-Liste als menschenlesbares, reader-unabhängiges Backup.</li>
<li><strong>Aufwand ist gering.</strong> FreshRSS ist ein „einmal einrichten, dann läuft es&quot;-Dienst. Die einzige wiederkehrende Aufgabe ist das Pflegen deiner Feed-Liste – tote Quellen unter „Inaktive Feeds“ ausmisten, Neues abonnieren.</li>
</ul>
]]></content:encoded></item></channel></rss>