Ajouter des commentaires à Ghost, sans Disqus

Grâce à un passage chez Wonderfall j’ai trouvé le moyen d’ajouter un système de commentaires à Ghost, avec Isso une alternative libre et auto-hébergeable à Disqus.

Les fonctionnalités sont les suivantes :

  • Syntaxe Markdown
  • Possibilité d’éditer son commentaire pendant 15 min après envoi
  • Modération par mail
  • Stockage dans une base SQLite
  • Import depuis Disqus et WordPress

Et c’est extrêmement simple à installer et intégrer !

Installation de Isso

La procédure qui va suivre est fonctionnelle pour Debian Jessie, pour d’autres distributions il faudra se référer à la documentation.

Pour commencer on installe donc les paquets pré-requis :

apt install python-setuptools python-virtualenv python-dev sqlite3 build-essential

On créer un utilisateur avec lequel notre instance de Isso va tourner :

adduser isso

Ensuite on se connecte sous cet utilisateur, on créer un virtualenv Python et on le charge :

su - isso
virtualenv /home/isso/app
source /home/isso/app/bin/activate

Dans ce virtualenv, on installe Isso via pip :

pip install isso

Et voilà, c’est tout pour l’installation. Toutefois il reste la configuration bien sûr…

À l’avenir, pour les mises à jour, une simple commande suffira :

su - isso -c 'source ~/app/bin/activate; pip install --upgrade isso'

Configuration de Isso

On créer donc un fichier /home/isso/app/config.ini, qui va contenir les paramètres de configuration de notre instance Isso. On peut reprendre et personnaliser celui-ci, ou suivre la documentation. Voici le mien pour exemple :

# Isso configuration file
# vim: set filetype=ini

[general]

dbpath = /home/isso/app/comments.db
host = https://blog.example.net/
max-age = 15m
notify = smtp

[moderation]

enabled = true
purge-after = 30d

[server]

listen = http://127.0.0.1:4280
reload = off
profile = off

[smtp]

username = noreply@example.net
password = monmotdepasse
host = mail.example.net
port = 587
security = starttls
to = moi@example.net
from = noreply@example.net
timeout = 10

[guard]

enabled = true
ratelimit = 2
direct-reply = 3
reply-to-self = false
require-email = false

[markup]

options = strikethrough, autolink, fenced_code, no_intra_emphasis
allowed-elements =
allowed-attributes =

[hash]

salt = Eech7co8Ohloopo9Ol6baimi
algorithm = pbkdf2

On peut maintenant tester si ça tourne correctement (toujours sous l’utilisateur isso) :

/home/isso/app/bin/isso -c /home/isso/app/config.ini run

Si tout se passe bien on devrait avoir les messages suivants dans la console :

2016-03-11 15:19:24,054 INFO: connected to SMTP server
2016-03-11 15:19:24,122 INFO: connected to https://blog.example.net/

Puisque c’est bon, on peut arrêter en faisant Ctrl + C, et on va créer un service systemd pour que Isso se lance automatiquement au démarrage. On repasse en root et on créer donc un fichier /etc/systemd/system/isso.service :

[Unit]
Description=lightweight Disqus alternative
After=network.target

[Service]
WorkingDirectory=/home/isso/app
ExecStart=/home/isso/app/bin/isso -c config.ini run
Type=simple

User=isso

StandardOutput=journal
StandardError=inherit
SyslogIdentifier=isso

[Install]
WantedBy=multi-user.target

On active notre service nouvellement créé, on le démarre, et on en vérifie le statut :

systemctl enable isso
systemctl start isso
systemctl status isso

Configuration de Apache pour Isso

Notre instance de Isso est normalement fonctionnelle, mais il faut la rendre accessible depuis le Web. Pour ça il faut qu’on ai un nom DNS qui pointe vers le serveur de notre instance. On peut par exemple faire un CNAME de comments.example.net vers blog.example.net si Isso tourne sur le même serveur que notre Ghost.

Une fois la configuration DNS faite, on peut créer notre VirtualHost dans Apache. On créer donc un fichier /etc/apache2/sites-available/comments.conf :

<VirtualHost *:80>
    ServerName  comments.example.net
    ServerAdmin moi@example.net

    Redirect permanent / https://comments.example.net/

    ErrorLog  /home/isso/logs/error.log
    CustomLog /home/isso/logs/access.log combined
</VirtualHost>

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerName  comments.example.net
        ServerAdmin moi@example.net

        ProxyPass        "/" "http://127.0.0.1:4280/"
        ProxyPassReverse "/" "http://127.0.0.1:4280/"

        SSLEngine on

        SSLCertificateKeyFile /etc/letsencrypt/live/blog.example.net/privkey.pem
        SSLCertificateFile    /etc/ssl/certs/blog.example.net.pem
        SSLCACertificateFile  /etc/ssl/certs/ca-certificates.crt

        Header always set Strict-Transport-Security "max-age=15768000"

        ErrorLog  /home/isso/logs/error.log
        CustomLog /home/isso/logs/access.log combined
    </VirtualHost>
</IfModule>

Dans mon cas, mon certificat pour blog.karolak.fr est également signé pour comments.karolak.fr (par Let’s Encrypt), c’est pourquoi vous pouvez noter que je réutilise ce certificat.

Il n’y a plus qu’à activer le module proxy_http pour Apache, si ce n’est pas déjà fait, activer notre VirtualHost et redémarrer le service Apache2 :

a2enmod proxy_http
a2ensite comments
systemctl restart apache2

Si comme moi vous avez configuré les logs pour aller dans le répertoire /home/isso/logs/, il faut bien sûr le créer au préalable. Et éventuellement configurer la rotation des logs, en créant par exemple un fichier /etc/logrotate.d/apache2-users :

/home/*/logs/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 640 root adm
}

Intégration de Isso dans Ghost

Rien de plus simple. Il suffit d’ouvrir le fichier de template des posts, /chemin/vers/ghost/content/themes/montheme/post.hbs, et d’ajouter les ligne suivantes en dessous de la balise {{/author}} :

<script data-isso="//comments.example.net/" src="//comments.example.net/js/embed.min.js"></script>
<section id="isso-thread"></section>

Et c’est tout, ça devrait fonctionner !

Lorsque quelqu’un post un commentaire, on devrait recevoir un mail à l’adresse qu’on a renseigné dans la configuration de Isso, avec un lien pour supprimer ou valider le commentaire.

Si vous rencontrez des problèmes ou avez des suggestions, vous pouvez laisser un commentaire ci-dessous ! ^_^