SSD Nodes Learn 8GB RAM — $66/Jahr
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-08-01

FreshRSS auf einem Ubuntu-VPS selbst hosten

Installieren Sie FreshRSS 1.29.1 auf Ubuntu 24.04 mit Apache, PHP und MariaDB. Die Anleitung zeigt Release-Tarball, Virtual Host, Cron-Job und mobile API.

Was Sie aufbauen

Ein selbst gehosteter RSS-Reader ist ein Feed-Reader, der auf einem Server läuft, den Sie selbst verwalten. Dadurch kann niemand den Dienst abschalten oder die angezeigten Inhalte ändern. In dieser Anleitung installieren Sie FreshRSS auf einem Ubuntu-24.04-VPS: Apache ist vorgeschaltet, PHP läuft dahinter, MariaDB übernimmt die Speicherung, und ein Cron-Job ruft neue Artikel ab. RSS (Really Simple Syndication) ist das Dateiformat, das eine Website veröffentlicht, damit Software ihre Artikel lesen kann. FreshRSS ist die PHP-Anwendung, die diese Dateien sammelt, die Artikel speichert und eine Weboberfläche sowie eine API (Application Programming Interface) bereitstellt, die von Smartphone-Apps verwendet wird.

Die Installation selbst ist klein: Entpacken Sie ein Release, erstellen Sie eine Datenbank, schreiben Sie einen Virtual Host und führen Sie ein Installationsprogramm über die Befehlszeile aus. Der meiste Aufwand entsteht danach. Häufige Fehler betreffen den Aktualisierungsjob, codierte Schrägstriche für die mobile API und die Dateibesitzrechte.

FreshRSS 1.29.1 ist seit Juli 2026 das aktuelle Release und benötigt PHP 8.1 oder neuer. Ubuntu 24.04 enthält PHP 8.3. Die Distributionspakete sind daher ausreichend, und Sie benötigen kein PHP-Repository eines Drittanbieters.

Mit einem funktionierenden LAMP-Stack beginnen

FreshRSS ist eine gewöhnliche PHP-Anwendung. Daher benötigt sie dieselbe Grundlage wie jede andere PHP-Anwendung. Wenn Sie diese Grundlage noch nicht eingerichtet haben, folgen Sie zuerst der LAMP-Stack-Einrichtung für Ubuntu 24.04 und kehren Sie anschließend hierher zurück. Die Kurzfassung:

sudo apt update
sudo apt install -y apache2 mariadb-server php libapache2-mod-php
sudo systemctl enable --now apache2 mariadb

systemctl status apache2 sollte active (running) ausgeben. Wenn Apache nicht startet, belegt normalerweise bereits ein anderer Prozess Port 80. sudo ss -ltnp | grep :80 gibt den Prozessnamen aus.

Die von FreshRSS benötigten PHP-Erweiterungen

FreshRSS behandelt libxml, cURL, JSON, PDO_MySQL, PCRE und ctype als zwingend erforderlich. Außerdem werden mbstring, iconv, Zlib und ZipArchive benötigt, auf einem 32-Bit-System zusätzlich GMP. Unter Ubuntu werden diese Erweiterungen als Distributionspakete installiert:

sudo apt install -y php-curl php-mbstring php-xml php-zip php-mysql php-intl php-gmp
sudo systemctl restart apache2

Prüfen Sie mit php -m, welche PHP-Erweiterungen tatsächlich geladen sind. Eine fehlende Erweiterung verhindert den Start des Installationsprogramms nicht. Stattdessen wird der Vorgang auf dem Bildschirm mit den Anforderungen durch eine rote Zeile mit dem Namen der Erweiterung angehalten. Das ist ein ungünstiger Zeitpunkt, um das Problem zu entdecken. Prüfen Sie es daher jetzt. Ein Neustart von Apache ist erforderlich, weil libapache2-mod-php PHP im Apache-Prozess ausführt. Eine neu installierte Erweiterung ist für den Webserver erst nach dessen Neustart verfügbar.

Release herunterladen

Installieren Sie FreshRSS außerhalb des standardmäßigen Webroots und richten Sie Apache darauf aus. Wenn Sie das Anwendungsverzeichnis vom Dokumentenstamm trennen, ist über HTTP nur der öffentliche Ordner erreichbar.

cd /tmp
curl -fsSLO https://github.com/FreshRSS/FreshRSS/archive/refs/tags/1.29.1.tar.gz
tar xzf 1.29.1.tar.gz
sudo mv FreshRSS-1.29.1 /srv/freshrss

