Isso avec HAProxy sur FreeBSD

Alternativ to Disqus: Isso with HAProxy hosted on 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.

$ ezjail-admin console db

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

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

Il est possible de faire ça plus propre et travailler dans un virtualenv, c'est au choix. 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 à faire tourner Isso en mode daemon. Un script rc existe mais ne fonctionne pas. Après review, ça n'était qu'une erreur sur une l'utilisation d'une variable, j'ai corrigé ce script. Vous pouvez trouver mon 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 n'est actuellement qu'à l'écoute dans jail, 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.

Sur HAproxy, je capture le header Origin et envoie les requêtes à destination de isso.mondomaine.tld vers le backend approprié (ici ma jail db) qui a pour server Isso (192.168.0.4:8080).

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 isso 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