C’est un chantier que j’avais laissé de côté depuis la migration du blog de wordpress vers hugo, c’est aujourd’hui chose faite, les commentaires sont enfin ouverts sur le blog, histoire d’y apporter un peu plus de vie et pour entendre ce que vous avez à (re)dire sur mes coquilles orhtographiques ou autres. Lorsque l’on veut mettre en place un système de commentaires sur un site statique plusieurs outils s’offrent à nous. Le plus connu est surement Disqus qui possède un fonctionement plus que discutable, traçage sans gêne des visiteurs, hébergement dans leur cloud, aucune maîtrise sur les données collectées. Pour mon blog je voulais quelque chose que je puisse héberger, de rapide et qui ne traque pas mes visiteurs. Mon choix c’est donc porté sur Isso une alternative open-source à Disqus qui peut s’héberger facilement et dont j’ai la maîtrise totale. La documentation est très bien réalisée, mais j’ai rencontré quelques difficultés lors de l’installation que je vous détaille ici. Celle-ci se déroule sur container LXC avec pour système un Debian 10.

Installation

Installation des dépendances afin d’utiliser par défaut Python3 et non Python2. En effet j’ai rencontré plusieurs problèmes de versions de dépendances avec python2 et n’étant plus supporté depuis le 1 Janvier 2020 j’ai décidé d’utiliser python3.

sudo apt install python3.7-dev python3.7-pip sqlite3 build-essential 

Installation de Isso.

sudo pip3 install isso

Ensuite je crée un utilisateur dédié à isso, celui-ci permettra d’executé et d’envoyer les notifications par courriel et configuration de sont mot de passe.

sudo adduser isso --disabled-login
sudo passwd isso

Configuration

Isso installé passons maintenant à sa configuration. Pour l’occasion j’ai créé un dossier dans /etc/isso.d pour y stocker le fichier de configuration.

mkdir /etc/isso.d
sudo vim /etc/isso.d/blog.cfg

J’ai ensuite renseigné le fichier comme suit.

[general]
name = blog
dbpath = /var/lib/isso/blog.comments.db
host = https://draconis.me/blog/
max-age = 15m
notify = smtp
log-file = /var/log/isso.log

[moderation]
enabled = false

[admin]
enabled = true
password = # Mot de passe de l'utilisateur isso

[server]
listen = http://localhost:8080
reload = off
profile = off
public-endpoint = https://isso.draconis.me

[guard]
enabled = true
ratelimit = 2
direct-reply = 3
reply-to-self = false
require-author = false
require-email = false

[smtp]
username = # utilisateur capable d'envoyer des courriels
password = # son mot de passe
host = # serveur d'envoi de courriels
port = # le port utilisé
security = starttls
to = # mon adresse courriel
from = # adresse d'envoi des notifications
timeout = 10

Rendez-vous dans ma zone DNS afin de créer le sous-domaine isso.draconis.me correspondant au serveur de commentaires.

isso 0 IN cname draconis.me.

Attributions des droits à l’utilisateur isso afin qu’il puisse écrire dans la base de données et les fichiers de journalisation.

sudo touch /var/log/isso.log
sudo chown isso: /var/log/isso.log
sudo mkdir /var/lib/isso
sudo chown isso: /var/lib/isso
sudo touch /var/lib/isso/blog.comments.db
sudo chown isso: /var/lib/isso/blog.comments.db

Vérifions maintenant que tout fonctionne correctement.

# changement d'utilisateur
su - isso 
# lancement de isso
/usr/local/bin/isso -c /etc/isso.d/blog.cfg run

Si tout vas bien rien de ne doit s’afficher dans le terminal. Mais dans mon cas j’ai rencontré cette erreur :

Traceback (most recent call last):
  File "/usr/local/bin/isso", line 6, in <module>
    from isso import main
  File "/usr/local/lib/python3.7/dist-packages/isso/__init__.py", line 60, in <m>
    from werkzeug.wsgi import SharedDataMiddleware
ImportError: cannot import name 'SharedDataMiddleware' from 'werkzeug.wsgi' (/usal/lib/python3.7/dist-packages/werkzeug/wsgi.py)

