Achei que faria um post rápido com um pouco sobre como migrei nosso fórum de mais de 25.000 membros e 250.000 posts do Flarum para o Discourse.
Como vocês devem saber se estão lendo isso, não há um script de importação oficial do Flarum para o Discourse. No entanto, o @koen360 foi gentil o suficiente para compartilhar seu trabalho na modificação do importador do FluxBB para importar usuários. Porém, também precisávamos importar as postagens, já que grande parte do sucesso do nosso fórum depende dos usuários pesquisarem termos muito específicos que aparecem nas postagens. Então, foi isso que fizemos… com várias horas de migrações falhas, dores de cabeça e alguns ferimentos.
De forma alguma sou um especialista em escrever scripts de migração, mas este script funciona bem o suficiente para a versão atual do Flarum no momento da escrita (V0.1.0-beta.16). O script (anexado abaixo) precisará de acesso ao seu banco de dados MySQL/MariaDB, de preferência uma cópia dele, para que você não estrague seu site de produção caso algo dê errado. Basta substituir os valores fictícios na conexão MySQL e você estará pronto.
Certifique-se de ter um backup completo do seu banco de dados Flarum antes de iniciar este processo; se algo der errado, provavelmente será irreversível.
Se precisar de ajuda com sua migração do Flarum para o Discourse, sinta-se à vontade para responder a este tópico. Não sou um especialista, mas tentarei ajudar da melhor forma possível.
Obrigado por criar o script, @Lecter! Você pode enviá-lo como um PR para discourse/discourse? Ainda não temos um script para o Flarum, então isso seria muito útil como base.
Isso é ótimo, obrigado por levar este importador um passo adiante! Espero que, com o tempo, ele também possa ser expandido para incluir Tags, se não Attachments.
Quanto trabalho seria necessário para adicionar suporte a Tags? Vejo que o vBulletin 5 e talvez alguns outros têm modelos possíveis de como isso funciona, mas não tenho ideia de quanto precisaria ser ajustado para o Flarum. Obrigado por qualquer insight que alguém possa fornecer, e sem problemas se não for algo que possa realmente ser respondido sem fazer.
Tenho o Discourse com posts vazios e com 3 categorias padrão.
Quando tentei importar o SQL do Flarum para o Discourse, recebi este erro
su discourse -c 'bundle exec ruby script/import_scripts/flarum_import.rb'
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
creating users
13 / 13 (100.0%) [281 items/min] n]
importing top level categories...
39 / 39 (100.0%) [420 items/min] n]
importing children categories...
39 / 39 (100.0%) [290 items/min]
creating topics and posts
Traceback (most recent call last):
19: from script/import_scripts/flarum_import.rb:162:in `<main>'
18: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
17: from script/import_scripts/flarum_import.rb:32:in `execute'
16: from script/import_scripts/flarum_import.rb:101:in `import_posts'
15: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
14: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
13: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
12: from script/import_scripts/flarum_import.rb:122:in `block in import_posts'
11: from /var/www/discourse/script/import_scripts/base.rb:224:in `all_records_exist?'
10: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/transactions.rb:209:in `transaction'
9: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
8: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
7: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
6: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
5: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
3: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
2: from /var/www/discourse/script/import_scripts/base.rb:231:in `block in all_records_exist?'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec': ERROR: duplicate key value violates unique constraint "import_ids_pkey" (PG::UniqueViolation)
DETAIL: Key (val)=(7) already exists.
20: from script/import_scripts/flarum_import.rb:162:in `<main>'
19: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
18: from script/import_scripts/flarum_import.rb:32:in `execute'
17: from script/import_scripts/flarum_import.rb:101:in `import_posts'
16: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
15: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
14: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
13: from script/import_scripts/flarum_import.rb:122:in `block in import_posts'
12: from /var/www/discourse/script/import_scripts/base.rb:224:in `all_records_exist?'
11: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/transactions.rb:209:in `transaction'
10: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
9: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
8: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
7: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
6: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
5: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
3: from /var/www/discourse/script/import_scripts/base.rb:243:in `block in all_records_exist?'
2: from /var/www/discourse/script/import_scripts/base.rb:243:in `ensure in block in all_records_exist?'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec': ERROR: current transaction is aborted, commands ignored until end of transaction block (PG::InFailedSqlTransaction)
root@raspberrypi-app:/var/www/discourse# rake db:validate_indexes
Starting postgres on port: 11000
Waiting for PG server to start...
PG server is ready and DB is loaded
Running migrations on blank database!
Testing indexes on the default database
No missing indexes
No extra indexes
Encontrei o problema. No meu caso, uma postagem tem várias tags. Depois que excluí essas postagens, o script de importação foi processado sem nenhum erro.
ubuntu@ip-172-26-1-78:~/discourse$ bundle exec ruby script/import_scripts/flarum_import.rb
Carregando grupos existentes...
Carregando usuários existentes...
Carregando categorias existentes...
Carregando posts existentes...
Carregando tópicos existentes...
criando usuários
Pulando 1000 usuários já importados
Pulando 826 usuários já importados
importando categorias de nível superior...
34 / 34 (100,0%) [5728165 itens/min]
importando categorias filhas...
34 / 34 (100,0%) [3194 itens/min]
criando tópicos e posts
Traceback (most recent call last):
19: from script/import_scripts/flarum_import.rb:162:in `<main>'
18: from /home/ubuntu/discourse/script/import_scripts/base.rb:47:in `perform'
17: from script/import_scripts/flarum_import.rb:32:in `execute'
16: from script/import_scripts/flarum_import.rb:101:in `import_posts'
15: from /home/ubuntu/discourse/script/import_scripts/base.rb:916:in `batches'
14: from /home/ubuntu/discourse/script/import_scripts/base.rb:916:in `loop'
13: from /home/ubuntu/discourse/script/import_scripts/base.rb:917:in `block in batches'
12: from script/import_scripts/flarum_import.rb:122:in `block in import_posts'
11: from /home/ubuntu/discourse/script/import_scripts/base.rb:224:in `all_records_exist?'
10: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/transactions.rb:209:in `transaction'
9: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
8: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
7: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
6: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
5: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
4: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
3: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
2: from /home/ubuntu/discourse/script/import_scripts/base.rb:243:in `block in all_records_exist?'
1: from /home/ubuntu/discourse/script/import_scripts/base.rb:243:in `ensure in block in all_records_exist?'
1: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec'
/home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec': ERROR: violação de restrição única na chave duplicada \"import_ids_pkey\" (PG::UniqueViolation)
DETAIL: Chave (val)=(53) já existe.
20: from script/import_scripts/flarum_import.rb:162:in `<main>'
19: from /home/ubuntu/discourse/script/import_scripts/base.rb:47:in `perform'
18: from script/import_scripts/flarum_import.rb:32:in `execute'
17: from script/import_scripts/flarum_import.rb:101:in `import_posts'
16: from /home/ubuntu/discourse/script/import_scripts/base.rb:916:in `batches'
15: from /home/ubuntu/discourse/script/import_scripts/base.rb:916:in `loop'
14: from /home/ubuntu/discourse/script/import_scripts/base.rb:917:in `block in batches'
13: from script/import_scripts/flarum_import.rb:122:in `block in import_posts'
12: from /home/ubuntu/discourse/script/import_scripts/base.rb:224:in `all_records_exist?'
11: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/transactions.rb:209:in `transaction'
10: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
9: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
8: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
7: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
6: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
5: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
4: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
3: from /home/ubuntu/discourse/script/import_scripts/base.rb:243:in `block in all_records_exist?'
2: from /home/ubuntu/discourse/script/import_scripts/base.rb:243:in `ensure in block in all_records_exist?'
1: from /home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec'
/home/ubuntu/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec': ERROR: transação atual está abortada, comandos ignorados até o fim do bloco de transação (PG::InFailedSqlTransaction)
Olá,\n\nVocê pode explicar como você fez isso? Pois estou enfrentando o mesmo erro que você, mas em vez de (val)=(7) eu recebo:\n\n`exec’: ERROR: duplicate key value violates unique constraint "import_ids_pkey" (PG::UniqueViolation)\nDETAIL: Key (val)=(1) already exists.