Migra un forum del plugin bbPress di WordPress su Discourse

Ho recentemente eseguito con successo una migrazione del database bbPress utilizzando lo script di migrazione integrato di Discourse. Ora condividerò una guida passo dopo passo.

Nota: Questa guida è per il plugin bbPress, non per la versione standalone legacy di bbPress.

Quali dati possono essere importati?

  • Utenti (inclusi gli utenti anonimi)
  • Categorie
  • Argomenti
  • Post
  • Messaggi privati (tramite BuddyPress)
  • Allegati
  • Permalink

Prima di iniziare la migrazione, configura un ambiente di sviluppo sulla tua macchina (o all’interno di una macchina virtuale) ed esegui l’importazione lì invece che all’interno del contenitore Docker. Quando ho provato a eseguirlo all’interno del contenitore Docker ho ricevuto l’errore peer authentication failed. Ti consiglio quindi vivamente di utilizzare una macchina di sviluppo. Consulta la guida all’installazione per lo sviluppo su macOS o Ubuntu / Debian.

Discourse richiede Ruby 3.4+. Puoi verificare la versione di Ruby con:

ruby -v

Ora dobbiamo installare la dipendenza libmysqlclient-dev per poter utilizzare il gem mysql2.

sudo apt-get install libmysqlclient-dev

Dopo l’installazione riuscita, vai al percorso di installazione di sviluppo di Discourse (tipicamente ~/discourse).

cd ~/discourse

Configurazione della connessione al database

Lo script di importazione bbPress legge tutte le impostazioni di connessione al database dalle variabili d’ambiente. Non è necessario modificare il file dello script. Sono supportate le seguenti variabili d’ambiente:

Variabile Predefinito Descrizione
BBPRESS_HOST localhost Host del database MySQL
BBPRESS_USER root Nome utente MySQL
BBPRESS_PW (vuoto) Password MySQL
BBPRESS_DB bbpress Nome del database MySQL
BBPRESS_PREFIX wp_ Prefisso delle tabelle WordPress
BBPRESS_ATTACHMENTS_DIR /path/to/attachments Percorso della directory degli allegati bbPress

Se stai migrando il database da localhost di solito hai solo bisogno di impostare il nome del database:

IMPORT=1 bundle && IMPORT=1 BBPRESS_DB="my_bbpress" bundle exec ruby script/import_scripts/bbpress.rb

Se stai migrando il database da un server esterno dovrai anche impostare l’host, il nome utente e la password:

IMPORT=1 bundle && IMPORT=1 BBPRESS_HOST="NOME_HOST_REMOTO" BBPRESS_USER="NOME_UTENTE_DB" BBPRESS_PW="LA_TUA_PASSWORD_SECURA" BBPRESS_DB="NOME_DB" bundle exec ruby script/import_scripts/bbpress.rb

Congratulazioni! Il tuo database è stato migrato con successo da bbPress a Discourse :clap: :wave: :boom:

Ora crea un backup dalla pagina di amministrazione /admin/backups e importalo nel tuo sito Discourse live.


Dopo aver spostato il tuo forum bbPress su Discourse, se intendi ancora utilizzare il tuo sito WordPress come sito principale e desideri collegarlo a Discourse, installa il plugin ufficiale WordPress di Discourse.

15 Mi Piace

Just wanted to thank you for providing this step-by-step guide. We migrated our site from bbpress to Discourse with minimal headache thanks to you. Since we’re running multisite wordpress there were a few tweaks to make to the importer, but other than that it went very smoothly. Thanks!

3 Mi Piace

If you can share your tweaks then it will be helpful to other multisite owners.

1 Mi Piace

Admittedly I didn’t take very good notes, and have since killed the VM it
was on (sorry!) but the basic gist is that if your bbpress install is not
on the primary site of the Multisite setup you’ll need to a) set the
environmental variable for BBPRESS_PREFIX to include your site’s ID number
(e.g. wp_6_ ) and then edit the migration script to use wp_users rather
than #{BBPRESS_PREFIX} for the Users sql. This is because on Multisite
installations the wp_users table is shared across sites and then each site
has its own tables for posts, postmeta, etc.

5 Mi Piace

thanks for the details :thumbsup:

I recently posted on how to import bbpress into discourse

2 Mi Piace

Great job on the tutorial! But it’s confusing to have two different guides on this. Do they serve different purposes? Otherwise we should figure out how to merge them.

That guide is about how to import bbpress inside of a development environment, mine is how to import bbpress using the docker container. It’s just 2 different ways to go. I’d recommend importing via docker container since it doesn’t ask for the additional step of setting up a development environment, which can be cumbersome.

Hello I am stuck trying to import successfully after all users are done importing.

As soon it begins to import anonymous users it cancels with an error of “Invalid Email… and Validation failed: Username can’t be blank (ActiveRecord::RecordInvalid)”.

I added the error below, does anyone encountered this before or have any ideas on what I should do?

Thanks,

