Migrar um fórum do plugin bbPress do WordPress para o Discourse

Recentemente, realizei com sucesso uma migração de banco de dados bbPress usando o script de migração integrado do Discourse. Agora, vou compartilhá-lo como um tutorial passo a passo.

Nota: Este tutorial é para o plugin bbPress, não para a versão autônoma legada do bbPress.

Quais dados podem ser importados?

  • Usuários (incluindo usuários anônimos)
  • Categorias
  • Tópicos
  • Publicações
  • Mensagens privadas (via BuddyPress)
  • Anexos
  • Links permanentes (Permalinks)

Antes de iniciar a migração, configure um ambiente de desenvolvimento em sua máquina (ou dentro de uma máquina virtual) e execute a importação ali, em vez de dentro do contêiner Docker. Quando tentei fazer isso dentro do contêiner Docker, obtive o erro peer authentication failed. Portanto, recomendo fortemente que você use uma máquina de desenvolvimento. Consulte o guia de instalação para desenvolvimento no macOS ou Ubuntu / Debian.

O Discourse requer Ruby 3.4+. Você pode verificar sua versão do Ruby com:

ruby -v

Agora, precisamos instalar a dependência libmysqlclient-dev para poder usar o gem mysql2.

sudo apt-get install libmysqlclient-dev

Após a instalação bem-sucedida, vá para o caminho da sua instalação de desenvolvimento do Discourse (geralmente ~/discourse).

cd ~/discourse

Configurando a conexão com o banco de dados

O script de importação do bbPress lê todas as configurações de conexão do banco de dados a partir de variáveis de ambiente. Você não precisa editar o arquivo do script. As seguintes variáveis de ambiente são suportadas:

Variável Padrão Descrição
BBPRESS_HOST localhost Host do banco de dados MySQL
BBPRESS_USER root Nome de usuário do MySQL
BBPRESS_PW (vazio) Senha do MySQL
BBPRESS_DB bbpress Nome do banco de dados MySQL
BBPRESS_PREFIX wp_ Prefixo das tabelas do WordPress
BBPRESS_ATTACHMENTS_DIR /path/to/attachments Caminho para o diretório de anexos do bbPress

Se você estiver migrando seu banco de dados do localhost, geralmente só precisa definir o nome do banco de dados:

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

Se você estiver migrando seu banco de dados de um servidor externo, também precisará definir o host, o nome de usuário e a senha:

IMPORT=1 bundle && IMPORT=1 BBPRESS_HOST="NOME_DO_SERVIDOR_REMOTO" BBPRESS_USER="NOME_USUARIO_BD" BBPRESS_PW="MINHA_SENHA_SEGURA" BBPRESS_DB="NOME_BD" bundle exec ruby script/import_scripts/bbpress.rb

Parabéns! Seu banco de dados foi migrado com sucesso do bbPress para o Discourse :clap: :wave: :boom:

Agora, faça um backup na página de administração /admin/backups e importe-o no seu site Discourse ao vivo.


Após mover seu fórum bbPress para o Discourse, se você ainda for usar seu site WordPress como site principal e quiser conectá-lo ao Discourse, instale o plugin oficial do WordPress para Discourse.

15 curtidas

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 curtidas

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

1 curtida

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 curtidas

thanks for the details :thumbsup:

I recently posted on how to import bbpress into discourse

2 curtidas

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)

Obrigado por este tutorial útil — funcionou para mim, embora eu tenha alguns pequenos problemas:

  1. O processo de instalação parece ter instalado o PostgreSQL 11, mas a versão hospedada do Discourse suporta o PostgreSQL 10, o que está causando um pouco de dor de cabeça!

  2. Os usuários importados não parecem conseguir fazer login no Discourse com suas credenciais do WordPress. Testei com minha própria conta, tanto usando o nome de usuário quanto o endereço de e-mail, mas nenhum dos dois funcionou. Consigo fazer login no WordPress sem problemas e a conta do usuário está presente no Discourse, com os tópicos do fórum associados. Talvez algo tenha mudado com as senhas ou autenticação?

Você está usando SSO do WordPress?

Isso requer o plugin migrate password. Você o instalou?

3 curtidas

Olá Michael,

Não, essa é a primeira referência que encontrei ao plugin, então obrigado por destacá-la — talvez eu tenha perdido algum passo em algum lugar! Obrigado por compartilhar, vou dar uma olhada mais de perto amanhã, quando meus olhos não estiverem tão cansados!

Ruth

3 curtidas

Olá :waving_hand:

As imagens enviadas pelos usuários também podem ser migradas?
O plugin para os uploads dos usuários foi o GD bbPress Attachments

Abraços :beers:

O script parece importar anexos.

Você precisa definir uma variável de ambiente BB_PRESS_ATTACHMENTS_DIR com o caminho para os anexos.

1 curtida

Os uploads do plugin bbPress parecem ser armazenados na pasta /uploads da instalação do WordPress. O GD bbPress Attachments foi usado para isso. Não tenho certeza de qual tipo de caminho devo colocar na variável BB_PRESS_ATTACHMENTS_DIR. Poderia me ajudar um pouco com isso? Devo colocar o caminho completo da URL para os uploads, por exemplo, http://www.example.com/httpdocs/wp-content/uploads/2018/02/picture.png, ou o quê mais?

Percebi que o script de importação não foi concluído com sucesso, já que a etapa import_private_messages falhou. Mensagens privadas não estavam ativadas no fórum. Removi essa etapa do script e ele falha com a mensagem: table wp_bb_attachments doesn't exist, o que é verdade. Não consigo encontrar nenhuma tabela para anexos no banco de dados, embora. Como esses anexos poderiam ter funcionado desde o início? :thinking:

Os anexos precisam estar em um diretório no servidor onde você executa a importação.

Se você não vir a tabela de anexos que o script está procurando, pode ser que você tenha usado algum método diferente para lidar com anexos do que o esperado pelo script. Minha suposição é que eles estejam ou em uma tabela diferente que você ainda não encontrou, ou que o nome do arquivo relativo esteja nos próprios posts.

Parece que você precisa de outra função para importá-los. Se tiver orçamento, posso ajudar. Redirecting… tem informações sobre importações. Parece que você não precisa do serviço completo, então seu custo será menor do que o sugerido lá.

Como o Discourse sempre roda em um contêiner Docker, esse diretório deve ser vinculado ao contêiner de importação?

Correto. Se você estiver executando a importação a partir de um container, precisa colocar essas imagens em um local acessível ao container e usar esse caminho.

1 curtida

Uma última pergunta. Como você mencionou seu serviço de importação, verifiquei o site e fiz uma investigação mais aprofundada no meu banco de dados, encontrando onde os anexos são armazenados. Uma frase na sua página me deixou um pouco preocupado:

Por exemplo, alguns fóruns podem anexar arquivos a uma postagem sem mencioná-los no corpo da mensagem; o script de importação identifica os anexos substituindo as referências a eles no corpo da mensagem; quando isso acontece, esses anexos não vinculados são omitidos.

Descobri que meus anexos estavam armazenados na tabela wp_postsmeta como _wp_attached_file. A própria postagem que tinha esse anexo vinculado, no entanto, não possui menção disso no corpo da postagem. Parece que a única ligação aqui é o post_id e seu meta_id. Isso significa que este é um “anexo não vinculado” e será omitido?