Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Linux 16.06.2026 · 9 min Lesezeit

FreshRSS nativ auf Ubuntu installieren: Apache, PHP und SQLite ohne Docker

FreshRSS als schlanken RSS-Aggregator nativ auf Ubuntu mit Apache und PHP einrichten – ohne Docker, mit SQLite oder MariaDB und automatischen Feed-Updates per systemd-Timer oder Cron.

Moderne IT-Grafik zur Anleitung für die native Installation von FreshRSS auf Ubuntu mit Apache, PHP und SQLite, inklusive Terminal, Server, Browseransicht und RSS-Dashboard.

FreshRSS ist ein ressourcenschonender, selbst gehosteter RSS- und Atom-Aggregator, der auf minimaler Hardware läuft – sogar auf einem Raspberry Pi 1. Wer keinen Docker-Daemon auf dem Server betreiben möchte oder einfach einen sauberen, klassischen LAMP-Stack bevorzugt, kann FreshRSS vollständig nativ einrichten. Diese Anleitung zeigt dir, wie du FreshRSS 1.29.1 auf Ubuntu 22.04 LTS oder 24.04 LTS mit Apache 2.4, PHP 8.1+ und wahlweise SQLite oder MariaDB installierst, die Dateiberechtigungen korrekt setzt und automatische Feed-Aktualisierungen per Cron-Job oder systemd-Timer einrichtest.

Voraussetzungen

  1. Ubuntu Server 22.04 LTS oder 24.04 LTS (frische Installation empfohlen)
  2. Root- oder sudo-Zugang zum Server
  3. Internetzugang des Servers (für git clone und spätere Feed-Abrufe)
  4. Mindestens 512 MB RAM; ca. 100 MB Festplatz für die Installation selbst
  5. Optional: eigene Domain oder Subdomain für den VirtualHost (z. B. rss.example.net)
  6. Optional: MariaDB-Kenntnisse, wenn du die SQLite-Alternative nutzen möchtest

Schritt 1: System aktualisieren und Apache installieren

Beginne mit einem vollständigen Systemupdate, bevor du neue Pakete hinzufügst. Anschließend installierst du Apache und aktivierst die für FreshRSS benötigten Module.

sudo apt update && sudo apt upgrade -y
sudo apt install -y apache2
sudo a2enmod headers expires rewrite ssl

Verifizieren: Mit sudo systemctl status apache2 sollte der Dienst als active (running) erscheinen. Im Browser unter http://SERVERIP siehst du die Apache-Standardseite.

Schritt 2: PHP 8.1 und benötigte Extensions installieren

FreshRSS setzt PHP 8.1 oder höher voraus – PHP 7.x wird nicht mehr unterstützt. 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-php

Die folgende Tabelle zeigt alle relevanten Extensions im Überblick:

ExtensionUbuntu-PaketStatusZweck
curlphp-curlPflichtFeed-Abruf via HTTP/HTTPS
dom / xmlphp-xmlPflichtRSS/Atom-Parsing
json, session, ctype(PHP-Core)PflichtDatenhaltung, Authentifizierung
mbstringphp-mbstringEmpfohlenUnicode-Verarbeitung
intlphp-intlEmpfohlenInternationalisierung, IDN-Domains
gmpphp-gmpEmpfohlen32-Bit API-Kompatibilität
zipphp-zipEmpfohlenFeed-Import und -Export
pdo_sqlitephp-sqlite3EmpfohlenSQLite-Datenbank (Standardwahl)
pdo_mysqlphp-mysqlOptionalMariaDB/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/. Willst du FreshRSS mit mehreren Accounts oder sehr vielen Feeds (1.000+) betreiben, empfiehlt sich MariaDB 10.6+ für bessere Performance.

DatenbankMindestversionPHP-ExtensionEinsatz
SQLitebuilt-inphp-sqlite3Einzelnutzer, Heimserver – kein DB-Server nötig
MariaDB10.6+php-mysqlMehrnutzer, große Instanzen
MySQL8.0+php-mysqlAlternative zu MariaDB (ältere Versionen nicht unterstützt)
PostgreSQL10+pdo_pgsqlGroße Instanzen mit Volltextsuche (GIN-Index)

Falls du MariaDB nutzen möchtest, installiere und sichere sie zunächst:

sudo apt install -y php-mysql mariadb-server mariadb-client
sudo systemctl enable --now mariadb
sudo mysql_secure_installation

Anschließend legst du Datenbank und Nutzer an:

sudo mysql -u root -p
# 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';
FLUSH PRIVILEGES;
EXIT;

Wichtig: Verwende immer utf8mb4, nicht utf8, damit Emojis und bestimmte Unicode-Zeichen in Feed-Titeln nicht abgeschnitten werden.

Schritt 4: FreshRSS klonen und Berechtigungen setzen

FreshRSS wird direkt aus dem GitHub-Repository nach /usr/share/FreshRSS geklont. Das ist der offizielle Installationspfad und vereinfacht spätere Updates per git pull erheblich.