Après une recherche internet il semblerai que la dernière version du paquet werkzeug ne soit pas compatible avec isso et qu’il faille rétrograder jusqu’à la version 0.16.1.

sudo pip3 install werkzeug==0.16.1

Une fois ceci fait isso démarre normalement.

Mise en service

Maintenant qu’isso fonctionne je souhaite qu’il démarre en même temps que le serveur, pour cela je crée un service systemd dans /etc/systemd/system/isso.service.

[Unit]
Description=commentaires pour le blog

[Service]
User=isso
Environment="ISSO_SETTINGS=/etc/isso.d/blog.cfg"
ExecStart=/usr/local/bin/isso -c $ISSO_SETTINGS run

[Install]
WantedBy=multi-user.target

Pour finir j’active et démarre le service.

sudo systemctl enable isso
sudo systemctl start isso
sudo systemctl status isso
● isso.service - lightweight Disqus alternative
   Loaded: loaded (/etc/systemd/system/isso.service; enabled; vendor preset: ena
   Active: active (running) since Fri 2020-12-11 10:55:37 CET; 2h 52min ago
 Main PID: 19318 (isso)
    Tasks: 1 (limit: 4632)
   Memory: 27.2M
   CGroup: /system.slice/isso.service
           └─19318 /usr/bin/python3 /usr/local/bin/isso -c /etc/isso.d/blog.cfg

Dec 11 10:55:37 stromgarde systemd[1]: commentaires pour le blog.

A cette étape je vérifie qu’isso s’éxecute correctement sur le serveur.

 sudo curl localhost:8080/admin
<html>
<head>
  <title>Isso admin</title>
  <link type="text/css" href="https://isso.draconis.me/css/isso.css" rel="stylesheet">
  <link type="text/css" href="https://isso.draconis.me/css/admin.css" rel="stylesheet">
</head>
<body>
  <div class="wrapper">
    <div class="header">
      <header>
        <img class="logo" src="https://isso.draconis.me/img/isso.svg" alt="Wynaut by @veekun"/>
        <div class="title">
          <a href="./">
            <h1>Isso</h1>
            <h2>Administration</h2>
          </a>
        </div>
      </header>
    </div>
    <main>
      <div id="login">
        Administration secured by password:
        <form method="POST" action="https://isso.draconis.me/login">
          <input type="password" name="password" autofocus />
        </form>
      </div>
    </main>
  </div>
</body>

Je constate que la page d’administration d’isso s’affiche correctement.

Configuration de Nginx

J’utilise Nginx comme proxy afin de pouvoir chiffrer les connexions sur le serveurs de commentaires. Dans le dossier /etc/nginx/site-available/isso.

server {
    listen 80;
    server_name draconis.me;
    return 301 https://$server_name$request_uri;
}


server {
	listen 443 ssl http2;
  
    server_name isso.draconis.me;

  
  	ssl_certificate /etc/letsencrypt/live/draconis.me/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/draconis.me/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/draconis.me/chain.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 80.67.169.12 80.67.169.40 valid=300s;
    resolver_timeout 5s;
    add_header Strict-Transport-Security "max-age=15552000; preload";


    access_log /var/log/nginx/isso.access.log;
    error_log  /var/log/nginx/isso.error.log;

  location / {
          proxy_set_header Host $http_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_pass http://localhost:8080;
   }
}

J’active, puis je vérifie que la configuration du vhost est bonne et pour finir je relance le serveur nginx

sudo ln -s /etc/nginx/site-available/isso /etc/nginx/site-enabled/
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl restart nginx

Intégration au blog

J’ajoute ce morceau de code directement dans mon template. Dans le cas d’un site sous hugo à la fin du fichier single.html dans ```themes/mon_theme/layouts/_default/single.htmljuste avant la dernière balise {{end}}``.

<div class="post-footer">
    <section id="isso-thread"></section>
    <script data-isso="https://isso.draconis.me/" src="https://isso.draconis.me/js/embed.min.js"></script>
</div>

Conclusion

Maintenant à vous me dire si ce billet vous a aidé en me laissant un petit commentaire ci-dessous. :)