03/03/2025

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 :

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 ?


Tags:

config | jkb.log | self-hosting


Impressions : FlatOut 3: Chaos & Destruction (06/03/2025)Impressions : Relentless Expanse (28/02/2025)