FreshRSS auf einem Managed VPS zu hosten heißt, dass Sie und Ihr Team Ihre RSS-Feeds auf einer Maschine lesen, die Ihnen gehört und die unsere Teams aktuell halten und Tag und Nacht beaufsichtigen. FreshRSS ist freie Software unter der AGPL-3.0. Dieser Leitfaden folgt der offiziellen Dokumentation: die Installation mit Docker Compose, HTTPS, die Aktualisierung der Feeds, Konten und Anmeldung, die API für mobile Apps, die Datenbank, Backups und Updates.
Von Simon Vasconcelos Lee
Veröffentlicht am 11. November 2026Lesezeit: 13 Minuten
data und extensions, hinter einem Reverse Proxy mit HTTPS.CRON_MIN aktualisiert die Feeds selbstständig: Das Projekt empfiehlt etwa zwei Durchläufe pro Stunde.data und, mit PostgreSQL oder MySQL, die Datenbank, und aktualisieren Sie mit docker compose pull.FreshRSS ist ein selbst gehosteter RSS-Feed-Aggregator, geschrieben in PHP. Sein README beschreibt ihn als leicht, einfach zu bedienen, leistungsfähig und anpassbar, übersetzt in mehr als zwanzig Sprachen. Es ist eine Mehrbenutzer-Anwendung, mit einem anonymen Lesemodus und eigenen Labels.
FreshRSS wird von seiner Community auf GitHub entwickelt, und seine offizielle Website wird von der FreshRSS-Community herausgegeben. Die Erweiterungen liegen in einem eigenen Repository, und die Dokumentation richtet sich an Nutzer, Administratoren und Entwickler.
FreshRSS wird unter der GNU Affero General Public License, Version 3, veröffentlicht: Sein Manifest composer.json deklariert sie als AGPL-3.0, und sein README verlinkt den Lizenztext. Dieser Text gewährt eine uneingeschränkte Erlaubnis, das unveränderte Programm auszuführen. Sie können also das vom Projekt veröffentlichte Image für Ihr Unternehmen und Ihr Team nutzen, ohne eine Lizenz zu kaufen.
Artikel 13 fügt eine Bedingung hinzu, die der AGPL eigen ist: Wenn Sie das Programm ändern, muss Ihre Version allen, die sie aus der Ferne über das Netzwerk nutzen, die Möglichkeit bieten, ihren Quellcode kostenlos zu erhalten. Eine Erweiterung eines Drittanbieters, die Sie im Volume extensions ergänzen, folgt ihrer eigenen Lizenz.
Das Projekt veröffentlicht seine offiziellen Images auf Docker Hub, als freshrss/freshrss, zusammen mit einer Beispiel-Compose-Datei. Legen Sie auf einem Server, auf dem Docker installiert ist, einen Ordner freshrss an und speichern Sie darin diese compose.yaml, entnommen aus dieser Datei und dem Docker-README:
volumes:
data:
extensions:
services:
freshrss:
image: freshrss/freshrss:latest
container_name: freshrss
hostname: freshrss
restart: unless-stopped
logging:
options:
max-size: 10m
volumes:
- data:/var/www/FreshRSS/data
- extensions:/var/www/FreshRSS/extensions
ports:
- 127.0.0.1:8080:80
environment:
TZ: UTC
CRON_MIN: '3,33'
TRUSTED_PROXY: 172.16.0.1/12 192.168.0.1/16
healthcheck:
test: ["CMD", "cli/health.php"]
timeout: 10s
start_period: 60s
start_interval: 11s
interval: 75s
retries: 3
docker compose up -d
127.0.0.1 veröffentlichter Port: FreshRSS ist nur über den Reverse Proxy erreichbar, der auf demselben Server läuft. Die Beispieldatei des Projekts veröffentlicht Port 8080 für die lokale Nutzung; die Adresse 127.0.0.1 reserviert ihn hier für den Proxy.data enthält die Konfiguration, die Konten und, mit SQLite, die Datenbank jedes Nutzers. Das README weist darauf hin, dass es alle persönlichen Daten enthält. Docker Compose benennt es nach dem Ordner: freshrss_data.extensions enthält die Erweiterungen von Drittanbietern, falls Sie welche ergänzen.TZ erhält die Zeitzone des Servers, im PHP-Format; der Standardwert ist UTC.TRUSTED_PROXY behält den Wert der Beispieldatei: die privaten Bereiche, aus denen die Anfragen des Proxys kommen. Er entscheidet, welche Adresse in den Protokollen steht, die des Besuchers oder die des Proxys.cli/health.php aus, damit Docker weiß, ob die Instanz antwortet.Das Tag latest, der Standard, folgt der zuletzt veröffentlichten versionierten Ausgabe; edge folgt der fortlaufenden Ausgabe; ein Tag wie 1.30.4 legt eine Version fest, und das Suffix -alpine liefert dasselbe auf einer Alpine-Basis statt Debian. Der Abschnitt zu den Updates kommt auf diese Wahl zurück.
Sobald der Reverse Proxy steht, öffnen Sie Ihre HTTPS-Adresse: Der Einrichtungsassistent fragt nach der Sprache, prüft den Server, bietet die Wahl der Datenbank an und legt dann das Administratorkonto an, mit seinem Passwort und der Anmeldemethode. SQLite funktioniert ohne jede Vorbereitung. Die Installation gelingt auch über die Befehlszeile, mit cli/do-install.php und cli/create-user.php, ausgeführt über docker exec --user www-data freshrss.
Bei den Ressourcen verlangt das README einen leichten Server, unter Linux oder Windows, und weist darauf hin, dass FreshRSS sogar auf einem Raspberry Pi 1 läuft, mit Antwortzeiten unter einer Sekunde, bei 150 Feeds und 22.000 Artikeln. Die Größe hängt von der Zahl der Nutzer, der Feeds und der aufbewahrten Artikel ab. Auf einem Managed VPS beschreiben Sie uns Ihren Einsatz, und wir empfehlen Ihnen die passende Größe.
Für den Produktivbetrieb rät das Docker-README zu einem Reverse Proxy auf dem Host-Server, der HTTPS bereitstellt. Wählen Sie zuerst einen Domainnamen oder eine Subdomain, etwa rss.example.com, die mit A- und AAAA-Einträgen auf den Server zeigt. Das Projekt empfiehlt Traefik und veröffentlicht dafür eine vollständige Compose-Datei, mit Zertifikaten von Let’s Encrypt und der Weiterleitung von HTTP auf HTTPS; es gibt auch Beispiele für Apache, Nginx und Caddy.
Caddy bezieht das Zertifikat und aktiviert HTTPS selbstständig. Dieser Block folgt dem Beispiel der Dokumentation für eine Subdomain, hier auf den lokal veröffentlichten Port gerichtet:
rss.example.com {
reverse_proxy 127.0.0.1:8080
}
Dieser Block folgt dem Nginx-Beispiel des Docker-README für die Wurzel einer Domain, auf Port 80 reduziert, damit Certbot HTTPS einrichten kann. Die letzten beiden Zeilen geben den Header Authorization weiter, den die Google-Reader-API braucht:
upstream freshrss {
server 127.0.0.1:8080;
keepalive 64;
}
server {
listen 80;
listen [::]:80;
server_name rss.example.com;
location / {
proxy_pass http://freshrss/;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_read_timeout 90;
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
}
}
Certbot richtet anschließend das Zertifikat ein und kümmert sich um die Erneuerung:
sudo certbot --nginx
FreshRSS bewahrt seine öffentliche Adresse in base_url auf, in der Datei data/config.php. Die API und WebSub stützen sich darauf: Prüfen Sie, dass dort Ihre https-Adresse steht. Das Docker-README zeigt, wo sich diese Datei im Volume befindet:
docker volume inspect freshrss_data
sudo nano /var/lib/docker/volumes/freshrss_data/_data/config.php
docker compose restart freshrss
'base_url' => 'https://rss.example.com/',
FreshRSS ruft neue Artikel mit seinem Skript app/actualize_script.php ab. Das Docker-Image bringt eine geplante Aufgabe mit, die es zu den in CRON_MIN angegebenen Minuten ausführt. Ohne diese Variable, oder mit einem leeren Wert, bleibt die Aufgabe ausgeschaltet, und die Feeds aktualisieren sich nicht mehr von selbst.
13,43; */20 funktioniert ebenfalls.base_url, und der Einrichtungsassistent schaltet es ein, wenn der Server eine hat.Eine weitere dokumentierte Methode: eine geplante Aufgabe auf dem Host-Server, die das Skript im Container aufruft. Entfernen Sie in diesem Fall CRON_MIN aus der compose.yaml, damit nur eine Methode bleibt:
7,37 * * * * root docker exec --user www-data freshrss php ./app/actualize_script.php > /tmp/FreshRSS.log 2>&1
Seit Version 1.30.0 weist FreshRSS Adressen des lokalen Netzwerks wie 127.0.0.1 standardmäßig ab, als Schutz vor serverseitiger Anfragefälschung (SSRF). Ein benachbarter Dienst, der Feeds erzeugt, etwa RSS-Bridge, wird über die Variable INTERNAL_HOST_ALLOWLIST zugelassen, in der Form rss-bridge:80, oder in der Systemkonfiguration. Der Wert * hebt jede Prüfung auf, und die Dokumentation nennt ihn unsicher.
Bei der Installation bietet FreshRSS die Anmeldung per Formular an, die JavaScript voraussetzt. Sie ist die Standardmethode und passt zu den meisten Instanzen. Die Dokumentation beschreibt weitere:
| Methode | Was sie tut | Wo sie eingestellt wird |
|---|---|---|
| Formular | Ein Benutzername und ein Passwort, die nur für FreshRSS gelten | Der Einrichtungsassistent |
| HTTP-Authentifizierung | Der Webserver kontrolliert den Zugang, und neue Nutzer werden bei ihrer ersten Anmeldung angelegt | Eine in den Container eingebundene Datei p/i/.htaccess, mit ihrer .htpasswd |
| Externe Authentifizierung | Der Proxy übergibt den angemeldeten Nutzer im Header Remote-User oder X-WebAuth-User | TRUSTED_PROXY, das die vertrauenswürdigen Proxys auflistet |
| OpenID Connect | Die Anmeldung läuft über Ihren Identitätsanbieter, mit dem Apache-Modul mod_auth_openidc | OIDC_ENABLED und die Variablen OIDC_*, im Debian-Image auf x86_64 |
Die Dokumentation warnt, dass FreshRSS jeder in TRUSTED_PROXY aufgeführten Adresse vertraut: Ein schlecht gesicherter Proxy würde es einem Angreifer erlauben, den Header zu setzen und Administratorzugang zu erlangen. Hier lauscht der Port nur auf 127.0.0.1, was ihn dem Proxy des Servers selbst vorbehält. Die Dokumentation rät außerdem von jeder Instanz ohne Authentifizierung ab, sobald der Server von außerhalb Ihres Netzwerks erreichbar ist.
mailer und smtp in data/config.php: Laut Dokumentation wird der Versand über die PHP-Funktion mail in den offiziellen Docker-Images noch nicht unterstützt.Für eine Instanz, die mehrere Personen teilen, rät die Dokumentation, Konten für Personen Ihres Vertrauens zu öffnen und die Instanz hinter einem Proxy oder einer Firewall zu halten, die den Zugriff auf interne Adressbereiche sperrt.
FreshRSS funktioniert im Browser, auf großen wie auf kleinen Bildschirmen, und in Apps für Android, iOS, Linux, Windows und macOS. Diese Apps nutzen eine seiner beiden APIs: Google Reader, die das README als die beste einstuft, und Fever, mit eingeschränkteren Funktionen, weniger effizient und weniger sicher.
https://rss.example.com/api/greader.php ein, oder https://rss.example.com/api/fever.php für Fever, mit dem Benutzernamen und diesem API-Passwort.Zur Prüfung öffnet der Link neben dem API-Passwort, im Profil, eine Testseite: PASS bei der vollständigen Prüfung bestätigt, dass alles funktioniert. Das Docker-Image stellt Apache bereits so ein, dass es kodierte Schrägstriche akzeptiert, die manche Apps brauchen; mit Nginx davor behalten Sie die Weitergabe des Headers Authorization bei.
Das README führt eine Tabelle der kompatiblen Apps, mit ihrer Plattform, ihrer API und ihren Funktionen: Capy Reader und Readrops unter Android, FeedFlow auf Mobilgeräten und dem Desktop, RSS Guard und NewsFlash auf dem Desktop, ReadKit und Reeder Classic unter iOS und macOS, neben weiteren.
FreshRSS bringt SQLite mit, das das Docker-README als einfachste Option beschreibt, mit guter Leistung. Die Seite mit den Voraussetzungen empfiehlt PostgreSQL 10 oder neuer und akzeptiert auch MariaDB 10.6 und MySQL 8.0 oder neuer. Die Wahl treffen Sie im Einrichtungsassistenten.
| Datenbank | Einrichtung | Backup |
|---|---|---|
| SQLite | Keine: eine Datei pro Nutzer, data/users/<user>/db.sqlite | Das Volume data |
| PostgreSQL | Ein Dienst postgres in derselben compose.yaml | pg_dump oder cli/db-backup.php |
| MySQL oder MariaDB | Ihr Datenbankserver und sein Hostname im Assistenten | mysqldump oder cli/db-backup.php |
Für PostgreSQL ergänzen Sie die compose.yaml um diesen Dienst, entnommen aus der Datei docker-compose-db.yml des Projekts, und die Liste der Volumes um das Volume db. Das Passwort kommt in eine Datei .env neben der compose.yaml:
freshrss-db:
image: postgres:18
container_name: freshrss-db
hostname: freshrss-db
restart: unless-stopped
logging:
options:
max-size: 10m
volumes:
- db:/var/lib/postgresql
environment:
POSTGRES_DB: freshrss
POSTGRES_USER: freshrss
POSTGRES_PASSWORD: ${DB_PASSWORD}
DB_PASSWORD='a-long-unique-password'
Wählen Sie im Assistenten PostgreSQL und geben Sie freshrss-db als Host an, mit dem Benutzer, dem Passwort und der Datenbank freshrss.
Diese Wahl lässt sich später ändern. Die Dokumentation beschreibt den Wechsel von einer Datenbank zur anderen, zum Beispiel von MySQL zu PostgreSQL, oder zu einer neueren Hauptversion von PostgreSQL: cli/db-backup.php kopiert die Datenbank jedes Nutzers in eine SQLite-Datei, und cli/db-restore.php lädt sie dann in die neue Datenbank.
Das README stellt klar, dass FreshRSS ohne jede Gewährleistung geliefert wird: Ihre Backups bewahren Ihre Abonnements, Ihre Artikel und Ihre Einstellungen. Das soll laut Dokumentation gesichert werden:
| Element | Was es enthält | Zu sichern |
|---|---|---|
data/ | Die Konfiguration, die Konten, die Protokolle und, mit SQLite, die Datenbanken | Pflicht; cache/ kann entfallen, FreshRSS baut es neu auf |
extensions/ | Die Erweiterungen von Drittanbietern | Empfohlen, wenn Sie welche nutzen |
| Die externe Datenbank | Mit PostgreSQL, MySQL oder MariaDB die Daten der Nutzer | Pflicht, separat |
Die Dokumentation hält es für sicherer, den Dienst während Wartungsarbeiten anzuhalten. Docker-Volumes werden mit einem temporären Container kopiert, nach der Methode aus der Docker-Dokumentation:
docker compose stop freshrss
docker run --rm --volumes-from freshrss -v "$PWD":/backup ubuntu tar -czf /backup/freshrss-$(date +%F).tgz --exclude=data/cache -C /var/www/FreshRSS data extensions
docker compose start freshrss
Seit Version 1.29.1 kann FreshRSS die Datenbank jedes Nutzers selbst in eine SQLite-Datei exportieren, gleich welche Datenbank Sie nutzen, und nur die neuesten aufbewahren. Aktivieren Sie diesen Export in data/config.php:
'auto_sqlite_export' => [
'enabled' => true,
'retention' => 7,
],
Planen Sie dann den Befehl auf dem Server, hier jede Nacht. Jeder Durchlauf schreibt data/users/<user>/sqlite-backups/<date>.sqlite und löscht die Dateien jenseits der letzten sieben:
20 2 * * * root docker exec --user www-data freshrss cli/export-sqlite-auto.php --quiet
Mit PostgreSQL ergänzen Sie einen Export mit dem eigenen Werkzeug der Datenbank, wie im Docker-README. Die Option -T verzichtet auf das Terminal, das eine geplante Aufgabe nicht braucht:
docker compose exec -T freshrss-db pg_dump -U freshrss freshrss | gzip -9 > freshrss-postgres-$(date +%F).sql.gz
Der OPML-Export aus der Oberfläche sichert Ihre Feed-Liste, ohne einige FreshRSS-eigene Einstellungen wie Zugangsdaten oder Regeln für das Auslesen von Seiten. Für eine vollständige Kopie behalten Sie die SQLite-Exporte: Auf der Festplatte des Servers abgelegt, fließen sie auch in dessen nächtliche Backups ein.
docker compose stop freshrss.docker run --rm --volumes-from freshrss -v "$PWD":/backup ubuntu tar -xzf /backup/freshrss-YYYY-MM-DD.tgz -C /var/www/FreshRSS.cli/db-restore.php --delete-backup --force-overwrite.docker compose start freshrss neu und prüfen Sie dann, ob Ihre Feeds und Artikel da sind.Wiederholen Sie diese Übung von Zeit zu Zeit, an einer Kopie: So prüfen Sie, dass ein Backup funktioniert.
Das Docker-README nennt zwei Befehle, auszuführen im Ordner der compose.yaml. Die Volumes bleiben dabei erhalten:
docker compose pull
docker compose up -d
FreshRSS veröffentlicht auf zwei Kanälen. Die versionierten Ausgaben, Tag latest, erscheinen einige Male im Jahr, ohne festen Kalender, und ihre Korrekturen werden nicht auf ältere Versionen zurückportiert. Die fortlaufende Ausgabe, Tag edge, erhält neue Funktionen und Korrekturen, sobald sie fertig sind: Seit Version 1.30.0 empfiehlt das Projekt sie für schnellere Sicherheitskorrekturen.
data/, der Erweiterungen und der Datenbank.1.29.1 diesen Weg.Um neue Versionen zu verfolgen, veröffentlicht das Projekt einen Atom-Feed seiner Versionen: Abonnieren Sie ihn in Ihrer eigenen FreshRSS-Instanz.
Beim Selbsthosting müssen Sie neben der Anwendung auch den Server betreuen. Auf einem Managed VPS übernehmen unsere Teams den Server und betreuen Ihre Instanz proaktiv; FreshRSS bleibt Ihre Software, mit ihren Einstellungen und Daten.
| Thema | Unsere Teams | Sie |
|---|---|---|
| Der Server | System- und Sicherheitsupdates, Eingriffe am Server inbegriffen | Der Zeitpunkt, der zu Ihrem Betrieb passt |
| Die Überwachung | Server rund um die Uhr im Blick, mit Eingriff, ohne auf Ihren Anruf zu warten | Das Lesen der Protokolle Ihrer Instanz |
| FreshRSS | Proaktive Betreuung: Fehler, lange Antwortzeiten und Speicherplatz erkannt, Korrektur empfohlen | Installation, Updates und Einstellungen, die Sie umsetzen, selbst oder mit Ihrem KI-Assistenten |
| Die Konten und die Feeds | Der Server, der sie trägt, überwacht und gesichert | Die Nutzer, die Abonnements, die Erweiterungen und die API-Passwörter |
| Die Backups | Jede Nacht, verschlüsselt und außerhalb der Maschine aufbewahrt; Wiederherstellung inbegriffen | Die eigenen Exporte von FreshRSS und die Wiederherstellungsanfrage, wenn Sie sie brauchen |
| Die Migration | Ihr aktueller Server wird kostenlos migriert | Der Zeitpunkt der Umstellung |
Wenn unsere Teams lieber in der Anwendung selbst eingreifen sollen, wird diese Leistung nach Stunden oder pauschal abgerechnet, mit einem Kostenvoranschlag vor dem Eingriff.
Mit einem Managed VPS von Simafri halten unsere Teams den Server Ihrer FreshRSS-Instanz aktuell, überwachen ihn Tag und Nacht und greifen ein, ohne auf Ihren Anruf zu warten; sie betreuen auch Ihre Instanz proaktiv und empfehlen Ihnen die sinnvollen Korrekturen, die Sie umsetzen, selbst oder mit Ihrem KI-Assistenten. Die Backups werden jede Nacht verschlüsselt und außerhalb der Maschine aufbewahrt, ihre Wiederherstellung ist inbegriffen, und die Migration Ihres aktuellen Servers ist kostenlos.
Ja. FreshRSS steht unter der AGPL-3.0: Sie können es im Unternehmen betreiben, ohne eine Lizenz zu kaufen. Wenn Sie es ändern, muss Ihre Version denen, die sie über das Netzwerk nutzen, ihren Quellcode anbieten. Bleiben die Kosten für den Server, auf dem es läuft.
Legen Sie eine compose.yaml mit dem Image freshrss/freshrss, den Volumes data und extensions und dem auf 127.0.0.1 veröffentlichten Port an und starten Sie docker compose up -d. Stellen Sie dann einen Reverse Proxy mit HTTPS davor, öffnen Sie Ihre Adresse und folgen Sie dem Einrichtungsassistenten.
Geben Sie mit dem Docker-Image in CRON_MIN die Minuten für die Durchläufe an, zum Beispiel 13,43: Das Projekt empfiehlt etwa zwei Durchläufe pro Stunde. Ohne CRON_MIN bleibt die eingebaute Aufgabe ausgeschaltet. Eine geplante Aufgabe auf dem Server, die app/actualize_script.php im Container ausführt, erledigt dieselbe Arbeit.
SQLite ist eingebaut und braucht keine Vorbereitung; das Docker-README beschreibt es als die einfachste, mit guter Leistung. Die Seite mit den Voraussetzungen empfiehlt PostgreSQL 10 oder neuer und akzeptiert MariaDB 10.6 und MySQL 8.0. Mit den Befehlen db-backup und db-restore lässt sich die Datenbank später wechseln.
Aktivieren Sie im Bereich Authentifizierung den API-Zugriff und legen Sie dann in Ihrem Profil ein API-Passwort fest. Geben Sie in einer kompatiblen App die Adresse api/greader.php Ihrer Instanz ein, wobei die Google-Reader-API laut README die beste ist, oder api/fever.php.
Standardmäßig nicht: Die Konfiguration beschränkt die Konten auf das des Administrators. Die anderen legen Sie unter Administration, Benutzerverwaltung an, oder Sie erhöhen die Zahl der Konten in der Systemkonfiguration, damit das Registrierungsformular erscheint.
Kopieren Sie die Volumes data und extensions bei gestopptem Dienst. Aktivieren Sie außerdem auto_sqlite_export und planen Sie cli/export-sqlite-auto.php, das die Datenbank jedes Nutzers jede Nacht nach SQLite exportiert. Mit PostgreSQL ergänzen Sie einen pg_dump. Testen Sie die Wiederherstellung regelmäßig.
Ein Managed VPS deckt den Server ab: System, Sicherheit, Überwachung und Backups. Unsere Teams betreuen auch Ihre Instanz proaktiv und empfehlen Ihnen die sinnvollen Korrekturen, die Sie umsetzen. Ein Eingriff in der Anwendung wird nach Stunden oder pauschal abgerechnet.
Simafri
Sprechen wir über Ihr Vorhaben
Sagen Sie uns in wenigen Worten, was Sie brauchen: Wir melden uns schnell bei Ihnen.
Vielen Dank! Ihre Anfrage wurde gesendet. Wir melden uns in Kürze bei Ihnen.
Sie schreiben lieber eine E-Mail? Schreiben Sie uns an support@simafri.com.