SSD Nodes Learn Hosting plans →
Anleitungen Matt ConnorVon Matt Connor

FreshRSS auf Ubuntu VPS installieren

Installieren Sie FreshRSS auf Ihrem Ubuntu 24.04 Server mit Apache, PHP und MariaDB. Diese Anleitung zeigt die Einrichtung des Cronjobs, Dateirechte und die mobile API-Anbindung.

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 als vorgeschalteten Webserver, PHP dahinter, MariaDB zur Speicherung und einen Cron-Job, der neue Artikel abruft. RSS (Really Simple Syndication) ist ein Dateiformat, das eine Website veröffentlicht, damit Software ihre Artikel einlesen kann. FreshRSS ist die PHP-Anwendung, die diese Dateien sammelt, die Artikel speichert und eine Weboberfläche sowie eine API (Application Programming Interface) bereitstellt, über die Smartphone-Apps kommunizieren.

Die Installation selbst ist klein: Entpacken Sie ein Release, erstellen Sie eine Datenbank, schreiben Sie einen Virtual Host, führen Sie das Kommandozeilen-Installationsprogramm aus und erstellen Sie das Konto mit cli/create-user.php. Der meiste Aufwand entsteht anschließend bei den Punkten, die häufig falsch eingerichtet werden: beim Aktualisierungs-Job, bei URL-kodierten Schrägstrichen für die mobile API und bei den Dateibesitzrechten.

FreshRSS 1.30.4, veröffentlicht am 21. Oktober 2026, ist am 29. Oktober 2026 das aktuelle Release und benötigt PHP 8.1 oder neuer. Ubuntu 24.04 wird mit PHP 8.3 ausgeliefert. Daher reichen die Pakete der Distribution aus, und Sie benötigen kein PHP-Repository eines Drittanbieters.

Mit einem funktionierenden LAMP-Stack beginnen

FreshRSS ist eine gewöhnliche PHP-Anwendung und benötigt daher dieselbe Grundlage wie andere PHP-Anwendungen. Wenn Sie diese Grundlage noch nicht eingerichtet haben, folgen Sie zuerst der Anleitung zum Einrichten eines LAMP-Stacks unter Ubuntu 24.04 und kehren Sie anschließend hierher zurück. 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, ist die häufigste Ursache, dass ein anderer Prozess bereits Port 80 verwendet. sudo ss -ltnp | grep :80 zeigt an, welcher Prozess das ist.

Die von FreshRSS benötigten PHP-Erweiterungen

FreshRSS setzt libxml, cURL, JSON, PDO_MySQL, PCRE und ctype voraus. Außerdem benötigt es mbstring, iconv, Zlib und ZipArchive sowie auf einem 32-Bit-System 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 bricht die Installation auf der Seite mit den Anforderungen ab und zeigt eine rote Zeile mit dem Namen der Erweiterung an. Das ist ein ungünstiger Zeitpunkt, um das Problem zu entdecken. Prüfen Sie es daher jetzt. Der 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 einem Neustart sichtbar.

Release herunterladen

Installieren Sie FreshRSS außerhalb des standardmäßigen Webroots und konfigurieren Sie Apache so, dass darauf verwiesen wird. Wenn das Anwendungsverzeichnis vom Document Root getrennt bleibt, ist über HTTP ausschließlich der öffentliche Ordner erreichbar.

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

Passen Sie nun die Berechtigungen an. Die FreshRSS-Dokumentation verlangt hier eine strikte Konfiguration: Der Webserver-Benutzer besitzt den Verzeichnisbaum, die Gruppe kann jede Datei lesen, und die Gruppe kann 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 benötigt die Erweiterung php-sqlite3, aber keinen eingerichteten Datenbankserver. Die Daten jedes Benutzers werden in einer separaten data/users/_user_/db.sqlite-Datei gespeichert. Beim Hinzufügen von Benutzern werden deren Schreibvorgänge nicht in einer gemeinsamen SQLite-Datei zusammengeführt. Diese Anleitung verwendet MariaDB als Teil des LAMP-Stacks.

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 Schriften. Die alte dreibyte utf8-Kodierung kann keine Zeichen mit vier Bytes speichern. Nicht unterstützte Zeichen verursachen im standardmäßigen strikten Modus von MariaDB einen Fehler. Eine Kürzung hängt vom SQL-Modus und von Anweisungsoptionen wie IGNORE ab.

Der virtuelle Host von Apache

Das öffentliche Verzeichnis ist p/ und nicht das oberste Verzeichnis des Verzeichnisbaums. Alles andere, einschließlich der Konfigurationsdatei mit dem Datenbankpasswort, liegt oberhalb des DocumentRoot, wo Apache es niemals ausliefert.

<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-IDs, die %2F enthalten. Ohne diese Direktive weist Apache sie zurück. Dadurch können mobile Apps nicht synchronisieren, während die Weboberfläche problemlos funktioniert.

