Migrare un forum NodeBB con Redis a Discourse

Questa guida ti mostrerà come utilizzare NodeBB Importer per migrare un forum NodeBB alla piattaforma Discourse. Se il tuo forum NodeBB utilizza MongoDB come backend, segui questa guida. Non preoccuparti, è un processo semplice. Iniziamo.

Il piano

  • Preparazione dell’ambiente di sviluppo.
  • Esportazione del database dall’ambiente di produzione.
  • Importazione del database di produzione in un’istanza di Discourse.
  • Esecuzione dello script di importazione.

Quali dati possono essere migrati?

  • Gruppi
  • Categorie
    • Categoria radice => Categoria radice
    • Sottocategoria e sottocategoria di secondo livello => Sottocategoria
  • Allegati
  • Argomenti e Post
    • argomento fissato => argomento fissato
    • visualizzazioni dell’argomento
    • tutti gli stili verranno migrati correttamente, inclusi menzioni, emoji e allegati.
  • Utenti (con i seguenti attributi)
    • avatar (immagine del profilo)
    • sfondo del profilo
    • stato di sospensione
    • nome
    • nome utente
    • email
    • biografia
    • amministratore
    • sito web
    • località
    • data di registrazione
    • gruppo

Preparazione dell’ambiente di sviluppo locale

Configura il tuo ambiente di sviluppo seguendo una di queste guide:

Da ora in poi, ci riferiremo a questo ambiente come server Discourse.

:bulb: Si prega di utilizzare questa guida se riscontri problemi durante la configurazione di Discourse.

Esportazione del dump del database di produzione (dal server NodeBB):

Arresta il tuo forum. Questo è raccomandato da NodeBB.

$ cd /path_to_nodebb
$ ./nodebb stop

Dovresti anche arrestare Redis:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

Il tuo database del forum è contenuto in un unico file. Questo file viene generato automaticamente periodicamente da Redis. Di solito si trova in /var/lib/redis/dump.rdb. Inoltre, puoi ottenere il percorso dalla CLI di Redis:

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"
127.0.0.1:6379> exit
$ ls -la /var/lib/redis
# -rw-rw-r-- 1 redis redis 2664346 Aug 4 16:24 dump.rdb

:bulb: Se il tuo server Redis richiede una password, usa AUTH LA_TUA_PASSWORD.

:bulb: Se per qualche motivo non trovi il tuo file di database nel percorso previsto, puoi generarlo manualmente eseguendo SAVE all’interno della CLI di Redis.

Ora devi copiare gli allegati del forum:

$ cd /path_to_nodebb_root_folder/
$ tar -czf ./uploads.tar.gz ./public/uploads

Ora che hai il database e gli asset del forum, devi copiarli sul server Discourse.

Importazione del database

Se hai seguito le istruzioni per installare Discourse, dovresti avere il server Redis installato sul server Discourse:

$ redis-server -v
# Redis server v=5.0.2...

Ora devi arrestare il server Redis (importante).

Basato su Linux:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

Mac OS:

$ brew services stop redis
$ brew services list
# redis stopped

Ciò che devi fare ora è copiare il database del forum nel percorso locale del database Redis. L’importatore deve connettersi al server Redis e migrare il database NodeBB al database Discourse. Questo passaggio presuppone che tu non abbia dati importanti nel tuo database Redis; altrimenti, dovresti eseguire un backup.

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"

Controlla se ci sono file e prendi nota dell’utente corrente e dei permessi di dump.rdb:

$ ls -la /var/lib/redis

Copia il database NodeBB (sostituisci se ne esiste già uno):

$ cp dump.rdb /var/lib/redis

In seguito, quando provi a connetterti al server Redis, potresti ricevere l’errore Fatal error loading the DB: Permission denied; pertanto, dovresti modificare i permessi di dump.rdb:

# Sostituisci l'utente con quello annotato in precedenza.
$ sudo chown redis:redis /var/lib/redis/dump.rdb
$ sudo chmod 660 /var/lib/redis/dump.rdb

Ora devi estrarre uploads.tar.gz in un percorso a tua scelta:

$ tar xvzf uploads.tar.gz

Esecuzione dello script di importazione