Nun zu den Berechtigungen, auf denen die FreshRSS-Dokumentation strikt besteht: Der Webserver-Benutzer besitzt den Verzeichnisbaum, die Gruppe kann jede Datei lesen und in ./data/ schreiben.

sudo chown -R www-data:www-data /srv/freshrss
sudo chmod -R g+r /srv/freshrss
sudo chmod -R g+w /srv/freshrss/data

Wenn Sie diesen Schritt überspringen, schlägt das Installationsprogramm beim Schreiben seiner Konfiguration fehl, weil PHP als www-data ausgeführt wird und www-data nicht in ein root gehörendes Verzeichnis schreiben kann.

Datenbank erstellen

FreshRSS unterstützt SQLite, MariaDB, MySQL und PostgreSQL. SQLite erfordert keine Einrichtung und eignet sich für eine Person mit einigen hundert Feeds. MariaDB ist die bessere Wahl, sobald mehrere Personen dieselbe Instanz verwenden. Gleichzeitige Schreibvorgänge des Aktualisierungsjobs und der Weboberfläche konkurrieren dann nicht mehr um eine einzelne Dateisperre.

sudo mariadb -e "CREATE DATABASE freshrss CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mariadb -e "CREATE USER 'freshrss'@'localhost' IDENTIFIED BY 'ReplaceThisPassword';"
sudo mariadb -e "GRANT ALL PRIVILEGES ON freshrss.* TO 'freshrss'@'localhost';"
sudo mariadb -e "FLUSH PRIVILEGES;"

Verwenden Sie utf8mb4 und nicht utf8. Feeds enthalten Emojis und nichtlateinische Schriftsysteme. Die alte Drei-Byte-Kodierung utf8 kürzt einen Artikeltitel beim ersten Zeichen mit vier Bytes ab.

Der virtuelle Apache-Host

Das öffentliche Verzeichnis ist p/ und nicht das oberste Verzeichnis des Verzeichnisbaums. Alles andere, einschließlich der Konfigurationsdatei mit Ihrem Datenbankpasswort, befindet sich oberhalb des DocumentRoot. Apache stellt diese Dateien niemals bereit.

<VirtualHost *:80>
	ServerName rss.example.com
	DocumentRoot /srv/freshrss/p/

	<Directory /srv/freshrss/p>
		AllowOverride AuthConfig FileInfo Indexes Limit
		Require all granted
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/freshrss_error.log
	CustomLog ${APACHE_LOG_DIR}/freshrss_access.log combined

	AllowEncodedSlashes On
</VirtualHost>

Speichern Sie die Datei als /etc/apache2/sites-available/freshrss.conf und aktivieren Sie sie:

sudo a2enmod rewrite
sudo a2ensite freshrss
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2

configtest sollte Syntax OK ausgeben. AllowEncodedSlashes On wirkt optional, ist es aber nicht: Die Google Reader API sendet Feed-Bezeichner, die %2F enthalten. Ohne diese Direktive weist Apache sie zurück. Dadurch schlagen die Synchronisierungen mobiler Apps fehl, während die Weboberfläche einwandfrei funktioniert.

Aktivieren Sie HTTPS, bevor Sie sich anmelden

Sie geben gleich ein Passwort auf dieser Website ein. Richten Sie deshalb zuerst ein Zertifikat ein. Verweisen Sie mit einem A-Record auf den Server. Folgen Sie anschließend der Certbot-Einrichtung für Apache auf Ubuntu und führen Sie sudo certbot --apache -d rss.example.com aus. Certbot schreibt den virtuellen Host für Port 443 neu und fügt die Umleitung hinzu. Prüfen Sie dies mit curl -I https://rss.example.com/. Der Befehl sollte 200 oder eine Umleitung zur Anmeldeseite zurückgeben.

Den Installer über die Befehlszeile ausführen

FreshRSS verfügt über einen browserbasierten Installer. Die Version für die Befehlszeile lässt sich jedoch wiederholt ausführen und hält genau fest, welche Optionen Sie ausgewählt haben.

sudo -u www-data php /srv/freshrss/cli/do-install.php \
  --default-user admin --auth-type form --environment production \
  --base-url https://rss.example.com --language en --api-enabled \
  --db-type mysql --db-host localhost --db-user freshrss \
  --db-password 'ReplaceThisPassword' --db-base freshrss
sudo -u www-data php /srv/freshrss/cli/create-user.php \
  --user admin --password 'a-long-passphrase' --api-password 'a-different-passphrase'