HTTPS hinzufügen, 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 unter Ubuntu und führen Sie sudo certbot --apache -d rss.example.com aus. Certbot passt den Virtual Host für Port 443 an und fügt die Weiterleitung hinzu. Prüfen Sie die Konfiguration mit curl -I https://rss.example.com/. Der Befehl sollte 200 oder eine Weiterleitung zur Anmeldeseite zurückgeben.

Führen Sie das Installationsprogramm über die Befehlszeile aus

FreshRSS verfügt über ein browserbasiertes Installationsprogramm. Die Version für die Befehlszeile lässt sich jedoch wiederholt ausführen und protokolliert genau, 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, werden Konfigurationsdateien angelegt, die root gehören. Die Weboberfläche kann dann später keine Einstellungen mehr speichern. --environment production ist ebenfalls wichtig, weil die Entwicklungseinstellung PHP-Hinweise in die Seite schreibt.

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

Warum Feeds nicht automatisch aktualisiert werden

Feeds werden erst abgerufen, wenn Sie dies konfigurieren. Das Öffnen von FreshRSS plant keinen Feed-Abruf ein. Ohne einen Scheduler verwenden Sie den Aktualisierungslink im Navigationsmenü, um Artikel manuell abzurufen. Die Lösung ist das vom Projekt dafür bereitgestellte Skript app/actualize_script.php, das über cron ausgeführt wird.

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 ein sinnvoller Zeitplan. Das Aktualisierungsintervall des jeweiligen Feeds gilt jedoch weiterhin: Der Standardwert beträgt eine Stunde. Für einzelne Feeds sind Intervalle bis hinunter zu fünfzehn Minuten möglich. Führen Sie das Skript zunächst einmal manuell aus:

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

Eine erfolgreiche Ausgabe meldet den Aktualisierungslauf und endet ohne PHP-Fehler. Die Feed-Namen werden angezeigt, wenn Artikel hinzugefügt oder aktualisiert werden. Wenn überhaupt keine Ausgabe erscheint, prüfen Sie die PHP-Fehlerausgabe und die FreshRSS-Logs. Die fehlende Ausgabe allein weist nicht darauf hin, dass der cron-Benutzer die Ursache ist. Ein Berechtigungsfehler bei data/ erfordert die Prüfung des Eigentümers und der Schreibberechtigungen.

Fügen Sie Ihre ersten Feeds hinzu

Verwenden Sie die Plus-Schaltfläche oben links in der Benutzeroberfläche, fügen Sie eine Website-Adresse ein, und FreshRSS erkennt den Feed-Link automatisch für Sie. Die meisten Websites veröffentlichen einen Feed, auch wenn sie nicht explizit darauf hinweisen, üblicherweise unter /feed, /rss oder /atom.xml. Kategorien fungieren als Ordner, und das Verschieben eines Feeds zwischen diesen ist per Drag-and-Drop möglich.

Wenn Sie von einem anderen Reader kommen, exportieren Sie dort eine OPML-Datei und importieren Sie diese auf der Seite zur Abonnementverwaltung. OPML (Outline Processor Markup Language) ist das Standardformat für Feed-Listen, und jeder Reader, der einen Wechsel wert ist, unterstützt es. Ein großer Import ist beim ersten Aktualisierungsvorgang langsam, da jeder Feed einmal abgerufen wird. Geben Sie dem ersten Cron-Job daher Zeit, bevor Sie die Geschwindigkeit bewerten.

Lesen Sie es auf Ihrem Smartphone

FreshRSS unterstützt die Google-Reader-API, die von vielen RSS-Apps unterstützt wird. Zwei Bedingungen müssen erfüllt sein. In den Authentifizierungseinstellungen muss „Allow API access“ aktiviert sein. Das wurde bereits mit dem obigen --api-enabled-Flag gesetzt. In Ihrem Profil muss das Feld für das API-Passwort einen Wert enthalten. Es ist absichtlich vom Login-Passwort getrennt, weil ein Smartphone leichter verloren gehen kann.

Rufen Sie https://rss.example.com/api/ auf, um die Serverkonfiguration automatisch zu prüfen. Bei einer funktionierenden Konfiguration wird PASS zurückgegeben. Wenn die Prüfung fehlschlägt, prüfen Sie die Einstellung AllowEncodedSlashes On des Virtual Hosts und die gemeldete Fehlermeldung. Geben Sie in der App die Serveradresse als https://rss.example.com/api/greader.php, Ihren FreshRSS-Benutzernamen als Benutzernamen und das API-Passwort als Passwort an.

Die Docker-Alternative

