Installiamo e proviamo NodeBB

Questo articolo è dedicato all’installazione di NodeBB, un software alternativo a Discourse, su un sistema Ubuntu 18.04.

In un precedente articolo ho scritto due righe a proposito di Discourse, un software open source per realizzare community forum. Discourse è largamente usato sia per ospitare community di varie dimensioni che per realizzare sistemi di help desk, knowledge base e wiki.

Una delle critiche che viene spesso mossa a Discourse è quella di essere un po’ pesante in termini di risorse computazionali richieste. Infatti viene raccomandato di installare il software su un sistema con doppia cpu che abbia almeno 1GB di RAM + swap. Questi requisiti, soprattutto se si vuole realizzare un semplice forum con pochi utenti e poco traffico, possono sembrare esagerati.

Rimanendo sempre nell’ambito del software libero e open-source, un’alternativa più leggera a Discourse è sicuramente rappresentata da NodeBB, un software che all’apparenza è molto simile ma che è realizzato usando tecnologie del tutto differenti. Vediamole rapidamente:

Discourse

  • Linguaggio: Ruby
  • Backend: Ruby on Rails
  • Frontend: HTML + JavaScript
  • Database: PostgreSQL
  • Installazione via Docker
  • Web Server: NGINX (default)

NodeBB

  • Linguaggio: JavaScript
  • Backend: Node.js
  • Frontend: HTML + JavaScript
  • Database: MongoDB (altri, via plugin)
  • Docker non necessario
  • Web Server: NGINX (raccomandato)

Per entrambi i software si può usare NGINX come web server; quando si installa Discourse con Docker (che è l’unica modalità ufficialmente supportata), la configurazione del server web avviene automaticamente come parte dell’installazione. Quando si installa NodeBB, essendo il procedimento non automatizzato, l’installazione e configurazione del server web vanno fatte manualmente.

Procedimento di installazione di NodeBB

Per avere NodeBB pronto e funzionante, è necessario installare e configurare i diversi componenti che costituiscono il sistema, ovvero:

  1. Node.js
  2. MongoDB
  3. NodeBB
  4. NGINX (o altro server web con funzione di reverse proxy)

Il sistema operativo raccomandato per NodeBB è Ubuntu Server 18.04.

Node.js

Al momento in cui scrivo, la versione più recente di Node.js è la 15.x, ma la LTS (Long Term Support) è ancora la 14.x. La modalità di installazione raccomandata è quella di usare il repository NodeSource.

Supponendo di essere ‘root’, i comandi per installare Node.js sono i seguenti:

curl -sL https://deb.nodesource.com/setup_14.x | bash -
apt-get install -y nodejs

MongoDB

Il database di default previsto da NodeBB è MongoDB, che non è il tradizionale database relazionale ma è un database di tipo NoSQL, quindi la sua gestione può risultare ostica a chi è abituato a MySQL/MariaDB e PostgreSQL.

La versione LTS di MongoDB (community-edition) attualmente disponibile è la 4.4, e la installiamo configurando gli appositi repository nel seguente modo:

sudo apt-get install gnupg
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org

Se si eseguono i comandi come utente ‘root’, non è ovviamente necessario usare sudo.

Una volta installato, il server MongoDB non viene impostato per l’avvio automatico, per cui dobbiamo provvedere a modificare questa impostazione:

systemctl enable mongod.service
systemctl start mongod.service

La configurazione di default prevede che il server stia in ascolto sulla porta TCP/27017 dell’interfaccia localhost.