importing anonymous users...
Invalid email '' for ''. Using '6be92499a6f885cb271d94bffd5e667b@email.invalid'
Error on record: {:id=>"", :email=>"", :name=>"", :website=>nil}
Traceback (most recent call last):
	23: from script/import_scripts/bbpress.rb:512:in `<main>'
	22: from /home/lutechi/discourse/script/import_scripts/base.rb:49:in `perform'
	21: from script/import_scripts/bbpress.rb:31:in `execute'
	20: from script/import_scripts/bbpress.rb:153:in `import_anonymous_users'
	19: from /home/lutechi/discourse/script/import_scripts/base.rb:249:in `create_users'
	18: from /home/lutechi/discourse/script/import_scripts/base.rb:249:in `each'
	17: from /home/lutechi/discourse/script/import_scripts/base.rb:261:in `block in create_users'
	16: from /home/lutechi/discourse/script/import_scripts/base.rb:337:in `create_user'
	15: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:212:in `transaction'
	14: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:267:in `transaction'
	13: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/transaction.rb:236:in `within_new_transaction'
	12: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
	11: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/transaction.rb:239:in `block in within_new_transaction'
	10: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:267:in `block in transaction'
	 9: from /home/lutechi/discourse/script/import_scripts/base.rb:338:in `block in create_user'
	 8: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/suppressor.rb:48:in `save!'
	 7: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:315:in `save!'
	 6: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:385:in `with_transaction_returning_status'
	 5: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:212:in `transaction'
	 4: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:265:in `transaction'
	 3: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:387:in `block in with_transaction_returning_status'
	 2: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:315:in `block in save!'
	 1: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/validations.rb:52:in `save!'
/home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Username can't be blank (ActiveRecord::RecordInvalid)

Grazie per questo utile tutorial: ha funzionato per me, anche se ho riscontrato un paio di piccoli problemi:

  1. Il processo di installazione sembra aver installato PostgreSQL 11, mentre la versione supportata da Discourse è la 10, il che sta creando qualche grattacapo!

  2. Gli utenti importati non sembrano poter accedere a Discourse con le credenziali di WordPress: ho provato con il mio account, sia usando il nome utente che l’indirizzo email, ma nessuno dei due funziona. Posso accedere regolarmente a WordPress e l’account utente è presente in Discourse, con i relativi thread del forum. Forse qualcosa è cambiato per quanto riguarda le password o l’autenticazione?

Stai utilizzando SSO da WordPress?

Questo richiede il plugin migrate password. L’hai installato?

3 Mi Piace

Ciao Michael,

No, questa è la prima volta che trovo un riferimento al plugin, quindi grazie per averlo evidenziato. Forse ho saltato qualche passaggio!

Grazie per la condivisione, darò un’occhiata più da vicino domani, quando non sarò così stanca!

Ruth

3 Mi Piace

Ciao :waving_hand:

Anche le immagini caricate dagli utenti possono essere migrate?
Il plugin per i caricamenti degli utenti era GD bbPress Attachments

Saluti :beers:

Lo script sembra importare gli allegati.

È necessario impostare una variabile d’ambiente BB_PRESS_ATTACHMENTS_DIR con il percorso degli allegati.

1 Mi Piace

I caricamenti del plugin bbPress sembrano essere memorizzati nella cartella /uploads dell’installazione di WordPress. Per questo è stato utilizzato GD bbPress Attachments. Non sono sicuro di quale tipo di percorso inserire nella variabile BB_PRESS_ATTACHMENTS_DIR. Potresti aiutarmi un po’? Dovrei inserire il percorso URL completo dei caricamenti, ad esempio http://www.example.com/httpdocs/wp-content/uploads/2018/02/picture.png, o qualcos’altro?

Ho notato che lo script di importazione non è terminato con successo poiché la fase import_private_messages ha fallito. I messaggi privati non erano attivati nel forum. Ho rimosso quella fase dallo script e ora fallisce con il messaggio: table wp_bb_attachments doesn't exist, il che è vero. Non riesco però a trovare alcuna tabella per gli allegati nel database. Come avrebbero potuto funzionare quegli allegati in primo luogo? :thinking:

Gli allegati devono trovarsi in una directory sul server dove esegui l’importazione.

Se non vedi la tabella degli allegati che lo script sta cercando, potrebbe essere perché hai utilizzato un metodo diverso per gestire gli allegati rispetto a quanto previsto dallo script. Immagino che siano o in una tabella diversa che non hai ancora individuato, oppure che il nome del file relativo sia contenuto direttamente nei post.

Sembra che tu abbia bisogno di un’altra funzione per importarli. Se hai un budget, posso aiutarti. Redirecting… contiene informazioni sulle importazioni. Non sembra che tu abbia bisogno del servizio completo, quindi il costo sarà inferiore rispetto a quanto indicato lì.

Poiché Discourse viene sempre eseguito in un contenitore Docker, questa directory dovrebbe essere collegata al contenitore di importazione?

Corretto. Se stai eseguendo l’importazione da un container, devi collocare quelle immagini in una posizione accessibile dal container e utilizzare quel percorso.

1 Mi Piace

Un’ultima domanda. Dato che hai menzionato il tuo servizio di importazione, ho controllato il sito e approfondito il mio database, individuando dove sono archiviati gli allegati. Una frase nella tua pagina mi ha fatto un po’ preoccupare:

Ad esempio, alcuni forum possono allegare file a un post senza menzionarli nel corpo del messaggio; lo script di importazione identifica gli allegati sostituendo i riferimenti ad essi nel corpo del messaggio; quando ciò accade, gli allegati non collegati vengono omessi.

Ho scoperto che i miei allegati sono archiviati nella tabella wp_postsmeta come _wp_attached_file. Il post stesso, che aveva questo allegato collegato, non contiene però alcuna menzione nel corpo del messaggio. Sembra che l’unico collegamento qui sia tra post_id e il suo meta_id. Significa che si tratta di un “allegato non collegato” e che verrà omesso?