sudo apt install -y git
cd /usr/share/
sudo git clone https://github.com/FreshRSS/FreshRSS.git
cd /usr/share/FreshRSS

Nach dem Klonen befindest du dich standardmäßig auf dem edge-Branch (Entwicklungsstand). Für den stabilen Betrieb wechselst du zum latest-Branch, der die aktuelle Stable-Version (1.29.1, Mai 2025) widerspiegelt:

sudo git checkout latest

Anschließend setzt du die Datei- und Verzeichnisrechte mit dem mitgelieferten Skript. Es stellt sicher, dass www-data Schreibrechte auf ./data/ und die Logs hat – ohne diesen Schritt kann FreshRSS weder den Installationswizard abschließen noch Feeds schreiben:

sudo bash cli/access-permissions.sh

Verifizieren: ls -la /usr/share/FreshRSS/data/ – der Eigentümer der Verzeichnisse sollte www-data sein.

Schritt 5: Apache VirtualHost konfigurieren

FreshRSS hat eine klare Vorgabe: Der DocumentRoot muss auf /usr/share/FreshRSS/p/ zeigen – ausschließlich dieses p/-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.

Erstelle 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>

Die Direktive AllowEncodedSlashes On ist kein optionales Detail: Sie muss im VirtualHost-Block stehen (nicht in der Directory-Direktive) und ist zwingend erforderlich, damit Mobile-Apps wie FeedMe oder EasyRSS und die Google Reader API (/api/greader.php) korrekt funktionieren.

Aktiviere die Site und lade Apache neu:

sudo a2ensite freshrss.conf
sudo systemctl reload apache2

Alternativ zum eigenen VirtualHost kannst du FreshRSS per Symlink unter einer Sub-URL betreiben – etwa wenn du keinen eigenen DNS-Eintrag einrichten möchtest:

sudo ln -s /usr/share/FreshRSS/p /var/www/html/freshrss

FreshRSS 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 erreichst du die FreshRSS-Installationsseite unter http://rss.example.net.

Schritt 6: Webbasierten Installationswizard durchlaufen

Öffne im Browser http://rss.example.net. Der FreshRSS-Installationswizard prüft automatisch alle PHP-Extensions und zeigt fehlende rot markiert an. Sollte eine Extension fehlen, installiere sie per sudo apt install php-PAKETNAME und starte Apache neu.

Im Wizard legst du fest:

  1. Datenbanktyp: SQLite (empfohlen für Einzelnutzer) oder MariaDB/MySQL (für Mehrnutzer)
  2. Admin-Account: Benutzername und sicheres Passwort
  3. Sprache und Zeitzone: Deutsch / Europe/Berlin

Bei SQLite-Wahl ist kein weiterer Konfigurationsaufwand nötig – die Datenbankdatei wird automatisch unter ./data/ angelegt. Bei MariaDB trägst du Datenbankname, Benutzer und Passwort aus Schritt 3 ein.

Verifizieren: Nach Abschluss des Wizards landest du auf dem FreshRSS-Dashboard. Du kannst direkt erste Feeds hinzufügen.

Schritt 7: Automatische Feed-Aktualisierung einrichten

FreshRSS aktualisiert Feeds nicht eigenständig im Hintergrund – du musst das Update-Skript /usr/share/FreshRSS/app/actualize_script.php regelmäßig aufrufen. Das minimale sinnvolle Intervall beträgt 20 Minuten pro Feed; häufigere Ausführungen erzeugen Last ohne Mehrwert.

Option A: Cron-Job

Öffne /etc/crontab und füge folgende Zeile hinzu – der Job muss als www-data laufen, 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>&1

Ein stündlicher Durchlauf ist für die meisten Setups ausreichend. Wenn du sehr zeitkritische Feeds verfolgst, kannst du das Intervall auf 20 Minuten verkürzen (*/20 * * * *).

Option B: systemd-Timer (empfohlen auf modernen Ubuntu-Systemen)

Der systemd-Timer ist die sauberere Alternative, weil er ins Logging-System integriert ist und gezielt überwacht werden kann. Erstelle zunächst eine Service-Unit:

sudo nano /etc/systemd/system/freshrss.service
[Service]
User=www-data
Type=simple
ExecStart=/usr/bin/php /usr/share/FreshRSS/app/actualize_script.php

Dann 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.target

Timer aktivieren und starten:

sudo systemctl daemon-reload
sudo systemctl enable --now freshrss.timer

Verifizieren: systemctl list-timers freshrss.timer zeigt den Timer mit dem nächsten Ausführungszeitpunkt. Mit journalctl -u freshrss.service kannst du die Ausgabe der letzten Läufe einsehen. Mehr zur systemd-Dienstverwaltung findest du in unserer Anleitung systemd-Service selbst erstellen und verwalten.

Schritt 8: HTTPS mit Let's Encrypt absichern (empfohlen)

Für den produktiven Einsatz – insbesondere wenn du Mobile-Apps oder die API nutzt – solltest du HTTPS einrichten. Certbot konfiguriert den Apache-VirtualHost weitgehend automatisch:

sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d rss.example.net