Führen Sie beide Befehle als www-data aus. Wenn Sie sie als root ausführen, gehören die Konfigurationsdateien root. Die Weboberfläche kann dann später keine Einstellungen speichern. --environment production ist ebenfalls wichtig, da die Entwicklungseinstellung PHP-Hinweise in der Seite ausgibt.

Laden Sie https://rss.example.com/ und melden Sie sich als admin an.

Warum Feeds nicht automatisch aktualisiert werden

Feeds werden erst abgefragt, wenn Sie dies konfigurieren. FreshRSS aktualisiert Feeds, solange ein Browser geöffnet ist und FreshRSS anzeigt. Eine Instanz, die Sie zweimal täglich aufrufen, zeigt Ihnen daher Artikel, die zwölf Stunden alt sind. Verwenden Sie stattdessen das vom Projekt dafür bereitgestellte Skript app/actualize_script.php und führen Sie es über cron aus.

sudo crontab -u www-data -e

Fügen Sie eine Zeile hinzu:

*/20 * * * * php /srv/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1

Zwanzig Minuten sind das sinnvolle Minimum. Das Skript aktualisiert einen einzelnen Feed höchstens einmal in zwanzig Minuten. Ein kürzeres Intervall verbraucht daher nur CPU-Zeit. Führen Sie das Skript zunächst manuell aus:

sudo -u www-data php /srv/freshrss/app/actualize_script.php

Eine erfolgreiche Ausgabe nennt jeden abgerufenen Feed und endet ohne PHP-Fehler. Wenn überhaupt keine Ausgabe erscheint, ist der cron-Benutzer falsch. Ein Berechtigungsfehler bei data/ bedeutet, dass der Schritt chmod -R g+w übersprungen wurde.

Ihre ersten Feeds hinzufügen

Verwenden Sie die Plusschaltfläche oben links in der Oberfläche, fügen Sie eine Website-Adresse ein, und FreshRSS ermittelt den Feed-Link automatisch. Die meisten Websites veröffentlichen weiterhin einen Feed, auch wenn sie nicht darauf hinweisen. Er befindet sich normalerweise unter /feed, /rss oder /atom.xml. Kategorien sind Ordner. Sie verschieben einen Feed per Drag-and-drop zwischen ihnen.

Wenn Sie von einem anderen Reader wechseln, exportieren Sie dort eine OPML-Datei und importieren Sie sie auf der Seite für die Abonnementverwaltung. OPML (Outline Processor Markup Language) ist das Standardformat für Feed-Listen. Jeder Reader, der den Wechsel wert ist, unterstützt dieses Format. Ein großer Import ist bei der ersten Aktualisierung langsam, weil jeder Feed einmal abgerufen wird. Warten Sie daher den ersten cron-Lauf ab, bevor Sie die Geschwindigkeit beurteilen.

Auf dem Smartphone lesen

FreshRSS unterstützt die Google Reader API, die fast jede RSS-App unterstützt. Zwei Voraussetzungen müssen erfüllt sein. In den Authentifizierungseinstellungen muss "Allow API access" aktiviert sein. Das wurde bereits durch das Flag --api-enabled oben festgelegt. In Ihrem Profil muss das Feld für das API-Passwort einen Wert enthalten. Es ist absichtlich vom Anmeldepasswort getrennt, weil ein Smartphone leichter verloren gehen kann.

Rufen Sie https://rss.example.com/api/ auf und wählen Sie "Check full server configuration". Bei einer funktionierenden Konfiguration wird PASS zurückgegeben. Ein Fehler an dieser Stelle wird fast immer durch die fehlende Zeile AllowEncodedSlashes On verursacht. Geben Sie in der App die Serveradresse als https://rss.example.com/api/greader.php, Ihren FreshRSS-Benutzernamen und das API-Passwort als Passwort ein.

Die Docker-Alternative

Wenn Sie PHP und Apache nicht selbst verwalten möchten, veröffentlicht das Projekt ein offizielles freshrss/freshrss-Image. Eine Compose-Datei stellt die Anwendung und ihre Datenbank gemeinsam bereit. Der übliche Kompromiss gilt: Auf dem Host gibt es weniger Komponenten, aber bei Fehlern eine zusätzliche Debugging-Ebene. Für TLS (Transport Layer Security) ist weiterhin ein Reverse-Proxy erforderlich. Wenn das für Sie besser geeignet ist, behandelt die Grundlagen von Docker Compose für einen VPS das Dateiformat. Die Cron-Zeile lautet dann docker exec --user www-data freshrss php ./app/actualize_script.php.

