Contexte

Je cherchais une alternative libre à Disqus pour ajouter une section commentaire à mon blog. Je la voulais légère, opensource, en développement actif et facile à intégrer. En fouillant un peu je suis tombé sur ISSO, un système qui coche toutes les cases.
Son nom vient de l’allemand “Ich schrei sonst!”. Petite explication tirée de la doc officielle :

Isso is an informal, german abbreviation for “Ich schrei sonst!”, which can roughly be translated to “I’m yelling otherwise”. It usually ends the discussion without any further arguments.

In germany, Isso is also pokémon N° 360.

Isso est conçu autour d’un système client/serveur. Il est très léger.

La partie cliente est constituée d’un simple fichier .js et d’un bout de code pour l’appeler, intégrable sur n’importe quel site.

Le serveur, lui, est écrit en python ce qui lui permet d’être installé via un gestionnaire de paquet python (pip, pypi, …), dans un environnement virtuel python et même via apt et yum pour les systèmes Debian/Ubuntu et Fedora/Red Hat. Une image Docker est également proposée ainsi qu’une installation via les sources, disponibles sur github.

Enfin, SQLite gère le stockage des données.

Il est possible d’importer des commentaires depuis Wordpress ou Disqus dans Isso.

La documentation est relativement bien faite.

Je vais utiliser le gestionnaire de paquet pip pour gérer l’installation, dans un environnement virtuel python. Cela me permettra d’avoir une version plus à jour que via les dépots apt, et de lancer Isso dans un environnement indépendant.

Pour plus de cloisonnage et donc de sécurité, un nouvel utilisateur va être créé pour gérer Isso.

Dépendances

On installe les dépendances :

apt install sqlite3 build-essential python3-dev python3 python3-pip python3-venv libssl-dev libffi-dev

Vous aurez également besoin d’un sous domaine dédié à Isso (ex : isso.votredomaine.tld) pointant vers le serveur hébergeant Isso. Il est possible de faire autrement, avec par exemple votredomaine.tld/isso mais je ne décrirai pas cette méthode ici. Notez que la partie concernant l’installation reste la même.

Installation

Serveur

Le nouvel utilisateur :

adduser isso --disabled-login --disabled-password

Depuis root, on se connecte au nouvel utilisateur, on créé l’environnement virtuel et les répertoires de configuration.

su - isso 
mkdir -p /home/isso/isso_serv
mkdir -p /home/isso/isso_conf
mkdir -p /home/isso/isso_bdd
python3 -m venv /home/isso/isso_serv
source /home/isso/isso_serv/bin/activate

On peut maintenant lancer l’installation

pip3 install wheel
pip3 install isso

Configuration

Toujours avec l’utilisateur isso, on crée le fichier de configuration.

nano /home/isso/isso_conf/conf.cfg

[general]
dbpath = /home/isso/isso_bdd/comments.db
host =
    http://kettbi.fr/
    https://kettbi.fr/
    http://www.kettbi.fr/
    https://www.kettbi.fr/
name = kettbi
max-age = 15m
;notify = smtp
log-file = /home/isso/isso.log

[admin]
enabled = true
password = upPn6PKc29imqjT6PJ52Q3WpTJNHf4Kb

[moderation]
enabled = false

[server]
listen = http://localhost:8080
reload = off
profile = off


[guard]
enabled = true
ratelimit = 2
direct-reply = 3
reply-to-self = false
require-author = true
require-email = false
;public-endpoint = https://isso.kettbi.fr

;[smtp]
;username =
;password =
;host =
;port = 
;security = 
;to =
;from =
;timeout = 

[hash]
salt = 6VPoRUGTvcS3kx9NM436cofu5vTyiVRw
algorithm = pbkdf2

De nombreuses options sont paramétrables dans ce fichier, je vous renvoie vers la documentation pour une liste exhaustive, mais voici quelques exemples :

  • [general] : le block décrivant les options de base du serveur
    • max-age : le temps durant lequel un commentaire est modifiable par son rédacteur
    • notify : si défini sur smtp, vous envoie un mail pour chaque nouveau commentaire posté sur votre site
  • [admin] : active ou non l’interface d’administration des commentaires, disponible à l’URL /admin du sous domaine
  • [moderation] : active ou non la modération des commentaires, il est possible de recevoir un lien par mail pour valider chaque commentaire
  • [server] : le comportement du serveur, celui-ci peut écouter sur un port réseau ou via un socket Unix
  • [guard] : les options anti-SPAM, pour empêcher les scripts/spammeurs d’inonder votre site de commentaires
    • require-email : autorise ou non les commentaires sans préciser d’email
    • require-author : autorise ou non les commentaires sans préciser de nom/pseudo
  • [smtp] : les options d’envoi de mail
  • [hash] : option de hashage, utiliser pour masquer les adresses emails des posteurs

Test

Il est temps de tester notre configuration. Toujours avec l’utilisateur isso

isso -c /home/isso/isso_conf/conf.cfg run

Si la console ne renvoie aucun problème et que la log non plus (cat /home/isso/isso.log), alors on peut passer à la création du service.

note : l’erreur unable to connect to your website, Isso will probably not work correctly. Please make sure, Isso can reach your website via HTTP(S). est normale. Elle apparaîtra tant que nous n’aurons pas configuré nginx.

Service

La création du service nécessite cette fois l’accès root

nano /etc/systemd/system/isso.service

[Unit]
Description=lightweight Disqus alternative

[Service]
User=isso
Environment="ISSO_SETTINGS=/home/isso/isso_conf/conf.cfg"
ExecStart=/home/isso/.local/bin/isso -c $ISSO_SETTINGS run

[Install]
WantedBy=multi-user.target

On active le service pour qu’il se lance au démarrage de la machine.

systemctl enable isso

