Come dicevo la volta scorsa, Jekyll non ha un sistema di commenti integrato, ma i suoi temi permettono spesso di gestire i commenti collegandosi a servizi di terze parti, come Disqus e simili.
Il problema di questi servizi è che possono smettere di funzionare da un giorno all’altro (vedi il caso di Muut, che non ha più nemmeno un sito web), oppure hanno regole opache di utilizzo e di raccolta dei dati dell’utente.
Un altro problema niente affatto trascurabile è che la maggior parte di questi servizi richiedono all’utente di registrarsi prima di commentare. La registrazione è utile per filtrare i commenti inopportuni o lo spam, ma è anche una barriera per il lettore casuale del post che voglia dire la sua.
C’è poi la questione del costo. Alcuni servizi di gestione di commenti sono a pagamento e non sono nemmeno economici, vedi il caso di Hyvor Talk che costa 12 euro al mese. Prezzo più che accettabile per un sito professionale o per una piccola azienda che voglia interagire con i suoi utenti – tanto più che spesso questi servizi gestiscono anche l’invio di newsletter e materiale pubblicitario vario – ma decisamente fuori scala per un blog fatto in casa come questo.
Alla ricerca del sistema ideale
Il mio interesse verso le questioni relative ai commenti è nato un anno fa quando, dopo la chiusura improvvisa di Muut, ho osservato l’enorme lavoro svolto dietro le quinte da Mimmo, MacMomo e Paoloo, per recuperare da Muut tutti i commenti di Quickloox – uno dei blog imprescindibili per chi si interessa di Apple, Mac e dintorni – per poi convertirli nel formato del nuovo motore dei commenti e reinserirli in bell’ordine nel blog.1
Pochi mesi dopo ho messo in cantiere il passaggio da Wordpress Jekyll, e quello dei commenti era uno dei problemi principali da risolvere. Su Wordpress il problema non si pone, i commenti sono integrati e vengono salvati nel database del sito insieme al testo dei post. Ma quando si usa un sito statico, come quello generato da Jekyll, bisogna implementare qualche meccanismo per innestarvi sopra i commenti, che per la loro stessa natura sono degli oggetti dinamici.
Con il senno di poi, avrei potuto seguire i consigli di Mimmo e scegliere Comma fin dal primo momento. Ma arrivavo da Wordpress e l’idea di usare un database mi sembrava la più naturale.
E allora ho provato Cusdis, Commento, Commento++, Remark42, Zooment, tutti sistemi di commenti basati su un database.1 Ho seguito passo passo le istruzioni, ho usato Docker, ho usato una macchina virtuale sul cloud con Linux, ho provato servizi che dovrebbero fare tutto da soli come Railway o Vercel. Niente da fare, ci fosse stato un sistema di commenti che funzionava come si deve!2
Esclusi a priori tutti i sistemi che si appoggiano a GitHub, come Giscus, Staticman o utterances, perfetti per gli sviluppatori che hanno già di sicuro un account, ma poco pratici per il lettore occasionale costretto a crearne un altro inutile, ne restava solo uno. Ovviamente Comma.
Al lavoro su Comma
E Comma è stato. Comma è scritto in Go e viene distribuito solo in formato sorgente. Per compilarlo serve quindi un compilatore per il linguaggio Go. Sul Mac il compilatore si installa scaricando il package preconfezionato e seguendo le istruzioni, oppure tramite il solito Homebrew,
$ brew install golang
Analogamente, su Linux Go si installa scaricando un file compresso ed estraendolo nella directory usr/local
, oppure tramite i comandi del package manager della propria distribuzione,
$ sudo apt install golang
$ sudo dnf install golang
$ sudo pacman -S go
a seconda che usiamo Debian/Ubuntu, Fedora/CentOS, Arch, o uno degli infiniti derivati.
Una volta installato Go, compilare Comma è questione di un attimo,
$ git clone https://github.com/Dieterbe/comma.git
$ cd comma/src
$ go build
dove l’ultimo comando serve per controllare che il programma venga compilato correttamente. Se è tutto a posto, si può eseguire
$ go install .
che in un solo colpo compila il sorgente ed installa l’eseguibile comma
in ~/go/bin/
(come al solito la ~
rappresenta la Home
dell’account che stiamo usando).
Io prima di clonare il repository di Comma ho fatto un fork nel mio account personale, ma solo perché volevo cambiare qualcosetta nel codice.
La prima cosa che ho fatto è stata quella di cambiare l’estensione dei file dei commenti, da .cmt
a .xml
(linee 67 e 105 del mio file comment.go
). I commenti sono infatti dei file XML, e non c’era ragione di usare una estensione non standard. In più, questa modifica permette di aprirli più facilmente con un editor di testo, che li formatta automaticamente in modo leggibile. Una piccola comodità, molto utile durante la fase di sviluppo. Sempre per aumentare la leggibilità, ho anche aggiunto 4 spazi prima di ogni tag XML (linea 71-73 di comment.go
).
Infine, ho rimosso l’obbligo di inserire l’indirizzo email di chi scrive il commento (linee 94-96 di main.go
). Volevo infatti un sito privo di qualunque forma di tracciamento degli utenti, evitando tanti grattacapi con la GPDR.3 In teoria, ciò può presentare qualche rischio a livello di sicurezza, ma davvero pensiamo che chi vuole fare dei danni inserisca la sua vera email?
Per quanto riguarda il frontend, cioè come l’utente vede il suo nuovo commento e la lista dei commenti precedenti, qui ho trasportato su Jekyll la gran parte del codice originale dell’autore di Comma, aggiungendo il supporto a Markdown e ripulendo il commento dal codice potenzialmente malevolo inserito nel testo. Per queste due ultime funzionalità ho tratto molta ispirazione dal codice scritto da Mimmo, MacMomo e Paoloo per Quickloox.
In quanto alle icone associate a ciascun commentatore, ho preferito farle generare da Jdenticon, forse perché le sue strutture geometriche simmetriche si adattano meglio alla mia personalità.
L’aspetto finale dei commenti mi pare piuttosto gradevole e ben integrato con il resto del sito, e anche la localizzazione funziona bene, anche in dettagli minimi come la riga sottile più in evidenza sotto “Aggiungi un commento”, che cambia a seconda che la scritta sia in italiano o in inglese.
Tutto il codice del frontend è in _includes/custom/comma-comments.html
. Già che c’ero, ho aggiunto alla pagina dei post (_layouts/post.html
), una piccola funzione in JavaScript che permette di tornare con un click in testa al post. A me serviva in fase di sviluppo, ma credo che possa essere utile anche a chi legge l’articolo, per cui l’ho lasciata nel codice finale.
Mettere tutto insieme
Una volta pronto sia il sistema di commenti che il codice per visualizzarli sul sito, bisogna far funzionare tutto assieme. Per prima cosa dobbiamo creare una cartella dove salvare tutti i commenti,
$ cd
$ mkdir ~/comments
poi attivare Comma a mano,
$ ~/go/bin/comma ~/comments localhost:5888
$
istruendolo a mettersi in attesa dei nuovi commenti sulla porta 5888
del computer locale localhost
, salvandoli nella cartella ~/comments
. Infine, dobbiamo aggiungere in _config.yml
una riga che connetta Jekyll al server dei commenti,
#--- Comma comments ---
commentserver: http://localhost:5888
e tutto dovrebbe funzionare al primo colpo. Se invece di un computer fisico stiamo usando una macchina virtuale sul cloud, al posto di localhost
dovremo usare il reverse DNS name
della macchina (si veda l’articolo precedente), ma i dettagli di come si fa dipendono dal servizio usato, per cui non posso essere più preciso.
In un sito reale le cose diventano un po’ più complesse, ad esempio perché bisogna utilizzare il protocollo sicuro https:
al posto del semplice http:
, e questo richiede di configurare per bene il server web. Ma anche in questo caso i dettagli dipendono dal server web utilizzato, dalla configurazione dei servizi installati e così via, per cui è impossibile dire di più senza scrivere un intero manuale d’uso.
Quello che posso dire, invece, è che un sito vero richiede che Comma parta automaticamente, esattamente come succede al server web che gestisce il sito.
Assumendo che il sito giri su un server Linux (nel prossimo articolo spiegherò perché non ha molto senso usare un Mac come server web) e che Comma sia stato installato dall’utente webuser
, per far partire Comma automaticamente ad ogni riavvio del sistema operativo (ma anche quando per qualche motivo il programma viene interrotto), dobbiamo eseguire
$ cd /etc/systemd/system
$ sudo touch comma.service
creando il file di configurazione comma.service
vuoto, per poi inserire in questo file le righe seguenti,
[Unit]
Description=comma backend server
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/home/webuser/go/bin/comma /home/webuser/comments :5888
Restart=always
RestartSec=1
User=webuser
Group=webuser
[Install]
WantedBy=graphical.target
ricordandosi di sostituire a webuser
il nome dell’utente che ha installato Comma. A questo punto,
$ sudo systemctl enable comma
attiva il meccanismo di avvio automatico che ci permetterà, da ora in poi, di dimenticarci (o quasi) dell’esistenza di Comma. Per interagire manualmente con il servizio si usano i comandi,
$ sudo systemctl status comma
$ sudo systemctl stop comma
$ sudo systemctl start comma
che servono rispettivamente ad interrogare lo stato del servizio, oppure a fermare e a riavviare a mano Comma. Sono comandi molto utili in fase di debugging, ma possono servire a volte anche in produzione, per cui è bene sapere che esistono.
Conclusioni
Avevo pensato di concludere qui questo viaggio nella descrizione tecnica del nuovo sito, ma mentre scrivevo questo articolo mi sono accorto che qualche parola sull’hosting potrebbe essere utile. E proprio questo sarà l’argomento della prossima puntata.
-
E nemmeno un database piccolo come SQLite! Tutti questi sistemi di commenti usano pesi massimi come MariaDB o PosgreSQL. ↩ ↩2
-
Se fossi cattivo potrei pensare che le istruzioni fossero sbagliate apposta per spingermi ad usare le loro soluzioni cloud a pagamento. Ma io sono buono. ↩
-
Non ho niente contro la GPDR, anzi la trovo una normativa utilissima, almeno in teoria. Nella pratica, però, fa poco per tutelare davvero la privacy degli utenti, riducendosi nei fatti in un poco utile appesantimento burocratico. ↩