Wenn Sie PHP und Apache nicht manuell verwalten möchten, stellt das Projekt ein offizielles freshrss/freshrss-Image bereit. Eine Compose-Datei stellt die Anwendung und ihre Datenbank gemeinsam bereit. Der übliche Kompromiss bleibt bestehen: Auf dem Host gibt es weniger Komponenten, bei Fehlern muss jedoch eine zusätzliche Ebene untersucht werden. Für TLS (Transport Layer Security) ist weiterhin ein Reverse Proxy erforderlich. Wenn diese Variante besser zu Ihnen passt, erläutert die Einführung in 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/. Erstellen Sie mit sudo mysqldump freshrss > freshrss.sql einen Dump der Datenbank und kopieren Sie /srv/freshrss/data/. Bewahren Sie beides an einem anderen Ort als auf diesem Server auf. Auch für Ihre Aboliste lohnt sich gelegentlich ein OPML-Export, da diese Datei Ihre Feedliste in andere Reader überträgt, die OPML unterstützen. FreshRSS-spezifische Einstellungen wie Aktualisierungsintervalle, Zugangsdaten, der User-Agent oder XPath-Regeln für das Web-Scraping bleiben dabei nicht erhalten. Verwenden Sie zusätzlich einen SQLite-Export, um diese Einstellungen zu sichern.

Für ein Upgrade entpacken Sie ein neueres Release in dasselbe Verzeichnis und führen die Befehle zur Eigentümerzuweisung erneut aus. Befolgen Sie den Upgrade-Pfad des Projekts von Version zu Version und prüfen Sie FreshRSS nach jedem Schritt. FreshRSS führt die eigenen Datenbankmigrationen beim nächsten Laden einer Seite aus. Erstellen Sie vorher ein Backup, denn eine fehlgeschlagene Migration auf einer Datenbank, die Sie nicht wiederherstellen können, lässt sich nicht beheben. Wenn Sie von einem älteren Tarball wie 1.29.1 installiert haben, wechseln Sie auf 1.30.4: Die Security-Releases der Serie 1.30.x enthalten eine Rotation der Session-IDs bei Änderungen an der Authentifizierung und Begrenzungen für ZIP-Importe. 1.30.4 aktualisiert außerdem die alternativen Alpine-Docker-Images gegen schwerwiegende PHP-Sicherheitslücken. Ein Reader ist ein Dienst mit geringem Risiko und ein guter erster Kandidat, wenn Sie eine Liste der Anwendungen durcharbeiten, die sich für Self-Hosting lohnen.

FAQ

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

Das Öffnen der Seite plant keinen Feed-Abruf. Ohne Scheduler müssen Sie den Aktualisierungslink verwenden, um die Feeds manuell zu aktualisieren. Fügen Sie die Cron-Zeile hinzu, die app/actualize_script.php als Benutzer www-data aufruft. Führen Sie das Skript anschließend einmal manuell aus und prüfen Sie die Ausgabe. Wenn keine Ausgabe erscheint, prüfen Sie die PHP-Fehlerausgabe und die FreshRSS-Logs. Stellen Sie außerdem sicher, dass der Cron-Benutzer Schreibzugriff auf data/ hat.

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 lehnt diese standardmäßig ab. Fügen Sie AllowEncodedSlashes On innerhalb des Virtual Hosts hinzu und laden Sie Apache neu. Öffnen Sie https://rss.example.com/api/, um die Änderung zu prüfen. Die automatische Konfigurationsprüfung sollte dort PASS melden. Prüfen Sie außerdem, ob das API-Passwort in Ihrem Profil gesetzt ist. Es ist unabhängig von Ihrem Login-Passwort.

Sollte ich SQLite oder MariaDB verwenden?

SQLite benötigt die Erweiterung php-sqlite3. Sie benötigen dafür jedoch keinen Datenbankserver und müssen kein Datenbankpasswort verwalten. Jeder Benutzer erhält eine eigene SQLite-Datenbankdatei. Ein zweiter Benutzer verursacht daher keinen Konflikt in einer gemeinsam verwendeten Datei und erfordert nicht den Einsatz von MariaDB. Verwenden Sie MariaDB, wenn Sie den Datenbankserver Ihres LAMP-Stacks nutzen möchten. Ein späterer Wechsel zwischen beiden Systemen ist über die Export- und Import-Befehle möglich. Die Entscheidung ist daher nicht dauerhaft.

Der Installer schlägt beim Schreiben seiner Konfiguration fehl. Was ist die Ursache?

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 anschließend den Installer wieder. Wenn Sie den Befehlszeilen-Installer bereits als root ausgeführt haben, korrigieren Sie vor dem nächsten Versuch die Eigentümer der Dateien, die er unter data/ erstellt hat.

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

Sehr wenige. FreshRSS ist für den Betrieb auf bescheidener Hardware ausgelegt. Der Ressourcenbedarf hängt jedoch von Ihren Feeds, der Artikelgröße und den Aufbewahrungseinstellungen ab. Der Speicherplatz wächst mit der Aufbewahrungsdauer. Legen Sie daher in den Archivierungseinstellungen eine Richtlinie zum Löschen alter Artikel fest, statt alle Artikel dauerhaft aufzubewahren.

War dieser Artikel hilfreich?