Agrégation de flux avec FreshRSS
Ce weekend j'ai installé une instance FreshRSS pour faire de l'agrégation de flux à consulter ensuite via l'interface Web, une application Android, ou une application TUI.
Le principe est simple : FreshRSS relève des flux RSS/Atom, enregistre les articles dans une base de données (SQLite par défaut mais d'autres options sont prises en charge), et ensuite des clients se connectent à FreshRSS en utilisant une API GReader et obtiennent les articles à lire. L'avantage d'utiliser un agrégateur de la sorte est que je peux utiliser plusieurs clients différents sur plusieurs appareils et les lectures sont synchronisées (ainsi que les favoris).
Le processus était simple, mais les documentations sont dispersées donc faisons un récapitulatif (pour Ubuntu Server 22.04 mais ça devrait fonctionner dans la plupart des Linux à base Debian).
Préparation
J'ai déjà un serveur à disposition, et un nom de domaine. J'ai donc crée un sous-domaine freshrss.jkbockstael.be
en CNAME
vers jkbockstael.be
, sur ce serveur j'ai un certificat SSL wildcard via Let's Encrypt donc pour avoir du HTTPS c'est déjà bon.
Installation de FreshRSS
L'installation se fera dans /var/www/freshrss.jkbockstael.be
.
D'abord les prérequis ; c'est une application PHP qui a besoin de quelques modules additionnels et j'utilise Apache comme serveur Web :
sudo apt install php libapache2-mod-php php-curl php-gmp php-intl php-mbstring php-sqlite3 php-xml php-zip
Quelques modules Apache doivent d'ailleurs être activés :
sudo a2enmod headers expires rewrite ssl
sudo systemctl restart apache2
Il faut maintenant une configuration VHost dans /etc/apache2/sites-available/freshrss.jkbockstael.be.conf
:
<VirtualHost *:443>
ServerName freshrss.jkbockstael.be
DocumentRoot /var/www/freshrss.jkbockstael.be/freshrss/p/
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/jkbockstael.be/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/jkbockstael.be/privkey.pem
<Directory /var/www/freshrss.jkbockstael.be/freshrss/p>
Options -Indexes
AllowOverride AuthConfig FileInfo Indexes Limit
Order allow,deny
Allow from all
Require all granted
</Directory>
CustomLog /var/log/apache2/freshrss.jkbockstael.be_access.log combined
ErrorLog /var/log/apache2/freshrss.jkbockstael.be_error.log
LogLevel warn
ServerSignature on
AllowEncodedSlashes on
</VirtualHost>
<VirtualHost *:80>
ServerName freshrss.jkbockstael.be
ServerAdmin admin@jkbockstael.be
DocumentRoot /var/www/freshrss.jkbockstael.be/freshrss/p/
<Directory /var/www/freshrss.jkbockstael.be/freshrss/p>
Options -Indexes
AllowOverride AuthConfig FileInfo Indexes Limit
Order allow,deny
Allow from all
Require all granted
</Directory>
CustomLog /var/log/apache2/freshrss.jkbockstael.be_access.log combined
ErrorLog /var/log/apache2/freshrss.jkbockstael.be_error.log
LogLevel warn
ServerSignature on
AllowEncodedSlashes on
</VirtualHost>
Par sécurité vu que le processus de configuration se fait via une interface Web exposée à Internet on peut remplacer chaque bloc
Order allow,deny
Allow from all
par un bloc
Order deny,allow
Deny from all
Allow from IP_DEPUIS_LAQUELLE_ON_VA_CONFIGURER
On peut maintenant télécharger le programme et l'installer :
wget https://github.com/FreshRSS/FreshRSS/archive/latest.zip
unzip latest.zip
sudo mv FreshRSS-latest /var/www/freshrss.jkbockstael.be/freshrss
sudo chown -R www-data:www-data /var/www/freshrss.jkbockstael.be/freshrss/
sudo chmod -R u+w /var/www/freshrss.jkbockstael.be/freshrss/data/
rm latest.zip
Puis le configurer en pointant son navigateur sur https://freshrss.jkbockstael.be
où le processus est extrêmement simple.
Interface Web
Et voilà. Il me suffit donc d'aller sur https://freshrss.jkbockstael.be
, me connecter avec le nom d'utilisateur et le mot de passe que j'ai créés pendant la configuration juste avant, et d'ajouter des flux RSS. Je peux ensuite les consulter directement avec n'importe quel navigateur capable d'exécuter du JavaScript, en desktop ou en mobile. Les flux sont rafraîchis à chaque visite ou manuellement, avec un minimum de 20 minutes entre deux rafraîchissements.
Permettre l'utilisation de clients
Ce qui m'intéresse surtout c'est de pouvoir utiliser des clients natifs pour consulter mes flux en les connectant à FreshRSS comme agrégateur.
Pour ça dans l'interface Web de FreshRSS il faut aller dans les réglages (en haut à droite). D'abord on va dans "Authentification" dans la section Administration pour y cocher "Allow API Access", puis dans "Profile" dans la section Account y créer un nouveau mot de passe dédié aux clients sous "External access via API".
Maintenant j'ai mes paramètres pour les clients :
- URL de l'agrégateur :
https://freshrss.jkbockstael.be
- Mot de passe : disons
motDePasseClients
Client Android
Pour Android deux clients libres compatibles se distinguent du lot : Readrops, et Capy Reader que je préfère parce qu'il colle mieux à mes goûts esthétiques (et puis les capybaras c'est super chouette). Les deux proposent dès le lancement une configuration guidée pour se connecter à FreshRSS et ça fonctionne directement ; les flux sont bien tous ramenés, et quand on lit un article on voit dans l'interface Web de FreshRSS qu'il est bien marqué comme lu. Exactement ce que je veux.
Client TUI
Je passe pas mal de temps dans un terminal sous Linux, je veux donc un client en u texte qui soit compatible FreshRSS. Ici aussi deux choix se distinguent du lot : nom et Newsboat. Je connais déjà Newsboat donc c'est celui-là que je choisis.
Newsboat est compatible avec FreshRSS depuis sa version 2.24, or la version distribuée dans Ubuntu 22.04 est le 2.18 et celle distribuée dans Debian 12 est la 2.21. Ubuntu 24.10 et Debian 13 fournissent une version assez récente, mais dans l'immédiat j'opte pour une installation Snap.
sudo snap install newsboat
Le fichier de configuration est donc à créer dans ~/snap/newsboat/current/.newsboat/config
:
urls-source "freshrss"
freshrss-url "https://freshrss.jkbockstael.be/api/greader.php"
freshrss-login "jkb"
freshrss-password "motDePasseClients"
freshrss-flag-star "s"
freshrss-min-items 100
Les deux dernières options indiquent quel flag utiliser pour mettre en favori un article et qu'il apparaisse dans la catégorie "Starred items" ensuite, et de ramener 100 articles par flux au lieu des 20 par défaut.
Rafraîchissement automatique
J'ai à présent de quoi lire mes flux RSS depuis plusieurs clients ou via une interface Web et le tout est synchronisé. Très bien. Cependant les clients ne provoquent pas de refraîchissement de ces flux, seule une consultation via l'interface Web le fait.
Pour pallier à ça j'ajoute sur le serveur une tache cron
dans /etc/cron.d/freshrss
:
0 6,12,18 * * * www-data php -f /var/www/freshrss.jkbockstael.be/freshrss/app/actualize_script.php > /tmp/FreshRSS.log 2>&1
Les flux RSS seront donc rafraîchis trois fois par jour à 6h, 12h, et 18h (UTC) quoi qu'il arrive, et les clients profiteront ensuite des nouveaux articles.
Et voilà
Les flux RSS c'est bien, ne fut-ce que parce que ça donne de la liberté aux lecteurs quant à la manière dont ils lisent ce qu'on publie. Mettez à disposition des flux RSS pour vos blogs, abonnez-vous à des flux RSS, lisez du Web qui soit écrit par des humains pour des humains.
Le mien est par ici si jamais. Tout l'historique du blog y est, et les articles n'y sont pas tronqués ; une fois qu'on s'y abonne on n'a même plus besoin de visiter le blog. Vous voyez ce qui arrive quand on s'en fiche du nombre de pages vues parce qu'on n'a pas de revenus publicitaires ? C'est bien, hein ?