FreshRSS nativ auf Ubuntu installieren: Apache, PHP und SQLite ohne Docker
FreshRSS nativ auf Ubuntu mit Apache und PHP installieren, ohne Docker: SQLite oder MariaDB, Dateirechte, HTTPS per certbot und automatische Feed-Aktualisierung per systemd-Timer oder Cron.
Geprüft am 30.09.2026
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

FreshRSS ist ein selbst gehosteter RSS- und Atom-Aggregator mit geringem Ressourcenbedarf; laut Projekt läuft er sogar auf einem Raspberry Pi 1. Ohne Docker richten Sie FreshRSS klassisch mit Apache und PHP ein. Diese Anleitung zeigt, wie Sie FreshRSS 1.30 auf Ubuntu 22.04 LTS oder 24.04 LTS mit Apache 2.4, PHP 8.1+ und wahlweise SQLite oder MariaDB installieren, die Dateirechte setzen und Feeds per Cron-Job oder systemd-Timer automatisch aktualisieren.
Voraussetzungen
- Ubuntu Server 22.04 LTS oder 24.04 LTS (frische Installation empfohlen)
- Root- oder
sudo-Zugang zum Server - Internetzugang des Servers (für
git cloneund spätere Feed-Abrufe) - Mindestens 512 MB RAM und etwa 100 MB Speicherplatz für die Installation; zusätzliche Hardware brauchen Sie nicht
- Optional: eigene Domain oder Subdomain für den VirtualHost (z. B.
rss.example.net) - Optional: MariaDB-Grundkenntnisse, wenn Sie statt SQLite MariaDB nutzen möchten
Schritt 1: System aktualisieren und Apache installieren
Aktualisieren Sie zuerst das System. Installieren Sie anschließend Apache und aktivieren Sie die für FreshRSS benötigten Module.
sudo apt update && sudo apt upgrade -y
sudo apt install -y apache2
sudo a2enmod headers expires rewrite sslVerifizieren: Mit sudo systemctl status apache2 sollte der Dienst als active (running) erscheinen. Im Browser zeigt http://SERVERIP die Apache-Standardseite.
Schritt 2: PHP 8.1 und benötigte Extensions installieren
FreshRSS setzt PHP 8.1 oder höher voraus. Ubuntu 22.04 liefert PHP 8.1, Ubuntu 24.04 PHP 8.3. Neben den Pflicht-Extensions (curl, xml, json, session, ctype) sind weitere Pakete für Internationalisierung, Feed-Import und die SQLite-Datenbank empfohlen.
sudo apt install -y php php-curl php-gmp php-intl php-mbstring \
php-sqlite3 php-xml php-zip libapache2-mod-phpDie folgende Tabelle zeigt alle relevanten Extensions im Überblick:
| Extension | Ubuntu-Paket | Status | Zweck |
|---|---|---|---|
| curl | php-curl | Pflicht | Feed-Abruf via HTTP/HTTPS |
| dom / xml | php-xml | Pflicht | RSS/Atom-Parsing |
| json, session, ctype | (PHP-Core) | Pflicht | Datenhaltung, Authentifizierung |
| mbstring | php-mbstring | Empfohlen | Unicode-Verarbeitung |
| intl | php-intl | Empfohlen | Internationalisierung, IDN-Domains |
| gmp | php-gmp | Empfohlen | 32-Bit API-Kompatibilität |
| zip | php-zip | Empfohlen | Feed-Import und -Export |
| pdo_sqlite | php-sqlite3 | Empfohlen | SQLite-Datenbank (Standardwahl) |
| pdo_mysql | php-mysql | Optional | MariaDB/MySQL-Datenbank |
Verifizieren: php -m | grep -E "curl|xml|mbstring|sqlite3" listet die geladenen Extensions. Fehlt eine, lässt sie sich mit sudo apt install php-PAKETNAME && sudo systemctl restart apache2 nachrüsten.
Schritt 3: MariaDB einrichten (optional – nur bei Mehrnutzer-Betrieb)
Für einen einzelnen Nutzer oder einen Heimserver ist SQLite die einfachste Wahl: kein zusätzlicher Datenbankdienst, die Datenbankdatei liegt direkt unter ./data/. Für mehrere Accounts oder sehr viele Feeds (1.000+) empfiehlt sich MariaDB 10.6+.
| Datenbank | Mindestversion | PHP-Extension | Einsatz |
|---|---|---|---|
| SQLite | built-in | php-sqlite3 | Einzelnutzer, Heimserver; kein DB-Server nötig |
| MariaDB | 10.6+ | php-mysql | Mehrnutzer, große Instanzen |
| MySQL | 8.0+ | php-mysql | Alternative zu MariaDB (ältere Versionen nicht unterstützt) |
| PostgreSQL | 10+ | php-pgsql | Große Instanzen mit Volltextsuche (GIN-Index) |
Nutzen Sie MariaDB, installieren und sichern Sie sie zunächst:
sudo apt install -y php-mysql mariadb-server mariadb-client
sudo systemctl enable --now mariadb
sudo mysql_secure_installationLegen Sie anschließend Datenbank und Nutzer an:
sudo mariadb
# Im MariaDB-Prompt:
CREATE USER 'freshrss'@'localhost' IDENTIFIED BY 'SICHERES_PASSWORT';
CREATE DATABASE `freshrss_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON `freshrss_db`.* TO 'freshrss'@'localhost';
EXIT;Verwenden Sie utf8mb4, nicht utf8, damit Emojis und bestimmte Unicode-Zeichen in Feed-Titeln nicht abgeschnitten werden.
Verifizieren: mariadb -u freshrss -p -e 'SHOW DATABASES;' listet nach Eingabe des Passworts freshrss_db.
Schritt 4: FreshRSS klonen und Berechtigungen setzen
FreshRSS wird direkt aus dem GitHub-Repository nach /usr/share/FreshRSS geklont. Diesen Pfad nutzt auch die Projektdokumentation; Updates erfolgen später per git pull.
sudo apt install -y git
cd /usr/share/
sudo git clone https://github.com/FreshRSS/FreshRSS.git
cd /usr/share/FreshRSSNach dem Klonen ist der edge-Branch (Entwicklungsstand) aktiv. Wechseln Sie für den stabilen Betrieb auf den Branch latest, der die aktuelle stabile Version enthält (Stand September 2026: 1.30.0):
sudo git checkout latestSetzen Sie anschließend die Datei- und Verzeichnisrechte mit dem mitgelieferten Skript. Es gibt www-data Schreibrechte auf ./data/ und die Logs; ohne diesen Schritt kann FreshRSS weder den Installationswizard abschließen noch Feeds schreiben:
sudo bash cli/access-permissions.shVerifizieren: git -C /usr/share/FreshRSS branch --show-current gibt latest aus, und ls -la /usr/share/FreshRSS/data/ zeigt www-data als Gruppe mit Schreibrecht.
Schritt 5: Apache VirtualHost konfigurieren
Der DocumentRoot muss auf /usr/share/FreshRSS/p/ zeigen; nur dieses Unterverzeichnis ist für den öffentlichen Zugriff gedacht. Das übergeordnete Verzeichnis und besonders ./data/ dürfen niemals direkt erreichbar sein, da dort persönliche Daten, Passwort-Hashes und die SQLite-Datenbankdatei liegen.
Erstellen Sie die VirtualHost-Konfiguration:
sudo nano /etc/apache2/sites-available/freshrss.conf
<VirtualHost *:80>
ServerName rss.example.net
DocumentRoot /usr/share/FreshRSS/p/
<Directory /usr/share/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>AllowEncodedSlashes On gehört in den VirtualHost-Block, nicht in den Directory-Block. Das Projekt empfiehlt die Direktive für die Kompatibilität mit Mobile-Apps über die Google Reader API (/api/greader.php).
Aktivieren Sie die Site und laden Sie Apache neu:
sudo a2ensite freshrss.conf
sudo systemctl reload apache2Alternativ betreiben Sie FreshRSS per Symlink unter einer Sub-URL, etwa ohne eigenen DNS-Eintrag:
sudo ln -s /usr/share/FreshRSS/p /var/www/html/freshrssFreshRSS ist dann unter http://SERVERIP/freshrss erreichbar. Für volle API-Kompatibilität empfiehlt sich jedoch ein eigener VirtualHost.
Verifizieren: sudo apache2ctl configtest gibt „Syntax OK“ aus. Im Browser erscheint unter http://rss.example.net die FreshRSS-Installationsseite.
Schritt 6: Webbasierten Installationswizard durchlaufen
Ist der Server aus dem Internet erreichbar, richten Sie zuerst HTTPS ein (Schritt 8), damit das Admin-Passwort nicht unverschlüsselt übertragen wird. Öffnen Sie dann die Adresse im Browser. Der Installationsassistent prüft die PHP-Extensions und markiert fehlende rot; installieren Sie diese per sudo apt install php-PAKETNAME und starten Sie Apache neu.
Im Assistenten legen Sie fest:
- Datenbanktyp: SQLite (empfohlen für Einzelnutzer) oder MariaDB/MySQL (für Mehrnutzer)
- Admin-Account: Benutzername und sicheres Passwort
- Sprache und Zeitzone: Deutsch / Europe/Berlin
Bei SQLite legt FreshRSS die Datenbankdatei automatisch unter ./data/ an. Bei MariaDB tragen Sie Datenbankname, Benutzer und Passwort aus Schritt 3 ein.
Verifizieren: Nach Abschluss des Assistenten erscheint die FreshRSS-Oberfläche, und Sie können erste Feeds hinzufügen.
Schritt 7: Automatische Feed-Aktualisierung einrichten
FreshRSS aktualisiert Feeds nicht selbst im Hintergrund; rufen Sie das Skript /usr/share/FreshRSS/app/actualize_script.php regelmäßig auf. Das Skript aktualisiert einen Feed höchstens alle 20 Minuten, häufigere Aufrufe bringen daher nichts.
Option A: Cron-Job
Öffnen Sie /etc/crontab und fügen Sie folgende Zeile hinzu. Der Job läuft als www-data, nicht als root:
sudo nano /etc/crontab
# FreshRSS: Feed-Aktualisierung jede Stunde um :10
10 * * * * www-data php -f /usr/share/FreshRSS/app/actualize_script.php > /tmp/FreshRSS.log 2>&1Ein stündlicher Durchlauf ist für die meisten Setups ausreichend. Für zeitkritische Feeds verkürzen Sie das Intervall auf 20 Minuten (*/20 * * * *). Nutzen Sie nur eine der beiden Optionen.
Option B: systemd-Timer (empfohlen auf modernen Ubuntu-Systemen)
Der systemd-Timer schreibt die Ausgabe ins Journal und lässt sich gezielt überwachen. Erstellen Sie zunächst eine Service-Unit:
sudo nano /etc/systemd/system/freshrss.service
[Unit]
Description=FreshRSS Feed-Aktualisierung
[Service]
User=www-data
Type=oneshot
ExecStart=/usr/bin/php /usr/share/FreshRSS/app/actualize_script.phpDann die zugehörige Timer-Unit:
sudo nano /etc/systemd/system/freshrss.timer
[Unit]
Description=FreshRSS Feed-Aktualisierung alle 20 Minuten
[Timer]
OnBootSec=30s
OnCalendar=*:0/20
[Install]
WantedBy=timers.targetAktivieren und starten Sie den Timer:
sudo systemctl daemon-reload
sudo systemctl enable --now freshrss.timerVerifizieren: systemctl list-timers freshrss.timer zeigt den Timer mit dem nächsten Ausführungszeitpunkt. journalctl -u freshrss.service zeigt die Ausgabe der letzten Läufe. Mehr zur systemd-Dienstverwaltung finden Sie in unserer Anleitung systemd-Service selbst erstellen und verwalten.
Schritt 8: HTTPS mit Let's Encrypt absichern (empfohlen)
Richten Sie für den produktiven Einsatz HTTPS ein, besonders bei Nutzung der API über Mobile-Apps. Voraussetzung: Die Domain zeigt per DNS auf den Server, Port 80 und 443 sind erreichbar. Certbot passt den Apache-VirtualHost automatisch an:
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d rss.example.netCertbot legt einen zweiten VirtualHost für Port 443 an und richtet die automatische Zertifikatserneuerung ein. Certbot kopiert AllowEncodedSlashes On in die neue Datei freshrss-le-ssl.conf; prüfen Sie das dort. Mehr dazu in unserer Anleitung Let's Encrypt mit certbot: TLS-Zertifikate ohne Reverse-Proxy.
Verifizieren: grep AllowEncodedSlashes /etc/apache2/sites-enabled/freshrss-le-ssl.conf liefert eine Zeile, sudo certbot renew --dry-run endet ohne Fehler, und https://rss.example.net lädt ohne Zertifikatswarnung.
Schritt 9: FreshRSS aktualisieren
Da FreshRSS über Git installiert wurde, genügt ein git pull für Updates. Führen Sie danach das Berechtigungs-Skript erneut aus, weil neue Dateien sonst falsche Rechte haben können:
cd /usr/share/FreshRSS
sudo git pull
sudo bash cli/access-permissions.sh
sudo systemctl reload apache2Nötige Datenbankanpassungen führt FreshRSS nach dem Update automatisch aus. Sichern Sie vorher das Verzeichnis ./data/ und bei MariaDB die Datenbank.
Verifizieren: git -C /usr/share/FreshRSS log -1 --oneline zeigt den neuen Stand, und unter Administration → Über erscheint die neue Versionsnummer.
Troubleshooting / Typische Fehler
AllowEncodedSlashes Onvergessen: Mobile-Apps und die Google Reader API liefern Fehler 400 oder 404. Die Direktive gehört in denVirtualHost-Block, nicht in denDirectory-Block.- Falscher DocumentRoot: Zeigt der DocumentRoot auf
/usr/share/FreshRSS/statt auf/usr/share/FreshRSS/p/, sind SQLite-Datenbank und Konfigurationsdateien öffentlich erreichbar. Das ist ein ernstes Sicherheitsproblem. cli/access-permissions.shnicht ausgeführt: FreshRSS kann keine Feeds schreiben, keine Logs anlegen und der Installationswizard schlägt mit Berechtigungsfehlern fehl.- Cron-Job als root statt als www-data: Root erzeugt Dateien, auf die
www-datakeinen Schreibzugriff hat. Folgeläufe scheitern mit Fehlern. - Fehlende PHP-Extensions: Der Installationswizard zeigt sie rot an. Mit
php -m | grep EXTENSIONSNAMEprüfen, dannsudo apt install php-PAKETNAME && sudo systemctl restart apache2. mod_rewritenicht aktiviert: Das URL-Routing schlägt fehl und der Installationswizard ist nicht erreichbar. Abhilfe:sudo a2enmod rewrite && sudo systemctl reload apache2.- Falscher Git-Branch: Der
edge-Branch ist Entwicklungsstand. Nach dem Klonensudo git checkout latestausführen. - Datenbankcharset
utf8stattutf8mb4: Emojis und bestimmte Unicode-Zeichen in Feed-Titeln werden bei MariaDB/MySQL abgeschnitten. - Nach
git pullBerechtigungen nicht neu gesetzt: Updates können Dateirechte zurücksetzen. Immer danachsudo bash cli/access-permissions.shausführen.
Häufige Fragen
Können Sie FreshRSS unter einer Sub-URL statt einer eigenen Domain betreiben?
Ja. Mit sudo ln -s /usr/share/FreshRSS/p /var/www/html/freshrss ist FreshRSS unter http://SERVERIP/freshrss erreichbar. Für volle Kompatibilität mit der Google Reader API und Mobile-Apps empfiehlt sich trotzdem ein eigener VirtualHost.
Welche Datenbank sollten Sie wählen: SQLite oder MariaDB?
Für einen Einzelnutzer oder Heimserver genügt SQLite: kein zusätzlicher Datenbankdienst, weniger Administrationsaufwand. Bei mehreren Nutzern oder sehr vielen Feeds (1.000+) ist MariaDB die bessere Wahl. Mehr zur MariaDB-Administration in unserer Anleitung MariaDB / MySQL installieren und absichern.
Können Sie Mobile-Apps wie FeedMe oder EasyRSS verbinden?
Ja, über die Google Reader API unter /api/greader.php. Erlauben Sie den API-Zugriff unter Administration → Authentifizierung und setzen Sie in Ihrem Profil ein eigenes API-Passwort; die App meldet sich mit Benutzername und diesem Passwort an. Der VirtualHost braucht AllowEncodedSlashes On.
Was tun, wenn der Installationswizard eine fehlende PHP-Extension meldet?
Mit php -m | grep EXTENSIONSNAME prüfen, ob die Extension geladen ist. Das fehlende Paket per sudo apt install php-PAKETNAME installieren und sudo systemctl restart apache2 ausführen. Dann den Browser neu laden.
Wie läuft die Aktualisierung auf eine neue FreshRSS-Version?
Mit sudo git pull im Verzeichnis /usr/share/FreshRSS, gefolgt von sudo bash cli/access-permissions.sh und sudo systemctl reload apache2. Datenbankmigrationen erkennt der Web-Installer beim nächsten Seitenaufruf automatisch.
Können Sie FreshRSS auch mit anonymem Lesezugang betreiben?
Ja. Der anonyme Lesezugriff ist standardmäßig deaktiviert; Sie aktivieren ihn unter Administration → Authentifizierung.
Fazit
Die native Installation von FreshRSS auf Ubuntu dauert etwa 25 Minuten, Updates laufen per git pull. Entscheidend sind drei Punkte: AllowEncodedSlashes On im VirtualHost, DocumentRoot auf ./p/ und die Feed-Aktualisierung als www-data statt root. Mit systemd-Timer und Let's-Encrypt-Zertifikat ist die Instanz für den Dauerbetrieb eingerichtet.
Weiterführende Anleitungen und Quellen
- WordPress nativ auf Ubuntu installieren (LAMP ohne Docker)
- Forgejo nativ auf Ubuntu installieren (Binary + systemd ohne Docker)
- Let's Encrypt mit certbot: TLS-Zertifikate ohne Reverse-Proxy
- systemd-Service selbst erstellen und verwalten
- MariaDB / MySQL installieren und absichern
Offizielle Quellen: FreshRSS: Installation | FreshRSS: Feed-Aktualisierung | FreshRSS auf GitHub


