Come aggiungere un sistema di commenti a un sito Ghost

In questo articolo mostro in che modo è possibile aggiungere un sistema di commenti “self-hosted” ad un sito o blog fatto con Ghost.

Cos’è Ghost

Ghost è una piattaforma di blogging open-source realizzata con JavaScript e Node.js. Ghost è nato come alternativa semplice e leggera a WordPress, con lo scopo di permettere agli autori di focalizzarsi maggiormente sui contenuti e meno nella gestione della piattaforma. Infatti, a differenza di WordPress, Ghost non ha un sistema di plugin vero e proprio, è sicuramente meno flessibile ma fornisce delle “integrazioni” tramite le quali è possibile aggiungere funzionalità non previste nativamente.

In realtà, col passare del tempo, Ghost si è trasformato radicalmente, e da pura soluzione di blogging è diventata una piattaforma orientata alla “monetizzazione” dei contenuti tramite subscription.

Una delle mancanze più gravi ed evidenti di Ghost è il sistema di commenti. Infatti il software non prevede nativamente la possibilità per i visitatori di lasciare commenti agli articoli, in forma anonima o dopo registrazione. Per ovviare a questa mancanza, che io trovo veramente incomprensibile per una piattaforma del genere, è possibile ricorrere a delle specifiche integrazioni.

Integrazioni già pronte

Tra le integrazioni più facilmente fruibili e pronte all’uso ci sono sicuramente Disqus e Discourse. Il primo è un servizio commerciale fornito da un’azienda americana che prevede sia piani gratuiti che a pagamento, mentre Discourse è il software per la realizzazione di forum di cui ho già parlato in qualche post su questo blog.

L’aspetto negativo di Disqus è che si affidano i commenti del proprio blog ad una piattaforma esterna, perdendone il controllo e con implicazioni non trascurabili per la privacy dei propri visitatori.

Per quanto concerne Discourse, che è un software straordinario per la sua categoria, il problema è che potrebbe essere spropositato se l’unico utilizzo che se ne vuole fare è quello di ospitare dei commenti ad un sito/blog.

Isso

Se non si vogliono regalare soldi (e dati preziosi) a Disqus e non si vuole l’onere di gestire e amministrare un’installazione di Discourse, si può ricorrere a delle alternative un po’ più semplici e leggere, al prezzo di dover smanettare un po’ con la riga di comando.

Tra le diverse soluzioni che ho avuto modo di provare ci sono le seguenti:

  • Commentics: sistema di gestione di commenti scritto in PHP
  • schnack: leggero e anch’esso realizzato con JavaScript/Node.js
  • Isso: sistema di commenti fatto con Python e JavaScript

Dopo una serie di prove, alla fine ho optato per Isso, che è risultato essere il sistema più facile da far funzionare. Attenzione: si tratta di un software funzionante, ma tuttora in fase di sviluppo e non certamente perfetto. Tuttavia, con le dovute accortezze, può andare bene per siti piccoli e con pochi visitatori. Il backend di archiviazione dei commenti è infatti un database SQLite3, che offre buone performance finché i dati da memorizzare sono relativamente contenuti.

Installazione e configurazione

Come accennato, Isso è scritto in Python con un frontend in JavaScript. Pertanto per l’installazione, non essendo sempre disponibili pacchetti precompilati aggiornati per tutte le distribuzioni, conviene utilizzare pip e un virtualenv dedicato. Inoltre, per l’installazione di tutte le dipendenze, serviranno anche un compilatore C ed alcune librerie.

Assumendo di usare un sistema Ubuntu Server (io sto usando la versione 20.04), partiamo proprio dall’installazione dei pacchetti necessari:

sudo apt install python3-venv build-essential python3-dev sqlite3

Per motivi di maggiore sicurezza, installiamo ed eseguiamo Isso con un utente non privilegiato, diverso da quello che esegue il servizio Ghost. Per esempio potremmo creare l’utente ‘isso’ e, una volta loggati come tale utente, procediamo alla creazione del virtual environment Python e all’installazione dei pacchetti:

python3 -m venv isso_env
source isso_env/bin/activate
pip install wheel
pip install isso
pip install gunicorn

Le cose da fare successivamente sono le seguenti:

  1. decidere dove memorizzare il database dei commenti e il file di log
  2. creare il file di configurazione del backend
  3. modificare il template post.hbs del tema Ghost in uso (nel mio caso Casper)
  4. configurare il server web per accedere al backend
  5. creare e attivare la service unit per avviare isso in maniera non interattiva, eventualmente al boot

Per quanto riguarda il punto 1, avendo creato un utente dedicato possiamo utilizzare la home directory di quell’utente; per il db useremo il file comments.db e per i log il file isso.log.

Per quanto riguarda la configurazione del backend, ovvero l’applicazione che gestirà il database e interagirà con la parte client, seguendo la documentazione si può usare qualcosa del genere:

[general]
name = ghost_comments
host = <url del sito su cui presentare i commenti>
dbpath = /home/isso/comments.db
max-age = 1m
notify = smtp
log-file = /home/isso/isso.log
reply-notifications = false
gravatar = true
[moderation]
enabled = true
purge-after = 5d
[server]
listen = http://localhost:8000
[smtp]
username = <nome utente smtp>
password = <password smtp>
host = <server smtp>
port = 465
security = ssl
to = <destinatario notifiche>
from = "Isso Comment" <mittente notifiche>
timeout = 15
[guard]
enabled = true
ratelimit = 4
direct-reply = 10
reply-to-self = false
require-author = true
require-email = false
[admin]
enabled = true
password = <password accesso pannello admin>