Dopo l’avvio del servizio, dobbiamo provvedere a configurare un utente amministratore e, successivamente, un utente non privilegiato per l’accesso al database previsto per NodeBB. I seguenti comandi servono proprio a questo scopo (il carattere # rappresenta l’inizio di un commento e non è parte del comando):

mongo # invoca la shell di mongodb
use admin # accede al database admin
db.createUser( { user: "admin", pwd: "<Enter a secure password>", roles: [ { role: "root", db: "admin" } ] } )

Ovviamente bisognerà indicare una password robusta per il campo pwd. Continuando sempre nella shell di mongodb:

use nodebb # crea il database nodebb, se non esiste
db.createUser( { user: "nodebb", pwd: "<Enter a secure password>", roles: [ { role: "readWrite", db: "nodebb" }, { role: "clusterMonitor", db: "admin" } ] } )
quit()

Nel mio caso, prevedendo di installare più istanze di NodeBB sullo stesso server, ho usato ‘nodebb1’ come utente e nome database al posto del semplice ‘nodebb’.

Ora è necessario modificare leggermente la configurazione di MongoDB per utilizzare l’autenticazione. Per farlo, basta inserire le seguenti righe nel file /etc/mongod.conf e riavviare il servizio.

security:
  authorization: enabled

Installare NodeBB

Installati i prerequisiti, è ora giunto il momento di installare il software NodeBB vero e proprio. Per farlo non useremo l’utente root, ma procederemo come utente non privilegiato. Potete creare un utente apposito per ciascuna istanza di NodeBB che intendete eseguire. Nel mio caso userò l’utente chiamato nodebb1. L’installazione del software avverrà nella directory /srv/nodebb/nodebb1.

Dopo essermi loggato come utente nodebb1 ed essere entrato nella directory di destinazione prescelta, procedo al clone del repository Git di NodeBB; il branch corrente è il 1.16.x.

git clone -b v1.16.x https://github.com/NodeBB/NodeBB.git nodebb
cd nodebb

A questo punto è possibile eseguire lo script di setup col comando:

./nodebb setup

Questo comando chiederà di inserire i dettagli per la connessione ad database, compresi username e password prescelti, e poi chiederà di configurare un account amministratore del forum e la URL alla quale il forum dovrà rispondere. Questa URL deve coincidere con quella che si userà nel browser per accedere al forum, quindi è la URL pubblica (normalmente dietro reverse proxy) e non quella sulla quale sarà in ascolto il servizio nodebb.

Al termine della procedura, per avviare NodeBB è sufficiente lanciare il comando

./nodebb start

Installare e configurare NGINX

Per quanto concerne NGINX, generalmente preferisco installare la versione mainline presente sul sito ufficiale al posto di quella inclusa nei repository della distribuzione in uso. Pertanto procedo come segue:

apt install curl gnupg2 ca-certificates lsb-release
echo "deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \     | tee /etc/apt/sources.list.d/nginx.list
curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -
apt-key fingerprint ABF5BD827BD9BF62
apt update
apt install nginx
systemctl enable nginx
systemctl start nginx

Gli ultimi due comandi servono ad avviare NGINX e a fare in modo che si avvii in automatico al reboot.

La configurazione del virtual host NGINX è abbastanza semplice e la si può mettere in un file .conf nella directory /etc/nginx/conf.d:

server {
     listen 80;
     server_name nodebb.example.com;
     location / {
         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_set_header Host $http_host;
         proxy_set_header X-NginX-Proxy true;
         proxy_pass http://127.0.0.1:4567;
         proxy_redirect off;
         # Socket.IO Support
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
    }
}

Ovviamente il nome a dominio ‘nodebb.example.com’ va sostituito con il nome a dominio usato per pubblicare il forum.

In questa prima configurazione manca la parte SSL, che aggiungiamo usando certbot e Let’s Encrypt:

snap install core
snap refresh core
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

A questo punto possiamo avviare nodebb (come utente normale nodebb, o nel mio caso nodebb1), riavviare nginx per attivare la nuova configurazione ed eseguire il comando certbot per ottenere il certificato SSL per il nostro forum:

sudo -u nodebb1 ./nodebb start
systemctl reload nginx
certbot --nginx

Certbot si occuperà di installare il certificato SSL e di riconfigurare il virtualhost NGINX per dirottare le connessioni direttamente sulla porta 443 dell’host.

Finalizzazione

Arrivati a questo punto, il forum dovrebbe essere raggiungibile via rete e dovrebbe essere possibile accedervi per portare a termine gli ultimi aspetti della configurazione come il titolo del forum, la descrizione e tutte le altre impostazioni di personalizzazione del software.

Prossimamente spero di poter scrivere un post per illustrare alcuni aspetti della configurazione che all’inizio possono risultare un po’ poco intuitivi. In fin dei conti, NodeBB è nuovo anche per me.

Riferimenti

Di seguito alcuni link alle risorse che ho consultato per realizzare questa breve guida: