Héberger FreshRSS sur un VPS géré, c'est lire vos flux RSS et ceux de votre équipe depuis une machine à vous, que nos équipes tiennent à jour et supervisent jour et nuit. FreshRSS est un logiciel libre sous licence AGPL-3.0. Ce guide suit sa documentation officielle : l'installation avec Docker Compose, HTTPS, l'actualisation des flux, les comptes et la connexion, l'API des applications mobiles, la base de données, les sauvegardes et les mises à jour.
Par Simon Vasconcelos Lee
Publié le 11 novembre 2026Lecture : 13 minutes
data et extensions, derrière un mandataire inverse en HTTPS.CRON_MIN actualise les flux toute seule : le projet recommande environ deux passages par heure.data et, avec PostgreSQL ou MySQL, la base, puis mettez à jour avec docker compose pull.FreshRSS est un agrégateur de flux RSS auto-hébergé, écrit en PHP. Son README le décrit comme léger, simple à prendre en main, puissant et personnalisable, traduit dans plus de vingt langues. C'est une application multi-utilisateur, avec un mode de lecture anonyme et des étiquettes personnalisées.
FreshRSS se développe en communauté sur GitHub, et son site officiel est publié par la communauté FreshRSS. Les extensions vivent dans un dépôt à part, et la documentation couvre les utilisateurs, les administrateurs et les développeurs.
FreshRSS est publié sous GNU Affero General Public License, version 3 : son manifeste composer.json le déclare AGPL-3.0, et son README renvoie au texte de la licence. Ce texte affirme une permission illimitée de faire tourner le programme non modifié. Vous pouvez donc utiliser l'image publiée par le projet pour votre entreprise et votre équipe, sans licence à acheter.
L'article 13 ajoute une condition propre à l'AGPL : si vous modifiez le programme, votre version doit offrir à tous ceux qui l'utilisent à distance, par le réseau, le moyen d'obtenir gratuitement son code source. Une extension tierce ajoutée dans le volume extensions suit sa propre licence.
Le projet publie ses images officielles sur Docker Hub, sous freshrss/freshrss, et un fichier Compose d'exemple. Sur un serveur où Docker est installé, créez un dossier nommé freshrss et placez-y ce compose.yaml, tiré de ce fichier et du README Docker :
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 : FreshRSS s'atteint par le seul mandataire inverse, posé sur le même serveur. Le fichier d'exemple du projet publie le port 8080 pour un usage local ; l'adresse 127.0.0.1 le réserve ici au mandataire.data garde la configuration, les comptes et, avec SQLite, les bases de chaque utilisateur. Le README rappelle qu'il contient toutes les données personnelles. Docker Compose le nomme d'après le dossier : freshrss_data.extensions accueille les extensions tierces, si vous en ajoutez.TZ prend le fuseau horaire du serveur, au format de PHP ; il vaut UTC par défaut.TRUSTED_PROXY reprend la valeur du fichier d'exemple : les plages privées d'où arrivent les requêtes du mandataire. Elle décide de l'adresse inscrite aux journaux, celle du visiteur ou celle du mandataire.cli/health.php à intervalle régulier : Docker sait ainsi si l'instance répond.L'étiquette latest, celle par défaut, suit la dernière version publiée ; edge suit la version continue ; une étiquette comme 1.30.4 fixe une version, et le suffixe -alpine donne la même chose sur une base Alpine plutôt que Debian. La section des mises à jour revient sur ce choix.
Une fois le mandataire inverse en place, ouvrez votre adresse HTTPS : l'assistant d'installation demande la langue, vérifie le serveur, propose la base de données, puis crée le compte administrateur, avec son mot de passe et la méthode de connexion. SQLite convient sans rien préparer. L'installation se fait aussi en ligne de commande, avec cli/do-install.php et cli/create-user.php, lancés par docker exec --user www-data freshrss.
Côté ressources, le README demande un serveur léger, sous Linux ou Windows, et précise que FreshRSS tourne même sur un Raspberry Pi 1, en moins d'une seconde par réponse, avec 150 flux et 22 000 articles. La taille dépend du nombre d'utilisateurs, de flux et d'articles gardés. Sur un VPS géré, décrivez-nous votre usage et nous vous recommandons la taille qui convient.
Pour la production, le README Docker conseille un mandataire inverse sur le serveur hôte, qui fournit HTTPS. Choisissez d'abord un nom de domaine ou un sous-domaine, par exemple rss.example.com, qui pointe vers le serveur avec des enregistrements A et AAAA. Le projet recommande Traefik et publie un fichier Compose complet pour lui, avec les certificats Let's Encrypt et la redirection de HTTP vers HTTPS ; il donne aussi des exemples pour Apache, Nginx et Caddy.
Caddy obtient le certificat et active HTTPS de lui-même. Ce bloc reprend l'exemple de la documentation pour un sous-domaine, pointé ici vers le port publié en local :
rss.example.com {
reverse_proxy 127.0.0.1:8080
}
Ce bloc reprend l'exemple Nginx du README Docker pour la racine d'un domaine, réduit au port 80 pour laisser Certbot installer HTTPS. Les deux dernières lignes transmettent l'en-tête Authorization, dont l'API Google Reader a besoin :
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 installe ensuite le certificat et se charge de le renouveler :
sudo certbot --nginx
FreshRSS garde son adresse publique dans base_url, au fichier data/config.php. L'API et WebSub s'en servent : vérifiez qu'elle porte bien votre adresse en https. Le README Docker indique où trouver ce fichier dans le volume :
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 récupère les nouveaux articles par son script app/actualize_script.php. L'image Docker embarque une tâche planifiée qui le lance aux minutes données par CRON_MIN. Sans cette variable, ou avec une valeur vide, la tâche reste éteinte et les flux ne s'actualisent plus d'eux-mêmes.
13,43 ; */20 fonctionne aussi.base_url, et l'assistant d'installation l'active quand le serveur en a une.Autre méthode documentée : une tâche planifiée sur le serveur hôte, qui appelle le script dans le conteneur. Retirez alors CRON_MIN du compose.yaml, pour ne garder qu'une seule méthode :
7,37 * * * * root docker exec --user www-data freshrss php ./app/actualize_script.php > /tmp/FreshRSS.log 2>&1
Depuis la version 1.30.0, FreshRSS refuse par défaut les adresses du réseau local, comme 127.0.0.1, pour se protéger des requêtes forgées côté serveur. Un service voisin qui produit des flux, comme RSS-Bridge, s'autorise par la variable INTERNAL_HOST_ALLOWLIST, sous la forme rss-bridge:80, ou dans la configuration système. La valeur * retire tout contrôle, et la documentation la juge dangereuse.
À l'installation, FreshRSS propose la connexion par formulaire, qui demande JavaScript. C'est la méthode par défaut, et elle convient à la plupart des instances. La documentation en décrit d'autres :
| Méthode | Ce qu'elle fait | Où elle se règle |
|---|---|---|
| Formulaire | Un identifiant et un mot de passe propres à FreshRSS | L'assistant d'installation |
| Authentification HTTP | Le serveur web contrôle l'accès, et les nouveaux utilisateurs sont créés à leur première connexion | Un fichier p/i/.htaccess monté dans le conteneur, avec son .htpasswd |
| Authentification externe | Le mandataire transmet l'utilisateur connecté par l'en-tête Remote-User ou X-WebAuth-User | TRUSTED_PROXY, qui liste les mandataires de confiance |
| OpenID Connect | La connexion passe par votre fournisseur d'identité, par le module Apache mod_auth_openidc | OIDC_ENABLED et les variables OIDC_*, dans l'image Debian sur x86_64 |
La documentation prévient que FreshRSS fait confiance à toute adresse listée dans TRUSTED_PROXY : un mandataire mal protégé laisserait un attaquant définir l'en-tête et obtenir un accès administrateur. Ici, le port n'écoute que sur 127.0.0.1, ce qui le réserve au mandataire du serveur. Elle déconseille aussi toute instance sans authentification dès que le serveur s'atteint hors de votre réseau.
mailer et smtp dans data/config.php : la documentation indique que l'envoi par la fonction mail de PHP ne fonctionne pas encore dans les images Docker officielles.Pour une instance partagée entre plusieurs personnes, la documentation conseille d'ouvrir les comptes aux personnes de confiance et de garder l'instance derrière un mandataire ou un pare-feu qui bloque l'accès aux plages d'adresses internes.
FreshRSS se lit dans le navigateur, sur grand comme sur petit écran, et dans des applications pour Android, iOS, Linux, Windows et macOS. Elles passent par l'une de ses deux API : Google Reader, que le README juge la meilleure, et Fever, aux fonctions plus limitées, moins efficace et moins sûre.
https://rss.example.com/api/greader.php, ou https://rss.example.com/api/fever.php pour Fever, avec l'identifiant et ce mot de passe d'API.Pour vérifier, le lien affiché à côté du mot de passe d'API, dans le profil, ouvre une page de test : PASS au contrôle complet confirme que tout fonctionne. L'image Docker règle déjà Apache pour accepter les barres obliques encodées, dont certaines applications ont besoin ; avec Nginx devant, gardez la transmission de l'en-tête Authorization.
Le README tient un tableau des applications compatibles, avec leur plateforme, leur API et leurs fonctions : Capy Reader et Readrops sur Android, FeedFlow sur mobile comme sur ordinateur, RSS Guard et NewsFlash sur ordinateur, ReadKit et Reeder Classic sur iOS et macOS, parmi d'autres.
FreshRSS embarque SQLite, que le README Docker décrit comme la solution la plus simple, avec de bonnes performances. La page des prérequis recommande PostgreSQL 10 ou plus récent, et accepte aussi MariaDB 10.6 et MySQL 8.0 ou plus récents. Le choix se fait dans l'assistant d'installation.
| Base | Mise en place | Sauvegarde |
|---|---|---|
| SQLite | Aucune : un fichier par utilisateur, data/users/<utilisateur>/db.sqlite | Le volume data |
| PostgreSQL | Un service postgres dans le même compose.yaml | pg_dump, ou cli/db-backup.php |
| MySQL ou MariaDB | Votre serveur de base, et son nom d'hôte dans l'assistant | mysqldump, ou cli/db-backup.php |
Pour PostgreSQL, ajoutez ce service à compose.yaml, tiré du fichier docker-compose-db.yml du projet, et le volume db à la liste des volumes. Le mot de passe se place dans un fichier .env, à côté de 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='un-mot-de-passe-long-et-unique'
Dans l'assistant, choisissez PostgreSQL et indiquez freshrss-db comme hôte, avec l'utilisateur, le mot de passe et la base freshrss.
Ce choix se reprend plus tard. La documentation décrit le passage d'une base à l'autre, de MySQL à PostgreSQL par exemple, ou vers une version majeure plus récente de PostgreSQL : cli/db-backup.php copie la base de chaque utilisateur dans un fichier SQLite, puis cli/db-restore.php la recharge dans la nouvelle base.
Le README précise que FreshRSS est fourni sans aucune garantie : vos sauvegardes gardent vos abonnements, vos articles et vos réglages. Voici ce que la documentation demande de sauvegarder :
| Élément | Ce qu'il garde | À sauvegarder |
|---|---|---|
data/ | La configuration, les comptes, les journaux et, avec SQLite, les bases | Obligatoire ; cache/ peut être omis, FreshRSS le reconstruit |
extensions/ | Les extensions tierces | Recommandé, si vous en utilisez |
| La base externe | Avec PostgreSQL, MySQL ou MariaDB, les données des utilisateurs | Obligatoire, à part |
La documentation juge plus sûr d'arrêter le service pendant les opérations de maintenance. Les volumes Docker se copient avec un conteneur temporaire, la méthode que décrit la documentation de Docker :
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
Depuis la version 1.29.1, FreshRSS sait exporter lui-même la base de chaque utilisateur dans un fichier SQLite, quelle que soit la base utilisée, et ne garder que les plus récents. Activez cet export dans data/config.php :
'auto_sqlite_export' => [
'enabled' => true,
'retention' => 7,
],
Puis planifiez la commande sur le serveur, ici chaque nuit. Chaque passage écrit data/users/<utilisateur>/sqlite-backups/<date>.sqlite et supprime les fichiers au-delà des sept derniers :
20 2 * * * root docker exec --user www-data freshrss cli/export-sqlite-auto.php --quiet
Avec PostgreSQL, ajoutez un export par l'outil de la base, comme dans le README Docker. L'option -T retire le terminal, dont une tâche planifiée n'a pas l'usage :
docker compose exec -T freshrss-db pg_dump -U freshrss freshrss | gzip -9 > freshrss-postgres-$(date +%F).sql.gz
L'export OPML, depuis l'interface, sauvegarde la liste de vos flux, sans certains réglages propres à FreshRSS, comme les identifiants ou les règles d'extraction des pages. Pour une copie complète, gardez les exports SQLite : posés sur le disque du serveur, ils entrent aussi dans ses sauvegardes de nuit.
docker compose stop freshrss.docker run --rm --volumes-from freshrss -v "$PWD":/backup ubuntu tar -xzf /backup/freshrss-AAAA-MM-JJ.tgz -C /var/www/FreshRSS.cli/db-restore.php --delete-backup --force-overwrite.docker compose start freshrss, puis vérifiez que vos flux et vos articles sont là.Répétez cet exercice de temps en temps, sur une copie : c'est ainsi que vous vérifiez qu'une sauvegarde fonctionne.
Le README Docker donne deux commandes, depuis le dossier du compose.yaml. Les volumes restent en place :
docker compose pull
docker compose up -d
FreshRSS publie sur deux canaux. Les versions numérotées, étiquette latest, sortent quelques fois par an, sans calendrier fixe, et leurs correctifs ne sont pas reportés sur les versions plus anciennes. La version continue, étiquette edge, reçoit les nouveautés et les correctifs au fil de l'eau : depuis la version 1.30.0, le projet la recommande pour recevoir plus vite les correctifs de sécurité.
data/, des extensions et de la base avant chaque mise à jour.1.29.1 rendent ce chemin possible.Pour suivre les sorties, le projet publie le flux Atom de ses versions : abonnez-y votre propre instance FreshRSS.
L'auto-hébergement demande de tenir le serveur en plus de l'application. Sur un VPS géré, nos équipes prennent le serveur en main et suivent votre instance de manière proactive ; FreshRSS reste votre logiciel, avec ses réglages et ses données.
| Sujet | Nos équipes | Vous |
|---|---|---|
| Le serveur | Mises à jour du système et de la sécurité, interventions sur le serveur comprises | Le moment qui convient à votre activité |
| La supervision | Serveur suivi 24 h/24 et 7 j/7, avec intervention sans attendre votre appel | La lecture des journaux de votre instance |
| FreshRSS | Suivi proactif : erreurs, lenteurs et espace disque repérés, correction recommandée | Son installation, ses mises à jour et ses réglages, que vous appliquez, vous ou votre assistant IA |
| Les comptes et les flux | Le serveur qui les porte, surveillé et sauvegardé | Les utilisateurs, les abonnements, les extensions et les mots de passe d'API |
| Les sauvegardes | Chaque nuit, chiffrées et gardées hors de la machine ; restauration comprise | Les exports propres à FreshRSS, et la demande de restauration, quand vous en avez besoin |
| La migration | Votre serveur actuel migré, offert | Le moment de la bascule |
Si vous préférez que nos équipes interviennent dans l'application elle-même, cette prestation se facture à l'heure ou au forfait, avec un chiffrage communiqué avant l'intervention.
Avec un VPS géré Simafri, nos équipes tiennent à jour le serveur de votre instance FreshRSS, le surveillent jour et nuit et interviennent sans attendre votre appel ; elles suivent aussi votre instance de manière proactive et vous recommandent les corrections utiles, que vous appliquez, vous ou votre assistant IA. Les sauvegardes sont chiffrées chaque nuit et gardées hors de la machine, leur restauration est comprise, et la migration de votre serveur actuel est offerte.
Oui. FreshRSS est sous licence AGPL-3.0 : vous pouvez le faire tourner en entreprise sans licence à acheter. Si vous le modifiez, votre version doit offrir son code source à ceux qui l'utilisent par le réseau. Reste le coût du serveur qui le fait tourner.
Créez un compose.yaml avec l'image freshrss/freshrss, les volumes data et extensions et le port publié sur 127.0.0.1, puis lancez docker compose up -d. Placez ensuite un mandataire inverse en HTTPS devant, ouvrez votre adresse et suivez l'assistant d'installation.
Avec l'image Docker, donnez à CRON_MIN les minutes de passage, par exemple 13,43 : le projet recommande environ deux passages par heure. Sans CRON_MIN, la tâche intégrée reste éteinte. Une tâche planifiée sur le serveur, qui lance app/actualize_script.php dans le conteneur, fait le même travail.
SQLite est intégré et ne demande rien à préparer ; le README Docker le décrit comme le plus simple, avec de bonnes performances. La page des prérequis recommande PostgreSQL 10 ou plus récent, et accepte MariaDB 10.6 et MySQL 8.0. Les commandes db-backup et db-restore permettent de changer de base plus tard.
Activez l'accès par l'API dans la section Authentification, puis choisissez un mot de passe d'API dans votre profil. Dans une application compatible, indiquez l'adresse api/greader.php de votre instance, l'API Google Reader étant la meilleure selon le README, ou api/fever.php.
Non, par défaut : la configuration limite les comptes à celui de l'administrateur. Vous créez les autres dans Administration, Gestion des utilisateurs, ou vous relevez le nombre de comptes dans la configuration système pour faire apparaître le formulaire d'inscription.
Copiez les volumes data et extensions, service arrêté. Activez aussi auto_sqlite_export et planifiez cli/export-sqlite-auto.php, qui exporte chaque nuit la base de chaque utilisateur en SQLite. Avec PostgreSQL, ajoutez un pg_dump. Testez régulièrement la restauration.
Un VPS géré couvre le serveur : système, sécurité, supervision et sauvegardes. Nos équipes suivent aussi votre instance de manière proactive et vous recommandent les corrections utiles, que vous appliquez. Une intervention dans l'application se facture à l'heure ou au forfait.
Simafri
Parlons de votre site web
Dites-nous en deux mots votre projet : on revient vers vous rapidement.
Merci ! Votre demande a bien été envoyée. Nous vous répondrons rapidement.
Vous préférez l'email ? Écrivez-nous à support@simafri.com.