Avendo salvato la configurazione nel file isso.cfg, dopo aver attivato il virtual environment è possibile mettere in esecuzione il backend di Isso col comando:

isso -c isso.cfg run

Questa modalità va bene per i test; più avanti vedremo come lanciare Isso tramite systemd.

La configurazione lato client va fatta modificando il template del tema Ghost in uso, in particolare nel file del template che mostra i singoli post, ovvero post.hbs. In questo file c’è già un placeholder per la sezione commenti:

{{!--
<section class="post-full-comments">
    If you want to embed comments, this is a good place to do it!
</section>
--}}

Per mostrare i commenti e la form di inserimento, sostituiamo quel blocco con il seguente codice:

<script data-isso="//url_sito/ghost_comments"
        data-isso-id="isso-thread"
        data-isso-lang="it"
        data-isso-reply-to-self="false"
        data-isso-require-author="true"
        data-isso-require-email="false"
        data-isso-max-comments-top="10"
        data-isso-max-comments-nested="5"
        data-isso-reveal-on-click="5"
        data-isso-avatar="false"
        data-isso-gravatar="true"
        src="//url_sito/ghost_comments/js/embed.min.js">
</script>
<section id="isso-thread" class="post-full-comments">
</section>

Per il significato delle singole opzioni vi rimando al sito del progetto, però vi faccio notare che i valori di alcune di esse devono essere coerenti tra backend e frontend; in particolare data-isso-reply-to-self, data-isso-require-author, data-isso-require-email nel frontend devono avere lo stesso valore assegnato a reply-to-self, require-author e require-email nella configurazione del backend.

La configurazione proposta fa sì che il backend sia in ascolto solo localmente sulla porta 8000/tcp. Per permettere l’accesso al sistema di commenti, sarà necessario fare una piccola modifica al file di configurazione del server web (NGINX). L’idea è quella di servire il backend con lo stesso hostname del blog Ghost, ma nella location /ghost_comments. Pertanto si dovrà aggiungere al file di configurazione del virtual host che serve Ghost la seguente porzione:

location /ghost_comments {
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header Host $http_host;
         proxy_pass http://127.0.0.1:8000;
 }

A questo punto, avendo avviato isso e riavviando sia nginx che ghost, se si va a visitare uno dei post del blog dovrebbe comparire la form per l’inserimento dei commenti:

Screenshot di un post con la form dei commenti di Isso
Immagine di come appare la form dei commenti di Isso in un post di Ghost

A questo punto si può fare qualche test di inserimento di commenti per vedere se tutto funziona.

Avendo configurato con l’opzione “guard” abilitata, tutti i commenti dovranno essere approvati manualmente dall’amministratore. Per farlo ci sono due modi differenti:

  1. cliccare sul link di approvazione contenuto nella mail di notifica che, ogni volta che viene aggiunto un commento, viene inviata all’indirizzo specificato nel file di configurazione;
  2. entrare nell’area di amministrazione del backend, se abilitata (sezione “admin” nel file di configurazione).

Per accedere all’area di amministrazione, si deve visitare l’indirizzo <url_sito>/ghost_comments/admin e, dopo aver inserito la password (anch’essa definita nel file di configurazione del backend), ci si troverà davanti a un semplice pannello per la gestione dei commenti:

Pannello amministrazione commenti Isso
Pannello gestione commenti di Isso

Per ciascun commento è possibile decidere se approvarlo (validate), cancellarlo oppure modificarlo.

Se tutto funziona come atteso, possiamo configurare la service unit di systemd che farà partire Isso automaticamente all’avvio. Per questo, anziché lanciare direttamente il comando isso, ci faremo aiutare da Gunicorn, anch’esso installato nel virtual environment di Isso.

[Unit]
Description=Isso Comments for Ghost
After=network.target
[Service]
Type=notify
User=isso
Group=isso
Environment="ISSO_SETTINGS=/home/isso/isso.cfg"
WorkingDirectory=/home/isso
ExecStart=/home/isso/isso_env/bin/gunicorn -b localhost:8000 -w 4 --preload isso.dispatch
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
[Install]
WantedBy=multi-user.target

Dopo aver salvato questo file in /ets/systemd/system/isso.service, eseguiamo quanto segue:

sudo systemctl daemon-reload
sudo systemctl enable isso
sudo systemctl start isso

A questo punto il servizio isso è attivo e configurato per partire all’avvio del sistema.

Conclusioni

La resa grafica e le funzioni di questo sistema di commenti non sono particolarmente attraenti, tuttavia è ciò di cui avevo bisogno per poter gestire in modo decente i commenti sul sito Ghost. Il software va tenuto sott’occhio, perché come ho detto non è ancora particolarmente maturo e ha delle caratteristiche che rendono la configurazione un po’ ambigua in certi punti.

Da oggi inizio i test sul sito pubblico; aggiornerò questo post in caso di anomalie o miglioramenti.