FreshRSS installeren op Ubuntu VPS: stap voor stap
Installeer FreshRSS op uw eigen Ubuntu 24.04 server met Apache, PHP 8.3 en MariaDB. Leer hoe u de virtual host configureert, cron jobs instelt en de mobiele API werkend krijgt.
Wat u bouwt
Een zelfgehoste RSS-lezer is een feedlezer die draait op een server die uw eigendom is, zodat niemand deze kan afsluiten of de inhoud kan wijzigen. Deze handleiding installeert FreshRSS op een Ubuntu 24.04 VPS: Apache aan de voorzijde, PHP daarachter, MariaDB voor opslag en één cron job die nieuwe artikelen ophaalt. RSS (really simple syndication) is het bestandsformaat dat een site publiceert zodat software de artikelen kan lezen. FreshRSS is de PHP-applicatie die deze bestanden verzamelt, de artikelen bewaart en u een webinterface biedt, plus een API (application programming interface) waar mobiele apps mee communiceren.
De installatie zelf is beperkt: pak een release uit, maak een database aan, schrijf één virtual host, voer de command line installer uit en maak vervolgens het account aan met cli/create-user.php. Het meeste werk hieronder betreft het gedeelte dat achteraf vaak fout gaat, namelijk de verversingstaak, gecodeerde slashes voor de mobiele API en bestandsrechten.
FreshRSS 1.30.4, gepubliceerd op 21 oktober 2026, is de huidige release per 29 oktober 2026 en vereist PHP 8.1 of nieuwer. Ubuntu 24.04 levert PHP 8.3, dus de distributiepakketten volstaan en u heeft geen externe PHP-repository nodig.
Beginnen met een werkende LAMP-stack
FreshRSS is een standaard PHP-applicatie en vereist daarom dezelfde basis als elke andere applicatie. Als u deze basis nog niet heeft opgezet, volg dan eerst de handleiding voor het opzetten van een LAMP-stack op Ubuntu 24.04 en keer daarna hier terug. De korte versie:
sudo apt update
sudo apt install -y apache2 mariadb-server php libapache2-mod-php
sudo systemctl enable --now apache2 mariadbsystemctl status apache2 hoort active (running) te rapporteren. Als Apache niet wil starten, is de gebruikelijke oorzaak dat een ander proces poort 80 al bezet houdt; sudo ss -ltnp | grep :80 geeft aan welk proces dit is.
De PHP-extensies die FreshRSS vereist
FreshRSS beschouwt libxml, cURL, JSON, PDO_MySQL, PCRE en ctype als verplicht. Daarnaast zijn mbstring, iconv, Zlib, ZipArchive en op 32-bit systemen ook GMP vereist. Op Ubuntu zijn deze beschikbaar als distributiepakketten:
sudo apt install -y php-curl php-mbstring php-xml php-zip php-mysql php-intl php-gmp
sudo systemctl restart apache2Controleer welke extensies PHP daadwerkelijk heeft geladen met php -m. Een ontbrekende extensie voorkomt niet dat het installatieprogramma start. Het proces stopt echter bij het vereistenscherm met een rode regel die de naam van de extensie vermeldt; dit is een onduidelijk moment om het probleem te ontdekken, dus controleer dit vooraf. Het herstarten van Apache is noodzakelijk omdat libapache2-mod-php PHP binnen het Apache-proces houdt, waardoor een zojuist geïnstalleerde extensie onzichtbaar blijft voor de webserver totdat deze opnieuw wordt opgestart.
De release downloaden
Installeer FreshRSS buiten de standaard web-root en verwijs Apache hiernaar. Door de applicatiemap gescheiden te houden van de document-root, is alleen de public-map bereikbaar via HTTP.
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/freshrssStel nu de rechten in, waar de documentatie van FreshRSS strikt over is: de gebruiker van de webserver is eigenaar van de boomstructuur, de groep kan elk bestand lezen en de groep kan schrijven naar ./data/.
sudo chown -R www-data:www-data /srv/freshrss
sudo chmod -R g+r /srv/freshrss
sudo chmod -R g+w /srv/freshrss/dataSla dit niet over, anders mislukt het installatieproces bij het schrijven van de configuratie. Dit gebeurt omdat PHP wordt uitgevoerd als www-data en www-data niet kan schrijven in een map waarvan root de eigenaar is.
De database aanmaken
FreshRSS ondersteunt SQLite, MariaDB, MySQL en PostgreSQL. SQLite vereist de php-sqlite3-extensie, maar vereist geen database-serverconfiguratie. Het slaat de gegevens van elke gebruiker op in een afzonderlijk data/users/_user_/db.sqlite-bestand. Het toevoegen van gebruikers zorgt er niet voor dat hun schrijfacties in één gedeeld SQLite-bestand terechtkomen; deze handleiding gebruikt MariaDB als onderdeel van de LAMP-stack.
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;"Gebruik utf8mb4 en niet utf8. Feeds bevatten emoji's en niet-Latijnse tekens, en de oude drie-byte utf8-codering kan geen tekens van vier bytes opslaan. Niet-ondersteunde tekens veroorzaken een foutmelding in de standaard strikte modus van MariaDB; afkapping hangt af van de SQL-modus en instructieopties zoals IGNORE.
De Apache virtual host
De publieke map is p/, niet de bovenkant van de mappenstructuur. Al het overige, inclusief het configuratiebestand met uw databasewachtwoord, bevindt zich boven de document root waar Apache het nooit zal serveren.
<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>Sla dit op als /etc/apache2/sites-available/freshrss.conf en schakel het in:
sudo a2enmod rewrite
sudo a2ensite freshrss
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2configtest zou Syntax OK moeten weergeven. AllowEncodedSlashes On lijkt optioneel, maar dat is het niet: de Google Reader API verstuurt feed-identifiers die %2F bevatten. Zonder deze instructie weigert Apache deze, waardoor mobiele apps niet synchroniseren terwijl de webinterface perfect blijft werken.
Voeg HTTPS toe voordat u inlogt
U staat op het punt een wachtwoord in te voeren op deze site, dus installeer eerst een certificaat. Wijs een A-record naar de server, volg daarna de Certbot-installatie voor Apache op Ubuntu en voer sudo certbot --apache -d rss.example.com uit. Certbot herschrijft de virtual host voor poort 443 en voegt de redirect toe. Controleer dit met curl -I https://rss.example.com/, wat een 200 of een redirect naar de inlogpagina zou moeten retourneren.
De installer uitvoeren vanaf de command line
FreshRSS beschikt over een installer via de browser, maar de command line-versie is herhaalbaar en legt precies vast welke keuzes u heeft gemaakt.
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'Voer beide commando's uit als www-data. Wanneer u deze als root uitvoert, worden configuratiebestanden aangemaakt waarvan root de eigenaar is; de webinterface kan hierdoor later geen instellingen opslaan. --environment production is eveneens van belang, omdat de ontwikkelingsinstelling PHP-meldingen direct op de pagina toont.
Laad https://rss.example.com/ en log in als admin.
Waarom feeds niet automatisch verversen
Niets haalt uw feeds op totdat u dit instelt. Het openen van FreshRSS plant het ophalen van feeds niet in; zonder scheduler gebruikt u de update-link in het navigatiemenu om artikelen handmatig op te halen. De oplossing is het script dat het project hiervoor meelevert, app/actualize_script.php, dat vanuit cron wordt uitgevoerd.
sudo crontab -u www-data -eVoeg één regel toe:
*/20 * * * * php /srv/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1Twintig minuten is een redelijk schema, maar het verversingsinterval van elke individuele feed blijft van kracht: de standaard is één uur, en individuele feeds ondersteunen intervallen tot vijftien minuten. Voer het eerst eenmaal handmatig uit:
sudo -u www-data php /srv/freshrss/app/actualize_script.phpEen gezonde output rapporteert de verversingsronde en eindigt zonder PHP-fout; feednamen verschijnen wanneer artikelen worden toegevoegd of bijgewerkt. Als er helemaal niets wordt geprint, controleer dan de PHP-foutuitvoer en de FreshRSS-logs; stilte alleen identificeert de cron-gebruiker niet als de oorzaak. Een permissiefout op data/ vereist een controle van het eigenaarschap en de schrijfrechten.
Uw eerste feeds toevoegen
Gebruik de plus-knop linksboven in de interface, plak een websiteadres en FreshRSS zoekt automatisch de feed-link voor u op. De meeste sites publiceren er nog steeds een, zelfs als ze er niet expliciet naar verwijzen; meestal op /feed, /rss of /atom.xml. Categorieën fungeren als mappen en het verplaatsen van een feed tussen deze mappen is een kwestie van slepen.
Als u overstapt vanaf een andere reader, exporteer daar dan een OPML-bestand en importeer dit via de pagina voor abonnementsbeheer. OPML (outline processor markup language) is het standaardformaat voor feedlijsten en elke volwaardige reader ondersteunt dit. Een grote import is traag bij de eerste verversing omdat elke feed eenmalig wordt opgehaald; geef de eerste cron-taak daarom de tijd voordat u de snelheid beoordeelt.
Lees het op uw telefoon
FreshRSS ondersteunt de Google Reader API, waar veel RSS-apps gebruik van maken. Twee voorwaarden moeten zijn vervuld. Bij de authenticatie-instellingen moet "Allow API access" zijn ingeschakeld; de --api-enabled-vlag hierboven heeft dit reeds ingesteld. In uw profiel moet het veld voor het API-wachtwoord een waarde bevatten. Dit wachtwoord staat bewust los van uw inlogwachtwoord, omdat een telefoon gemakkelijker verloren kan gaan.
Bezoek https://rss.example.com/api/ om de serverconfiguratie automatisch te laten controleren. Een werkende configuratie geeft PASS terug. Als de controle mislukt, controleer dan de AllowEncodedSlashes On-instelling van de virtual host en de gerapporteerde foutmelding. Voer in de app het serveradres in als https://rss.example.com/api/greader.php, gebruik uw FreshRSS-gebruikersnaam als gebruikersnaam en het API-wachtwoord als wachtwoord.
Het Docker-alternatief
Als u liever geen PHP en Apache handmatig onderhoudt, publiceert het project een officiële freshrss/freshrss-image. Met één compose-bestand beschikt u direct over de applicatie en de bijbehorende database. De afweging is de gebruikelijke: minder bewegende delen op de host, maar een extra laag om te debuggen bij problemen. Bovendien blijft een reverse proxy noodzakelijk voor TLS (transport layer security). Als dit beter bij uw werkwijze past, behandelt de basis van Docker Compose voor een VPS het bestandsformaat en wordt de cron-regel docker exec --user www-data freshrss php ./app/actualize_script.php.
Back-ups en upgrades
Twee zaken bepalen uw status: de database en /srv/freshrss/data/. Maak een dump van de eerste met sudo mysqldump freshrss > freshrss.sql, kopieer de tweede en bewaar beide op een andere locatie dan deze server. Uw abonnementslijst is ook een incidentele OPML-export waard, aangezien dat bestand uw feedlijst overzet naar andere readers die OPML ondersteunen. Het behoudt geen FreshRSS-specifieke instellingen zoals verversingsfrequentie, inloggegevens, user agent of XPath-regels voor web scraping; gebruik een SQLite-export om ook die te bewaren.
Upgraden houdt in dat u een nieuwere release uitpakt over dezelfde map en de commando's voor eigenaarschap opnieuw uitvoert. Volg het upgrade-pad van het project versie voor versie en verifieer FreshRSS na elke stap. FreshRSS past zijn eigen databasemigraties toe bij het laden van de volgende pagina. Maak eerst een back-up, want een mislukte migratie op een database die u niet kunt herstellen, leidt tot een onherstelbare situatie. Als u hebt geïnstalleerd vanaf een oudere tarball zoals 1.29.1, stap dan over naar 1.30.4: de 1.30.x-beveiligingsreleases bevatten sessie-ID-rotatie bij wijzigingen in authenticatie en limieten voor ZIP-imports, terwijl 1.30.4 ook de alternatieve Alpine Docker-images bijwerkt voor ernstige PHP-kwetsbaarheden. Een reader is een service met een laag risico en een goede eerste kandidaat als u werkt aan een lijst met wat de moeite waard is om zelf te hosten.
FAQ
Waarom worden mijn feeds alleen bijgewerkt wanneer ik FreshRSS open?
Het openen van de pagina plant het ophalen van feeds niet in; zonder scheduler moet u de update-link gebruiken om handmatig te verversen. Voeg de cron-regel toe die app/actualize_script.php aanroept als de www-data-gebruiker, voer het script daarna eenmaal handmatig uit en lees de uitvoer. Als er geen uitvoer is, controleer dan de foutmeldingen van PHP en de logs van FreshRSS, en verifieer vervolgens of de cron-gebruiker schrijfrechten heeft op data/.
Mijn mobiele app kan geen verbinding maken, maar de website werkt wel. Hoe komt dit?
De Google Reader API plaatst gecodeerde slashes (%2F) in verzoekpaden, en Apache weigert deze standaard. Voeg AllowEncodedSlashes On toe aan de virtual host en herlaad Apache. Bevestig de oplossing door https://rss.example.com/api/ te openen, waar de automatische configuratiecontrole PASS zou moeten rapporteren. Controleer ook of het API-wachtwoord is ingesteld in uw profiel, aangezien dit losstaat van uw inlogwachtwoord.
Moet ik SQLite of MariaDB gebruiken?
SQLite vereist de php-sqlite3-extensie, maar geen databaseserver of database-wachtwoord om te beheren. Elke gebruiker krijgt een apart SQLite-databasebestand, dus het toevoegen van een tweede gebruiker zorgt niet voor conflicten op één gedeeld bestand en vereist geen MariaDB. Gebruik MariaDB als u de databaseserver in uw LAMP-stack wilt gebruiken. Overstappen tussen beide is later mogelijk via de export- en importcommando's, dus dit is geen definitieve beslissing.
De installer faalt bij het schrijven van de configuratie. Wat is er mis?
PHP draait als www-data onder Apache, en die gebruiker kan niet schrijven in een map die eigendom is van root. Voer sudo chown -R www-data:www-data /srv/freshrss en sudo chmod -R g+w /srv/freshrss/data opnieuw uit en start de installer daarna opnieuw. Als u de command-line installer al als root heeft uitgevoerd, corrigeer dan het eigenaarschap van de bestanden die zijn aangemaakt onder data/ voordat u het opnieuw probeert.
Hoeveel servercapaciteit heeft een zelfgehoste RSS-lezer nodig?
Zeer weinig. FreshRSS is ontworpen om op bescheiden hardware te draaien, maar het resourcegebruik hangt af van uw feeds, de grootte van artikelen en de retentie-instellingen. De schijfruimte groeit met de retentie, dus stel een beleid in voor het opschonen van artikelen in de archiveringsinstellingen in plaats van alles voor altijd te bewaren.