Isso pour ajouter des commentaires à un site statique

Testé sur OpenBSD 7.6 avec Python 3.11.

Ceci est une version révisée de mon guide précédent pour configurer un serveur isso pour des sites multiples dans un environnement virtuel python.

Créer un utilisateur dédié

# useradd -m -s /bin/ksh _isso
# passwd _isso

Installer isso et gunicorn

Pour héberger les commentaires de plusieurs sites, il faut installer un serveur WSGI. gunicorn est une des options proposées dans la documentation de isso.

Le dernier release de unicorn (20.0.4) a un bug avec isso et ne fonctionnera pas. On ne peut donc pas utiliser le port de OpenBSD via pkg_add py3-gunicorn.

Créer un environnement virtuel avec python

Depuis OpenBSD 7.6 et python3.11, pip force l’utilisation du virtualenv et n’autorise plus l’installation de modules dans l’espace usager régulier via $ pip install.

On installe d’abord le module python virtualenv:

root ~$ pkg_add py3-virtualenv

Créer un environnement virtuel pour l’usager _isso:

_isso ~$ mkdir py3venv
_isso ~$ virtualenv -p python3 /home/_isso/py3venv

On peut tester l’environnement virtuel:

_isso ~$ . py3venv/bin/activate
(py3venv) _isso ~$ which python

Installer isso et gunicorn dans l’environnement virtuel

(py3venv) _isso ~$ pip install isso
(py3venv) _isso ~$ pip install https://github.com/benoitc/gunicorn/tarball/master        
...
Successfully installed gunicorn-23.0.0 packaging-24.1

redirection vers un sous-domaine avec relayd

Ajouter un enregistrement de type A (comments.example.pw) dans le DNS de votre régistraire et pointer vers la même adresse IP que votre domaine.

Modifier /etc/relayd.conf pour diriger le trafic vers isso:

# rcctl enable relayd
# cat /etc/relayd.conf
relay "isso" {
        listen on comments.example.pw port 80
        forward to localhost port 8080
}

redirection vers un sous-domaine avec nginx et encryption ssl

Cette configuration dans /etc/nginx.conf redirige les requêtes sur comments.neutrino.pw sur le port 80 vers le port 443 (encrypté) qui ensuite redirige les requêtes sur le serveur local http://localhost:8080

    server {
        listen 80;
        server_name comments.neutrino.pw;

        location /.well-known/acme-challenge/ {
          rewrite ^/.well-known/acme-challenge/(.*) /$1 break;
          root /acme;
        }

        location / {
          return 301 https://$server_name$request_uri;
        }
    }

    server {
        server_name comments.neutrino.pw;

        listen [::]:443 ssl http2;
        listen 443 ssl http2;

        access_log logs/isso-access.log;
        error_log  logs/isso-error.log;

        ssl_certificate /etc/ssl/comments.fullchain.pem;
        ssl_certificate_key /etc/ssl/private/comments.key;
        ssl_protocols TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"

        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;
                }
    }

configuration serveur

Créer isso.cfg. Seuls quelques paramètres sont essentiels pour démarrer un serveur avec une configuration par défaut.

[general]
dbpath = /var/lib/isso/comments.db
host = https://example.tld/
[server]
listen = http://localhost:1234/

Voici ma config pour ce site:

[general]
#name = phil
dbpath = /home/_isso/philstjacques.comments.db
host =
        https://phil.quebec/
max-age = 15m
notify = stdout
reply-notifications = true
log-file = /home/_isso/philstjacques.log

[admin]
enabled = true
password = passwd

[moderation]
enabled = true
purge-after = 60d

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

Pour plus de détails: https://posativ.org/isso/docs/configuration/server/

configuration client

Insérer un bloc HTML dans le bas de page:

<script src="https://comments.neutrino.pw/bonsai/js/embed.min.js"
        data-isso="https://comments.neutrino.pw/bonsai/"
        data-isso-require-author="true"
        data-isso-require-email="true"
        data-isso-css="false"
        data-isso-reply-notifications="true"
        data-isso-reply-to-self="true"></script>

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

