Isso avec HAProxy sur FreeBSD

Les commentaires sont gérés avec Isso « a commenting server similar to Disqus ». La différence avec Disqus qui est un système centralisé où les visiteurs doivent se connecter à un autre service centralisé (type Facebook) ou créer un compte chez eux (enfin bref c'est de la merde), Isso est open source, peut être auto-hébergé et fonctionne de la même manière (bref c'est bien ! :)

Installation d'Isso sur FreeBSD

Comme souvent, la documentation est inexistante pour FreeBSD et on doit donc se démerder

On se connecte à une jail, personnellement je réutilise ma jail db avec MariaDB et Redis.

ezjai-admin console db

On installe les paquets nécessaires ainsi qu'Isso.

pkg install py36-pip
pkg install py36-sqlite3
pip install isso

Il est possible de faire ça plus propre et travailler dans un virtualenv. Peu importe. On vérifie qu'on a bien le binaire :

$ whereis isso
isso: /usr/local/bin/isso

Avant de démarrer, on crée un utilisateur dédié et le fichier de configuration pour Isso :

pw groupadd isso
pw adduser isso -g isso -d /nonexistent -s /usr/sbin/nologin -c "Isso user"
[general]
dbpath = /var/db/isso/comments.db
log-file = /var/log/isso.log
host = http://isso.mondomaine.tld/
       https://isso.mondomaine.tld/
max-age = 5m

Toutes les options sont disponibles ici. On termine les préparatifs par créer l'environnement nécessaire qu'on a défini plus haut.

mkdir /var/db/isso/ && touch /var/log/isso.log
chown isso:isso /var/db/isso/ /var/log/isso.log

On peut tester :

/usr/local/bin/isso -c /usr/local/etc/isso.conf run

Si tout est fonctionnel, Isso écoute sur le port 8080.

$ sockstat -4l
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
isso     python3.6  59847 5  tcp4   192.168.0.4:8080      *:*

Reste à créer un daemon pour Isso. Un script rc existait mais ne fonctionnait pas. Finalement, ça n'était qu'une erreur sur une l'utilisation d'une variable, j'ai corrigé ce script. Vous pouvez trouver le fork par ici. On va s'en servir tout de suite :

fetch https://gist.githubusercontent.com/pboesch/721ab95c8ec52b1d0047af4b2b88999c/raw/40976171b494759973317aad59fb7808357bdcc7/isso -o /usr/local/etc/rc.d/isso
chmod +x /usr/local/etc/rc.d/isso
sysrc isso_enable=YES
service isso start

Isso avec HAProxy

Isso écoute actuellement localement, il faut qu'il soit accessible publiquement. J'utilise pour cela un domaine dédié - ce qui semble être la méthode recommandée - il faut donc proxyfier tout ça. Une configuration pour nginx est fournie, c'est bien mais HAProxy c'est mieux :) La soucis technique à prendre en compte est CORS.

Techniquement, je capture le header Origin et envoie les requêtes vers le backend approprié (ici ma jail db).

frontend http
  capture request header origin len 128
  acl is_isso hdr(host) -i isso.mondomaine.tld
  use_backend jail_db if is_isso

backend jail_db
  mode http
  http-response set-header Access-Control-Allow-Credentials true
  http-response set-header Access-Control-Allow-Origin %[capture.req.hdr(0)]
  server comments 192.168.0.4:8080 weight 1 check

Intégrer Isso à Pelican

Entre les balises <head> dans templates/base.html de votre thème, on peut ajouter quelque chose comme :

<head>

{% if ISSO_SERVER %}
<!-- Comments powered by Isso -->
<script data-isso="{{ ISSO_SERVER }}/"
        src="{{ ISSO_SERVER }}/js/embed.min.js">
</script>
{% endif %}

</head>

Dans pelicanconf.py

ISSO_SERVER="https://isso.mondomaine.tld/"

On finalise par inclure les commentaires dans les articles dans templates/article.html

{% if ISSO_SERVER %}
    <div class="comments">
        <hr />
        <h2>Commentaires</h2>
        <section id="isso-thread"></section>
        <noscript>malheureusement les commentaires utilisent javascript</noscript>
    </div>
{% endif %}

Bim ! On fait tourner Isso dans une jail FreeBSD avec les flux gérés par HAProxy !


Commentaires