Certbot legt einen zweiten VirtualHost für Port 443 an und richtet die automatische Zertifikatserneuerung ein. Die Direktive AllowEncodedSlashes On bleibt dabei erhalten – prüfe dies nach dem Certbot-Lauf kurz in der generierten Konfiguration. Mehr dazu in unserer Anleitung Let's Encrypt mit certbot – TLS-Zertifikate ohne Reverse-Proxy.

Schritt 9: FreshRSS aktualisieren

Da FreshRSS über Git installiert wurde, genügt ein git pull für Updates. Führe danach immer das Berechtigungs-Skript erneut aus, weil git pull Dateirechte zurücksetzen kann:

cd /usr/share/FreshRSS
sudo git pull
sudo bash cli/access-permissions.sh
sudo systemctl reload apache2

Der Web-Installer erkennt Datenbankmigrationen nach dem Update automatisch und führt sie beim nächsten Browser-Aufruf durch.

Troubleshooting / Typische Fehler

  1. AllowEncodedSlashes On vergessen: Mobile-Apps und die Google Reader API liefern Fehler 400 oder 404. Diese Direktive muss im VirtualHost-Block stehen – nicht in der Directory-Direktive.
  2. Falscher DocumentRoot: Zeigt der DocumentRoot auf /usr/share/FreshRSS/ statt auf /usr/share/FreshRSS/p/, sind die SQLite-Datenbankdatei und Konfigurationsdateien öffentlich erreichbar – ein ernstes Sicherheitsproblem.
  3. cli/access-permissions.sh nicht ausgeführt: FreshRSS kann keine Feeds schreiben, keine Logs anlegen und der Installationswizard schlägt mit Berechtigungsfehlern fehl.
  4. Cron-Job als root statt als www-data: Root erzeugt Dateien, auf die www-data keinen Schreibzugriff hat. Folgeläufe scheitern mit Fehlern.
  5. Fehlende PHP-Extensions: Der Installationswizard zeigt sie rot an. Mit php -m | grep EXTENSIONSNAME prüfen, dann sudo apt install php-PAKETNAME && sudo systemctl restart apache2.
  6. mod_rewrite nicht aktiviert: Das URL-Routing schlägt fehl und der Installationswizard ist nicht erreichbar. Abhilfe: sudo a2enmod rewrite && sudo systemctl reload apache2.
  7. Falscher Git-Branch: Der edge-Branch ist Entwicklungsstand. Nach dem Klonen sudo git checkout latest ausführen.
  8. Datenbankcharset utf8 statt utf8mb4: Emojis und bestimmte Unicode-Zeichen in Feed-Titeln werden bei MariaDB/MySQL abgeschnitten.
  9. Nach git pull Berechtigungen nicht neu gesetzt: Updates können Dateirechte zurücksetzen. Immer danach sudo bash cli/access-permissions.sh ausführen.

Häufige Fragen

Kann ich 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 soll ich wählen – SQLite oder MariaDB?

Für einen Einzelnutzer oder Heimserver ist SQLite die klügere Wahl: kein zusätzlicher Datenbankdienst, weniger Administrationsaufwand. Planst du mehrere Nutzer oder hast du sehr viele Feeds (1.000+), liefert MariaDB spürbar bessere Performance. Mehr zur MariaDB-Administration in unserer Anleitung MariaDB / MySQL installieren und absichern.

Kann ich Mobile-Apps wie FeedMe oder EasyRSS verbinden?

Ja. FreshRSS unterstützt die Google Reader API unter /api/greader.php. Diese muss in den FreshRSS-Einstellungen unter „Authentifizierung" explizit aktiviert werden. Der VirtualHost braucht zwingend 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.

Kann ich FreshRSS auch mit anonymem Lesezugang betreiben?

Ja, der anonyme Zugriff ist standardmäßig deaktiviert und muss in den FreshRSS-Einstellungen unter „Authentifizierung" explizit aktiviert werden. Gleiches gilt für die API.

Fazit

FreshRSS nativ auf Ubuntu zu installieren ist eine sehr solide Entscheidung, wenn du Docker vermeiden möchtest oder schlicht einen klassischen LAMP-Stack bevorzugst. Die Installation ist in etwa 25 Minuten erledigt, der Ressourcenverbrauch ist minimal und Updates laufen unkompliziert per git pull. Beachte die drei wichtigsten Punkte konsequent: AllowEncodedSlashes On im VirtualHost, DocumentRoot auf ./p/ und Cron-Job als www-data statt root. Mit einem systemd-Timer und Let's Encrypt-Zertifikat hast du einen produktionsreifen RSS-Aggregator, der vollständig unter deiner Kontrolle liegt.

Weiterführende Anleitungen und Quellen

  1. WordPress nativ auf Ubuntu installieren (LAMP ohne Docker)
  2. Forgejo nativ auf Ubuntu installieren (Binary + systemd ohne Docker)
  3. Let's Encrypt mit certbot – TLS-Zertifikate ohne Reverse-Proxy
  4. systemd-Service selbst erstellen und verwalten
  5. MariaDB / MySQL installieren und absichern