Migrar um fórum phpBB3 para Discourse

É possível importar fóruns phpBB para um fórum Discourse existente, ou seja, mesclá-los? Presumo que seja com base nas configurações sobre mapeamento de categorias.

Algum problema para se estar ciente?

Os usuários são mesclados se tiverem o mesmo endereço de e-mail?

1 curtida

sim. se você não fizer seu próprio mapeamento de categorias no arquivo de configurações, novas categorias serão criadas conforme necessário durante a importação. se já houver uma categoria existente no Discourse correspondendo a um nome de categoria do phpbb, as categorias serão mescladas.

ah, sim. aqui está um tópico detalhando o que encontrei. tenho algumas dicas e também um repositório com minhas atualizações combinadas para o importador.

não me lembro das condições exatas, mas sim, os usuários são mesclados automaticamente durante a importação.

2 curtidas

Tenho curiosidade em saber se é possível mesclar um fórum phpbb3 no Discourse, mantendo todos os tópicos importados como somente leitura. Pesquisei no tópico, mas não vi isso mencionado. Obrigado.

Você poderia modificar o script de importação para arquivar todos os tópicos criados, ou pode ser mais fácil simplesmente fazê-lo em massa após a execução do script. Veja Administrative Bulk Operations para exemplos.

2 curtidas

Olá,

Parece que estou encontrando um problema ao iniciar o importador. Parece acontecer durante a importação de usuários ou logo depois. Incluí o stack trace e um vídeo rápido de 20 segundos da saída.

Por favor, me avisem.

0x00007fe87a88bb10 /var/www/discourse/script/import_scripts/phpbb3/importers/user_importer.rb:87>}
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Name can't be blank (ActiveRecord::RecordInvalid)
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/validations.rb:53:in `save!'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:302:in `block in save!'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:314:in `transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:302:in `save!'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/suppressor.rb:54:in `save!'
        from /var/www/discourse/script/import_scripts/base.rb:361:in `block in create_user'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:209:in `transaction'
        from /var/www/discourse/script/import_scripts/base.rb:360:in `create_user'
        from /var/www/discourse/script/import_scripts/base.rb:278:in `block in create_users'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.1/lib/patches/db/mysql2/alias_method.rb:8:in `each'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.1/lib/patches/db/mysql2/alias_method.rb:8:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `create_users'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:106:in `block in import_anonymous_users'
        from /var/www/discourse/script/import_scripts/base.rb:948:in `block in batches'
        from /var/www/discourse/script/import_scripts/base.rb:947:in `loop'
        from /var/www/discourse/script/import_scripts/base.rb:947:in `batches'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:293:in `batches'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:102:in `import_anonymous_users'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:33:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:22:in `perform'
        from script/import_scripts/phpbb3.rb:35:in `<module:PhpBB3>'
        from script/import_scripts/phpbb3.rb:16:in `<module:ImportScripts>'
        from script/import_scripts/phpbb3.rb:15:in `<main>'

EDIT:
Parece que tem algo a ver com usuários anônimos, acho que vou verificar meu banco de dados.

 def map_anonymous_user(row)
      username = row[:post_username]

      {
        id: @settings.prefix(username),
        email: "anonymous_#{SecureRandom.hex}@no-email.invalid",
        username: username,
        name: @settings.username_as_name ? username : "",
        created_at: Time.zone.at(row[:first_post_time]),
        active: true,
        trust_level: TrustLevel[0],
        approved: true,
        approved_by_id: Discourse.system_user.id,
        approved_at: Time.now,
        post_create_action:
          proc do |user|
            row[:user_inactive_reason] = Constants::INACTIVE_MANUAL
            row[:ban_reason] = "Anonymous user from phpBB3" # TODO i18n
            suspend_user(user, row, true)
          end,
      }
    end

EDIT
Consegui fazer com que o erro fosse superado alterando esta linha no método map_anonymous_user. Acontece que o padrão era definir o nome de usuário como uma string vazia, então eu apenas coloquei uma palavra nele.

mudei isto

name: @settings.username_as_name ? username : "",

para isto

name: @settings.username_as_name ? username : "Anonymous ",
3 curtidas

Posso excluir publicações antigas antes de executar uma importação incremental? Consegui executar a importação localmente em uma instalação de desenvolvimento e a restaurei no meu servidor executando uma instalação docker, e meu plano é executar uma importação lá para novas publicações. Mas, mesmo ignorando as publicações que já foram importadas, executar a importação no servidor está levando horas. Meu fórum é bem grande (1,3 milhão de publicações) e o disco do meu servidor é lento, então apenas carregar o arquivo .sql leva horas.

Isso causará problemas se eu fizer algo como DELETE FROM phpbb_posts WHERE post_id < 2926807 localmente e, em seguida, descarregar e enviar isso para o servidor e executar a importação normalmente?

Adicionei uma configuração IMPORT_AFTER a alguns scripts para que ele extraia apenas dados após uma determinada data. Assim, eu modificaria o SQL que extrai as postagens para obter apenas as de um dia antes do último dump de dados.

Mas se você tiver um disco muito lento, provavelmente terá problemas para hospedar o Discourse. O desempenho é aceitável com os dados que você tem?

1 curtida