Backups und Upgrades

Zwei Dinge enthalten Ihren Datenbestand: die Datenbank und /srv/freshrss/data/. Sichern Sie die Datenbank mit sudo mysqldump freshrss > freshrss.sql, kopieren Sie /srv/freshrss/data/ und bewahren Sie beides außerhalb dieses Servers auf. Ihre Aboliste ist ebenfalls gelegentlich einen OPML-Export wert, da diese Datei Ihre Leseumgebung in jeder beliebigen RSS-Software wiederherstellt.

Für ein Upgrade entpacken Sie eine neuere Version über dasselbe Verzeichnis und führen die Befehle zur Eigentümerzuweisung erneut aus. FreshRSS führt die erforderlichen Datenbankmigrationen beim nächsten Laden der Seite selbstständig aus. Erstellen Sie zuerst ein Backup. Eine fehlgeschlagene Migration auf einer Datenbank, die Sie nicht wiederherstellen können, lässt sich nicht beheben. Ein Reader ist ein Dienst mit geringem Betriebsrisiko und ein guter erster Kandidat, wenn Sie eine Liste der sinnvollen Self-Hosting-Dienste durcharbeiten.

FAQ

Warum werden meine Feeds nur aktualisiert, wenn ich FreshRSS öffne?

Weil zunächst kein Scheduler vorhanden ist. FreshRSS aktualisiert Feeds, solange eine Browsersitzung geöffnet ist, und führt bei geschlossenem Tab keine Aktualisierung durch. Fügen Sie die cron-Zeile hinzu, die app/actualize_script.php als Benutzer www-data aufruft. Führen Sie das Script anschließend einmal manuell aus und lesen Sie die Ausgabe. Eine leere Ausgabe bedeutet meist, dass cron das Script als falscher Benutzer ausführt. PHP kann dann nicht in data/ schreiben.

Meine mobile App kann keine Verbindung herstellen, aber die Website funktioniert. Warum?

Die Google Reader API verwendet codierte Schrägstriche (%2F) in Request-Pfaden. Apache weist diese standardmäßig zurück. Fügen Sie AllowEncodedSlashes On innerhalb des Virtual Hosts hinzu und laden Sie Apache neu. Prüfen Sie die Korrektur, indem Sie https://rss.example.com/api/ öffnen und "Check full server configuration" ausführen. Das Ergebnis sollte PASS melden. Prüfen Sie außerdem, ob das API-Passwort in Ihrem Profil festgelegt ist. Es ist unabhängig von Ihrem Anmeldepasswort.

Sollte ich SQLite oder MariaDB verwenden?

SQLite eignet sich für einen einzelnen Benutzer. Sie müssen nichts installieren und kein Passwort verwalten. Verwenden Sie MariaDB, sobald mehr als eine Person die Instanz nutzt oder sobald Sie einige hundert Feeds überschreiten. Der Refresh-Job und die Weboberfläche schreiben dann gleichzeitig. Eine einzelne Dateisperre wird dadurch zum begrenzenden Faktor. Ein späterer Wechsel ist über die Export- und Importbefehle möglich. Die Entscheidung ist daher nicht dauerhaft.

Die Installation schlägt beim Schreiben der Konfiguration fehl. Was ist falsch?

Apache führt PHP als www-data aus. Dieser Benutzer kann nicht in ein Verzeichnis schreiben, das root gehört. Führen Sie sudo chown -R www-data:www-data /srv/freshrss und sudo chmod -R g+w /srv/freshrss/data erneut aus. Starten Sie danach die Installation erneut. Wenn Sie das Befehlszeilen-Installationsprogramm bereits als root ausgeführt haben, löschen Sie vor dem nächsten Versuch die unter data/ erstellten Dateien. Das eigentliche Problem sind deren Eigentumsrechte.

Wie viele Serverressourcen benötigt ein selbst gehosteter RSS-Reader?

Sehr wenige. Einige hundert Feeds laufen auf einem kleinen Tarif problemlos. Die Last entsteht durch kurze HTTP-Abrufe alle zwanzig Minuten. Die Datenbank bleibt klein, sobald alte Artikel gelöscht werden. Der Speicherbedarf wächst mit der Aufbewahrungsdauer. Legen Sie daher in den Archivierungseinstellungen eine Richtlinie zum Löschen von Artikeln fest, anstatt alle Artikel dauerhaft aufzubewahren.

#freshrss#rss#self-hosting#php#apache