Pour plus de détails: https://posativ.org/isso/docs/configuration/client/

inclure le code client dans le site hugo

Inclure un partial dans themes/PaperMod/layouts/_default/single.html à la fin de la page:

  {{- if (.Param "comments") }}
  {{- partial "comments.html" . }}
  {{- end }}
</article>

Contenu de layouts/partials/comments.html:

<script src="https://comments.neutrino.pw/bonsai/js/embed.min.js"
        data-isso="https://comments.neutrino.pw/bonsai/"
        data-isso-require-author="true"
        data-isso-require-email="true"
        data-isso-css="false"
        data-isso-reply-notifications="true"
        data-isso-reply-to-self="true"></script>

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

Configuration du serveur isso

Créer un fichier de configuration par site en ajoutant le champs name.

philstjacques.cfg:

[general]
name = phil

bonsai.cfg:

[general]
name = bonsai

Configuration du client isso

Ajouter le paramètre name relatif à chaque site dans les URL src et isso-data du client:

<script src="http://comments.example.pw/phil/js/embed.min.js"
    data-isso="http://comments.example.pw/phil/"
    data-isso-require-author="true"
    data-isso-require-email="true"
    data-isso-css="false"
    data-isso-reply-notifications="true"
    data-isso-reply-to-self="true"></script>

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

Lancer le serveur isso multisites

On lance isso avec gunicorn en déclarant les fichiers de configuration dans une variable d’environnement:

#!/bin/ksh
#
export ISSO_SETTINGS="/home/_isso/philstjacques.cfg;/home/_isso/bonsai.cfg;/home/_isso/castor.cfg;/home/_isso/philavelo.cfg"
/home/_isso/py3venv/bin/python /home/_isso/py3venv/bin/gunicorn --preload -b localhost:8080 isso.dispatch > /home/_isso/gunicorn.log 2>&1 &

Je mets le tout dans un script:

_isso ~/scripts$ multiisso
2021-03-02 20:19:30,971 INFO: connected to http://philstjacques.com/
2021-03-02 20:19:38,661 INFO: connected to https://bonsai.earth/
[2021-03-02 20:19:38 +0100] [75021] [INFO] Starting gunicorn 20.1.0
[2021-03-02 20:19:38 +0100] [75021] [INFO] Listening at: http://127.0.0.1:8080 (75021)
[2021-03-02 20:19:38 +0100] [75021] [INFO] Using worker: sync
[2021-03-02 20:19:38 +0100] [31622] [INFO] Booting worker with pid: 31622

https://posativ.org/isso/docs/setup/multiple-sites/

modération des commentaires

Site unique:

Il suffit de visiter http://comments.server.pw/admin

Sites multiples:

Il suffit de visiter http://comments.server.pw/phil/admin

ajouter un service pour isso

  • créer /etc/rc.d/isso
  • chmod a+x /etc/rc.d/isso
  • rcctl enable isso

Voici mon script de démarrage avec gunicorn en multisites dans un environnement virtuel python:

#!/bin/ksh
#
# $OpenBSD: issod,v 1.0 2022/10/19 19:52:12 neutrino Exp $

daemon="/home/_isso/scripts/multiisso"
daemon_execdir="/home/_isso/"
daemon_user="_isso"
rc_BG=YES

. /etc/rc.d/rc.subr

rc_reload=NO

#pexp="/usr/local/bin/python3.11 /home/_isso/.local/bin/gunicorn"
pexp="/home/_isso/py3venv/bin/gunicorn"

rc_check() {
                pgrep -T "${daemon_rtable}" -q -f "${pexp}"
}

rc_stop() {
        pkill -f "${pexp}"
}

rc_cmd $1

Activer le script comme démon:

# rcctl enable issod

Conclusion

Voilà! On a maintenant un serveur de commentaires léger et ouvert pour plusieurs sites statiques!

Liens utiles

CSS qui vient avec isso:

Pour des exemples de styles CSS: