Migrar um fórum XenForo para Discourse

Apenas 5 mil posts e cerca de 1 mil membros

3 curtidas

Ainda estou aguardando o importador de big board para tentar e testar meu post de 18m no fórum.

3 curtidas

Para XenForo? Temos outras importações em massa, mas é verdade que isso seria muito lento para 18 milhões de posts!

4 curtidas

Estamos desenvolvendo nosso próprio importador em massa interno para 27 milhões de posts. O processo, que levava um pouco mais de uma semana (sem contar os anexos), agora leva menos de um dia com tudo incluso. Realizamos nosso primeiro teste de importação ontem sem nenhum erro. Coisas realmente empolgantes.

4 curtidas

Obrigado, Justin. Dei uma olhada rápida nisso — parece ok para você? (Sinta-se à vontade para adicioná-lo ao importador oficial, se quiser)

  XENFORO_DB = "xenforo_db_3"
  TABLE_PREFIX = "xf_"
  BATCH_SIZE = 1000
  ATTACHMENT_DIR = '/CAMINHO/COMPLETO/DO/attachments'
  AVATAR_DIR = '/CAMINHO/COMPLETO/DO/avatars'

(Adicionei a última linha^^ — significa que você precisará copiar os avatares para lá)

  def execute
    import_users
    import_categories
    import_posts
    import_avatars
  end

(Adicionei a última linha^^)

  def import_avatars
    if AVATAR_DIR
      users = User.all
      users.each do |u|
        unless u.custom_fields["import_id"].nil?
          import_id = u.custom_fields["import_id"]
          if import_id.to_i < 1000
            dir_num = "0"
          elsif import_id.to_i > 1000
            dir_num = import_id.first
          end
        
          avatar_filename = "#{import_id}.jpg"
          file_path = "#{AVATAR_DIR}/l/#{dir_num}"
          file_path_and_name = "#{file_path}/#{avatar_filename}"

          if File.exists?(file_path_and_name)
            upload = create_upload(u.id, file_path_and_name, avatar_filename)
            if upload.persisted?
              u.import_mode = false
              u.create_user_avatar
              u.import_mode = true
              u.user_avatar.update(custom_upload_id: upload.id)
              u.update(uploaded_avatar_id: upload.id)
            else
              puts "Erro: Upload não persistiu para #{u.username} #{avatar_filename}!"
            end
          end
        end
      end
    end
  end

É muito tarde aqui, então posso ter cometido alguns erros ou esquecido muita coisa, mas isso assume que todos os avatares são .jpg (o que parece ser o caso de todos os meus). Não tinha certeza sobre as comutações u.import_mode, então apenas comentei-as.

Totalmente não testado (são quase 5h da manhã aqui :zzz:)

Fiz um teste na minha máquina de desenvolvimento em um fórum com 100 mil posts e levou 90 minutos. Aquele que quero importar tem alguns milhões de posts, então talvez 10 vezes mais?

Legal! Vocês vão compartilhá-lo conosco? Alguma ideia de quando?

4 curtidas

O objetivo atual é garantir que tudo esteja funcionando perfeitamente e, assim que nosso site for migrado, eventualmente publicá-lo no repositório do Discourse para que outros possam usá-lo.

5 curtidas

Um guia passo a passo também seria muito útil, por favor :).

1 curtida

Para as 5 mil postagens e cerca de 600 anexos, em um Xeon mais antigo e um disco SSD, levou cerca de 10 minutos. Eu pegaria uma máquina com desempenho razoável, faria a importação offline e deixaria o processo rodar.

5 curtidas

Fantástico! Estou ansioso por isso.

1 curtida

Ok, fiz um teste muito rápido e as adições ao script parecem ter funcionado — agora estou fazendo um teste adequado com alguns milhares de membros e 100 mil posts. Vou retornar com o resultado se funcionar…

1 curtida

Oi, tem alguma novidade? Se precisar de ajuda com os testes, ficarei feliz em ajudar.

Estou recebendo um erro informando que a tabela de usuários não existe ao executar o script do XenForo. Qualquer ajuda seria muito apreciada!

Estou lendo sobre isso há uma hora, mas ainda não consegui resolver.

Existem algumas variáveis no topo do script que você precisa preencher para que ele possa se conectar ao seu banco de dados MySQL do xenForo e consultar os dados. Acredito que “import_db” possa ser o valor de preenchimento — verifique se esses valores foram preenchidos corretamente.

3 curtidas

@Ghan Eu pensei que estava importando para import_db com isso: mysql -u root -p import_db < /shared/db.sql

Meu xenforo.rb é:

Ah, ok. Se esse for o nome do seu banco de dados, verifique se o nome da tabela está correto. Sua tabela pode ser xf_user com o prefixo, o que causaria um problema. Deve haver uma variável TABLE_PREFIX no script também.

4 curtidas

@Ghan Obrigado!

No momento, ainda estou travado no script de importação.
Ele itera por usuários e categorias, tudo certo. Na função import_posts, porém, ela simplesmente fica travada até que, após algumas horas, ocorra o timeout.

Comecei a depurar isso apenas imprimindo os valores dentro de import_posts:

Todas as impressões após a atribuição da variável results nunca são exibidas.

Caso alguém esteja procurando importar um fórum vb3, este guia pode ajudar se você também tiver uma licença do Xenforo:

2 curtidas

Este importador importa tags do xenForo junto com os tópicos aos quais estão associados?

É sempre uma boa ideia olhar o código-fonte.

Acho que a resposta é… sim (mas não estou super familiarizado com as estruturas de dados do Xenforo):

3 curtidas

Então, parece que pelo menos uma vez importou algumas tags para alguém sob algumas condições. Se você tiver sorte, funcionará para você também!

3 curtidas