Sim, para uso normal usarei um disco mais rápido, mas ele não é grande o suficiente para hospedar várias cópias do banco de dados ao mesmo tempo, então estou roteando /shared/import para um disco maior e mais lento na seção de volumes do import.yml. O truque funcionou bem para restaurar o backup inicial, eu redirecionei /shared/tmp para o disco lento após a restauração falhar por falta de espaço, mesmo tendo 18G livres e um banco de dados de 6G (acho que vi você mencionar em outro lugar que a restauração cria 3 cópias do banco de dados enquanto está em execução). Mas, naquela fase, o tempo de inatividade não era uma preocupação.

Então, no dia a dia, tamanho e velocidade não são um problema, meu fórum é bem tranquilo, é apenas antigo.

Vou dar uma olhada em modificar o SQL nos scripts. Obrigado!

2 curtidas

No arquivo settings.yml, o conteúdo para conectar ao mysql é este:


Onde posso colocar o nome do banco de dados?

O nome do banco de dados deve ir no parâmetro schema. O nome desse parâmetro é um pouco confuso, sim. Você pode ver aqui no código, ele é passado como o nome do banco de dados.

2 curtidas

https://www.loom.com/share/1f66315779af4cf7b286c8541d4f3f09

Olá! Fiz um breve vídeo falando sobre o problema que estamos tendo com a importação. Estamos trazendo cerca de 650.000 posts.

Muito obrigado!

https://www.loom.com/share/1f66315779af4cf7b286c8541d4f3f09?sid=11a46d3c-8510-43a1-82e9-1a3524cbb365

Olá. Existe alguma maneira de executar a importação linha por linha? Estamos tendo problemas com a conclusão do script. Algumas coisas funcionam, como usuários e avatares, outras não. Já reinstalei meu servidor cerca de 4 vezes porque li em algum lugar que, após uma importação falhar, uma instalação limpa precisa ser feita.

Outros detalhes estão no vídeo que postei. Qualquer ajuda é bem-vinda.

Olá. Estou há cerca de 18 horas migrando e não cheguei mais perto de fazer a migração funcionar. Você poderia, por favor, assistir ao meu vídeo e me dar alguma dica ou truque, ou se algo está faltando na configuração? Precisamos apenas de posts, tópicos, mensagens privadas e categorias. Avatares e usuários estão funcionando. O servidor está limpo, UBUNTU 22.04.

Uma solução mais fácil é fazer um backup depois de criar o site para que você possa restaurar esse backup. Outra maneira de obter um banco de dados limpo é executar rake db:drop db:create db:migrate, mas você precisa fazer algumas coisas para tornar isso possível. Se você não conseguir adivinhar essas coisas pelas mensagens de erro, a solução de backup/restauração é o caminho a seguir e pode ser mais rápida de qualquer maneira.

Você pode adicionar algumas instruções de depuração puts lá, embora a estrutura do script phpbb3 seja um pouco confusa para pessoas que não conhecem Ruby bem.

Além disso, você pode executar o script várias vezes e ele pulará as coisas que já fez, então você não precisa realmente limpar o banco de dados até ter alterado algo que exija um novo começo (ou seja, ele fará algo diferente com os dados já importados).

Isso está além do que posso fazer gratuitamente. Se você tiver um orçamento, pode entrar em contato comigo diretamente ou postar em Marketplace.

O script de importação não parece estar funcionando. O problema está no vídeo. Se alguém da migração do Discourse puder investigar, seria apreciado.

Se o suporte for pago, vocês poderiam listar o custo da migração? Meu entendimento é que é aqui que fazemos perguntas sobre como fazer o script funcionar. Eu não me importo com taxas, apenas pensei que este era um projeto de código aberto e que este era o lugar para fazer perguntas.

Estou dizendo que sou um voluntário aqui e não estou disposto a assistir a um vídeo de graça, em grande parte devido ao meu desprezo irracional por vídeos. Mas eu não sou o único aqui. Muitas pessoas adoram assistir a vídeos.

Então, toda vez que ele é executado, ele cria duplicatas dos usuários que criou na execução anterior? Não consigo imaginar como isso pode acontecer. Você tem certeza? Não é assim que deveria funcionar.

Parecerá que ele importa as coisas novamente, mas é muito mais rápido, pois na verdade não está fazendo nada, já que as coisas que já foram importadas têm um campo personalizado import_id definido que impede que sejam importadas novamente. Se estiver duplicando dados a cada execução, algo muito estranho está errado.

É. Às vezes, as pessoas precisam ou querem mais ajuda do que podem obter de graça.

2 curtidas

Entendido. Você poderia, por favor, publicar suas taxas para migração? Entendo que o script não parece funcionar e requer suporte pago. Estou totalmente de acordo com isso.

1 curtida

As migrações são bastante complexas. Cada uma delas apresenta desafios diferentes, pois os dados de cada fórum são únicos. Depurar um problema de migração pode levar horas e requer uma análise aprofundada dos logs, do banco de dados, do código, etc. É difícil fazer isso apenas olhando estas postagens, desculpe não poder ajudar mais! Aqui está o nosso FAQ de migrações: Migrating to Discourse | Discourse - Civilized Discussion

Obrigado pelo link. Acho que descobri o problema e o script de importação está rodando agora. Estou com cerca de 100000/666357 posts no momento. O Chat GPT tem sido útil na identificação de alguns erros baseados em permissão e coisas do tipo.

2 curtidas