On lance le service et on vérifie que tout va bien.

systemctl start isso
systemctl status isso
● isso.service - lightweight Disqus alternative
   Loaded: loaded (/etc/systemd/system/isso.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-02-06 15:05:16 CET; 20s ago
 Main PID: 21670 (isso)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/isso.service
           └─21670 /usr/bin/python3 /home/isso/.local/bin/isso -c /home/isso/isso_conf/conf.cfg run

Pour être certain que tout fonctionne correctement, on peut vérifier les ports en écoute sur la machine.

root@TS:~# netstat -plunt 
Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name    
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      21670/python3 

Tout est ok, on va pouvoir passer à la configuration du serveur (ici nginx).

Nginx

Je pars du principe que NginX est déjà installé sur votre machine et que la configuration de base est effectuée puisque vous hébergez déjà votre site web. Si ce n’est pas le cas (par exemple si vous souhaitez faire tourner Isso sur un serveur à part), un simple apt install nginx devrait être suffisant pour démarrer.

Configuration

Toujours en root, on va créer le fichier ce configuration pour nginx.

nano /etc/nginx/sites-available/isso.kettbi.fr

server {

    listen 80;
    listen [::]:80;
    server_name isso.kettbi.fr;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    access_log /var/log/nginx/isso.kettbi.fr-access.log;
    error_log  /var/log/nginx/isso.kettbi.fr-error.log;

}

On active la nouvelle configuration et on redémarre nginx pour qu’il l’applique

ln -s /etc/nginx/sites-available/isso.kettbi.fr /etc/nginx/sites-enabled/isso.kettbi.fr
systemctl restart nginx

Si votre sous-domaine pointe bien vers votre serveur, vous devriez avoir les résultats suivants

pour http://isso.votredomain.tld :

bad_request

pour http://isso.votredomain.tld/admin :

admin_panel

Tout fonctionne correctement, ajoutons un peu de sécurité.

Letsencrypt

Pour cette étape, votre sous domaine doit impérativement pointer vers ce serveur et le service Isso doit être en marche, son port doit être en écoute. Si ce n’est pas le cas, le challenge effectué par letsencrypt pour attribuer une paire de clés/certificat échouera.

On peut maintenant passer notre configuration en HTTPS/HTTP2 pour plus de sécurité et de rapidité. Pour cela on va installer letsencrypt et son module pour nginx, si ce n’est pas déjà fait.

Toujours en root :

apt install letsencrypt python3-certbot-nginx

On va maintenant générer les clés et le certificat pour notre domaine

letsencrypt --nginx -d isso.kettbi.fr

Lors du premier lancement, Letsencrypt vous demande, entre autres, une adresse email. Suivez les instructions. Après la génération, Letsencrypt propose de générer pour nous la redirection HTTP vers HTTPS. Choisissez l’option qui vous convient. Personnellement, je le laisse faire.

Le fichier de configuration de votre site devrait maintenant ressembler à ça

nano /etc/nginx/sites-enabled/isso.kettbi.fr

server {
    server_name isso.kettbi.fr;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    access_log /var/log/nginx/isso.kettbi.fr-access.log;
    error_log  /var/log/nginx/isso.kettbi.fr-error.log;

    listen [::]:443 ssl http2; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot

    ssl_certificate /etc/letsencrypt/live/isso.kettbi.fr/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/isso.kettbi.fr/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = isso.kettbi.fr) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;
    server_name isso.kettbi.fr;
    return 404; # managed by Certbot
}

J’ai activé HTTP2 en l’ajoutant dans le fichier de configuration comme affiché ci-dessus.

On redémarre une dernière fois le service nginx

systemctl restart nginx

A ce stade, l’interface d’administration est accessible via HTTPS, HTTP est redirigé vers HTTPS et notre serveur Isso ne nous remonte plus de problème en log. Il ne reste plus qu’à intégrer les commentaires dans notre site.

Intégration

Pour l’intégration de l’espace commentaires, il suffit d’ajouter le script suivant dans les pages de notre site.

<script data-isso="//comments.example.tld/"
        src="//comments.example.tld/js/embed.min.js"></script>

<section id="isso-thread"></section>

Pour Hugo j’ai simplement modifié le fichier single.html de mon thème, pour que l’espace commentaires s’affiche sous chaque post.

nano themes/m10c/layouts/_default/single.html

[...]    
    <div class="post-footer">
        <section id="isso-thread"></section>
        <script data-isso="https://isso.kettbi.fr/" src="https://isso.kettbi.fr/js/embed.min.js"></script>
    </div>
[...]

Je ne suis pas satisfait des couleurs par défaut. Je les modifierai dans le futur pour qu’elles s’accordent avec celles du thème que j’utilise.

Sauvegarde

Il suffit d’intégrer les répertoire suivants à votre sauvegarde :

  • /home/isso/isso_bdd : le répertoire de la base de données contenant les commentaires
  • /home/isso/isso_conf : le répertoire contenant votre fichier de configuration

Vous pouvez y ajouter le répertoire /home/isso/isso_serv. Même s’il ne contient aucune donnée, il peut dans certains cas accélérer la procédure de restauration.
Enfin, sauvegarder le fichier /home/isso/isso.log permet d’avoir une visibilité sur les événements du serveur, à vous de voir s’il vous intéresse ou non.

Mise à jour

Pour la mise à jour, rien de plus simple.
En root :

su - isso
source /home/isso/isso_serv/bin/activate
pip3 install --upgrade isso

Liens

https://posativ.org/isso/docs/
https://stanislas.blog/2018/02/add-comments-to-your-blog-with-isso/
https://www.researchut.com/blog/comments_on_hugo_with_isso/
https://jesuisadmin.fr/installer-isso-sur-ubuntu-16-04-lts-remplacer-disqus/