Ora che il database è pronto, siamo pronti per eseguire lo script di importazione. Prima di ciò, dobbiamo modificare alcune configurazioni. Probabilmente dovrai cambiare solo le seguenti due righe.

Questo è il percorso della cartella degli allegati di NodeBB:

ATTACHMENT_DIR = '/percorso_assoluto/uploads'

Questo è il nome del database in Redis. Il valore predefinito è 0:

db: 0

Esegui l’importatore con Discourse pulito:

$ cd ~/discourse
$ bundle exec rake db:drop db:create db:migrate
$ bundle exec ruby script/import_scripts/nodebb/nodebb.rb

L’importatore si connetterà al server Redis e migrerà tutto nel database PostgreSQL di Discourse.

Dopo il completamento dell’importazione, avvia la piattaforma Discourse:

$ bundle exec rails server

Avvia Sidekiq per elaborare i dati migrati:

$ bundle exec sidekiq

Puoi monitorare l’avanzamento all’indirizzo http://localhost:3000/sidekiq/queues.

Esegui un backup di Discourse e caricalo sul tuo server di produzione di Discourse seguendo questa guida.

A questo punto, dovresti aver completato con successo la migrazione completa da NodeBB a Discourse :tada:
Se hai domande, sono felice di aiutarti :slight_smile:

9 Mi Piace

Continuo a insistere sulla mia migrazione in diversi thread :smiley:

Ho un forum su NodeBB con Redis e sono riuscito a completare il processo senza errori nella versione di sviluppo, ma ho ancora alcune domande:

  • Nello script di migrazione ho inserito correttamente il percorso assoluto dove avevo le immagini e i file del forum. Al termine della migrazione vedo che le immagini non sono visibili nei thread. In Discourse appaiono collegate nell’URL: assets/uploads, ma non c’è nulla lì.

    Nella versione di sviluppo ho risolto creando un link simbolico:
    ln -s path/to/images public/assets

    Ma nella versione di produzione, cosa devo fare per creare un link da assets/upload all’interno del docker alla cartella dove ho messo le vecchie immagini?

  • Sembra che tutti i thread del forum siano stati migrati correttamente, ma non vedo i messaggi diretti tra gli utenti… non sono nella migrazione?

  • Lo script non ha rilevato alcun avatar utente.

  • E infine, nel nuovo forum non vedo alcun embedding di video di Youtube o Twitts. Devo installare un plugin per questo?

Grazie mille per il tuo aiuto.

Non dovrebbe essere necessario. Se hai le tue immagini originali in un percorso, configurato in ATTACHMENT_DIR, Discourse creerà un caricamento (essenzialmente, una copia del file) in path-to-your-install/discourse/public/uploads/default/. Se controlli la tabella Uploads dovrebbe apparire così:

[1] pry(main)> Upload.last
  Upload Load (1.5ms)  SELECT "uploads".* FROM "uploads" ORDER BY "uploads"."id" DESC LIMIT 1
=> #<Upload:0x0000000109a460a0
 id: 196,
 user_id: 251468,
 original_filename: "Screenshot 2023-11-17 at 11.52.39.png",
 filesize: 25174,
 width: 398,
 height: 248,
 url: "/uploads/default/original/1X/2e5f7a09ba3bcd3a3597285771c53c16f20b18dd.png",
 created_at: Fri, 17 Nov 2023 19:12:47.455954000 UTC +00:00,
 updated_at: Fri, 17 Nov 2023 19:12:47.484137000 UTC +00:00,
 sha1: "2e5f7a09ba3bcd3a3597285771c53c16f20b18dd",

Corretto, sembra che lo script di nodebb non migri i messaggi privati. Puoi controllare altri script per vedere come vengono importati i messaggi privati, controlla ad esempio quello di Vanilla.

Gli avatar probabilmente non vengono caricati correttamente, probabilmente per lo stesso problema che hai menzionato sopra.

Non c’è bisogno di un plugin. Probabilmente devi rifare il rebake dei tuoi post. Puoi aspettare che sidekiq lo faccia automaticamente, oppure puoi eseguire un rebake completo dalla console:

rake posts:rebake

Lo script di nodebb non viene aggiornato da qualche anno, quindi la mia ipotesi è che alcune parti siano obsolete e debbano essere modificate affinché funzioni con i tuoi dati. Spero che questo aiuti!

1 Mi Piace