FreshRSS auf Ubuntu-VPS installieren
Installieren Sie FreshRSS 1.29.1 auf Ubuntu 24.04 mit Apache, PHP und MariaDB. Lernen Sie Release-Tarball, Virtual Host, Cronjob und Mobile-API kennen.
Was Sie erstellen
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 davor, PHP dahinter, MariaDB für die Speicherung und einen Cronjob, der neue Artikel abruft. RSS (Really Simple Syndication) ist ein 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, über die Smartphone-Apps kommunizieren.
Die Installation selbst ist klein: Sie entpacken ein Release, erstellen eine Datenbank, schreiben einen Virtual Host und führen einen Befehlszeilen-Installer aus. Der größte Teil der folgenden Anleitung behandelt Probleme, die anschließend häufig auftreten. Dazu gehören der Aktualisierungsjob, codierte Schrägstriche für die mobile API und die Dateibesitzrechte.
FreshRSS 1.29.1 ist im Juli 2026 das aktuelle Release und benötigt PHP 8.1 oder neuer. Ubuntu 24.04 enthält PHP 8.3. Die Pakete der Distribution reichen daher aus. Ein PHP-Repository eines Drittanbieters ist nicht erforderlich.
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 mariadbsystemctl 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 apache2Prü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 Web-Roots und konfigurieren Sie Apache so, dass es darauf verweist. Wenn das Anwendungsverzeichnis vom Dokumentenstamm getrennt ist, kann nur der öffentliche Ordner per HTTP erreicht werden.
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/freshrssSetzen Sie nun die Berechtigungen. Die FreshRSS-Dokumentation ist hierbei strikt: Der Benutzer des Webservers 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/dataWenn 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 ist für eine Person mit einigen hundert Feeds geeignet. MariaDB ist die bessere Wahl, sobald mehrere Personen die Instanz gemeinsam nutzen, weil konkurrierende Schreibvorgänge des Aktualisierungsjobs und der Weboberfläche dann nicht mehr um eine einzelne Dateisperre konkurrieren.
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 Schriftzeichen. Die alte Drei-Byte-Kodierung utf8 schneidet einen Artikeltitel beim ersten Zeichen mit vier Byte 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 apache2configtest 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 nicht abgerufen, solange Sie dies nicht konfigurieren. FreshRSS aktualisiert Feeds, während ein Browser die Anwendung geöffnet hat. Eine Instanz, die Sie zweimal täglich aufrufen, zeigt Ihnen daher Artikel, die zwölf Stunden veraltet sind. Abhilfe schafft das vom Projekt dafür bereitgestellte Skript app/actualize_script.php, das über cron ausgeführt wird.
sudo crontab -u www-data -eFügen Sie eine Zeile hinzu:
*/20 * * * * php /srv/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1Zwanzig Minuten sind das sinnvolle Minimum. Das Skript aktualisiert einen einzelnen Feed höchstens einmal innerhalb von zwanzig Minuten. Ein kürzeres Intervall verbraucht daher nur zusätzliche CPU-Ressourcen. Führen Sie das Skript zunächst einmal manuell aus:
sudo -u www-data php /srv/freshrss/app/actualize_script.phpEine 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 oben links in der Oberfläche die Plus-Schaltflä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, meist unter /feed, /rss oder /atom.xml. Kategorien sind Ordner. Einen Feed zwischen Kategorien zu verschieben, erfolgt per Drag-and-drop.
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 unterstützt, kann dieses Format exportieren. 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.
Lesen Sie auf dem Smartphone
FreshRSS unterstützt die Google Reader API, die von fast jeder RSS-App unterstützt wird. Zwei Voraussetzungen müssen erfüllt sein. In den Authentifizierungseinstellungen muss „Allow API access“ aktiviert sein. Das wurde bereits mit dem oben genannten --api-enabled-Flag gesetzt. In Ihrem Profil muss das Feld für das API-Passwort einen Wert enthalten. Es ist bewusst 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 ausgegeben. Ein Fehler an dieser Stelle wird fast immer durch die fehlende Zeile AllowEncodedSlashes On verursacht. Tragen 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 ein.
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 Zustand: die Datenbank und /srv/freshrss/data/. Erstellen Sie mit sudo mysqldump freshrss > freshrss.sql einen Dump der Datenbank, kopieren Sie /srv/freshrss/data/, und bewahren Sie beides außerhalb dieses Servers auf. Ihre Abonnementliste sollte gelegentlich ebenfalls als OPML-Export gesichert werden, da diese Datei Ihre Leseumgebung in praktisch jeder RSS-Software wiederherstellt.
Für ein Upgrade entpacken Sie eine neuere Version über dasselbe Verzeichnis und führen die Befehle zur Eigentümerzuordnung erneut aus. FreshRSS führt die erforderlichen Datenbankmigrationen beim nächsten Laden einer Seite selbstständig aus. Erstellen Sie vorher ein Backup, da eine fehlgeschlagene Migration in einer Datenbank, die Sie nicht wiederherstellen können, nicht mehr behoben werden kann. Ein Reader ist ein Dienst mit geringem Risiko und ein guter erster Kandidat, wenn Sie eine Liste der Anwendungen durchgehen, die sich für Self-Hosting lohnen.
FAQ
Warum werden meine Feeds nur aktualisiert, wenn ich FreshRSS öffne?
Weil noch kein Scheduler vorhanden ist, solange Sie keinen einrichten. FreshRSS aktualisiert Feeds, solange eine Browsersitzung geöffnet ist, und führt keine Aktualisierung durch, wenn der Tab geschlossen wird. 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. Eine leere Ausgabe bedeutet meist, dass Cron das Skript als den falschen Benutzer ausführt und PHP daher nicht in data/ schreiben kann.
Meine mobile App kann keine Verbindung herstellen, aber die Website funktioniert. Warum?
Die Google Reader API verwendet codierte Schrägstriche (%2F) in Anfragepfaden. Apache weist solche Pfade standardmäßig zurück. Fügen Sie AllowEncodedSlashes On in den Virtual Host ein und laden Sie Apache neu. Überprüfen Sie die Änderung, indem Sie https://rss.example.com/api/ öffnen und „Check full server configuration“ ausführen. Dort sollte PASS gemeldet werden. 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 für einen einzelnen Benutzer, weil Sie nichts installieren und kein Passwort verwalten müssen. MariaDB, sobald mehr als eine Person die Instanz verwendet oder sobald Sie einige hundert Feeds überschreiten. Der Aktualisierungsjob und die Weboberfläche schreiben dann gleichzeitig, und eine einzelne Dateisperre wird zum begrenzenden Faktor. Ein späterer Wechsel ist über die Export- und Importbefehle möglich. Die Entscheidung ist daher nicht dauerhaft.
Die Installationsroutine schlägt beim Schreiben ihrer Konfiguration fehl. Was ist die Ursache?
PHP läuft unter Apache als www-data. 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 und starten Sie anschließend die Installationsroutine wieder. Wenn Sie die Befehlszeilen-Installationsroutine bereits als root ausgeführt haben, löschen Sie vor dem nächsten Versuch die von ihr unter data/ erstellten Dateien. Ihre Eigentümerschaft ist die eigentliche Ursache.
Wie viele Serverressourcen benötigt ein selbst gehosteter RSS-Reader?
Sehr wenige. Einige hundert Feeds auf einem kleinen Tarif sind unproblematisch. Die Last besteht aus kurzen HTTP-Abrufspitzen alle zwanzig Minuten, und die Datenbank bleibt klein, sobald alte Artikel gelöscht werden. Der Speicherplatz wächst mit der Aufbewahrungsdauer. Legen Sie daher in den Archivierungseinstellungen eine Richtlinie zum Löschen von Artikeln fest, statt alle Artikel dauerhaft aufzubewahren.