Migre um fórum NodeBB com Redis para Discourse

Este tutorial mostrará como usar o NodeBB Importer para migrar um fórum NodeBB para a plataforma Discourse. Se o seu fórum NodeBB utiliza MongoDB como backend, siga este tutorial. Não se preocupe, é um processo simples. Vamos começar.

O plano

  • Preparar o ambiente de desenvolvimento.
  • Exportar o banco de dados do ambiente de produção.
  • Importar o banco de dados de produção para uma instância do Discourse.
  • Executar o script de importação.

Quais dados podem ser migrados?

  • Grupos
  • Categorias
    • Categoria Raiz => Categoria Raiz
    • Subcategoria e Sub-Subcategoria => Subcategoria
  • Anexos
  • Tópicos e Postagens
    • tópico fixado => tópico fixado
    • visualizações de tópico
    • todos os estilos serão migrados perfeitamente, incluindo menções, emojis e anexos.
  • Usuários (com os seguintes atributos)
    • avatares (foto de perfil)
    • fundo do perfil
    • status de banimento
    • nome
    • nome de usuário
    • e-mail
    • biografia
    • administrador
    • site
    • localização
    • status de data de entrada
    • grupo

Preparando o Ambiente de Desenvolvimento Local

Configure seu ambiente de desenvolvimento seguindo um destes guias:

A partir de agora, chamarei este ambiente de servidor Discourse.

:bulb: Por favor, utilize este guia se tiver algum problema ao configurar o Discourse.

Exportando o Dump do Banco de Dados de Produção (do Servidor NodeBB):

Desligue seu fórum. Isso é recomendado pelo NodeBB.

$ cd /path_to_nodebb
$ ./nodebb stop

Você também deve desligar o Redis:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

Seu banco de dados do fórum está todo em um único arquivo. Este arquivo é gerado automaticamente periodicamente pelo Redis. Geralmente, ele está localizado em /var/lib/redis/dump.rdb. Além disso, você pode obter o caminho via CLI do Redis:

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"
127.0.0.1:6379> exit
$ ls -la /var/lib/redis
# -rw-rw-r-- 1 redis redis 2664346 Aug 4 16:24 dump.rdb

:bulb: Se seu servidor Redis exigir senha, use AUTH SUA_SENHA.

:bulb: Se, por algum motivo, você não encontrar seu arquivo de banco de dados no caminho esperado, você pode gerá-lo manualmente executando SAVE dentro da CLI do Redis.

Agora, você precisa copiar os anexos do fórum:

$ cd /path_to_nodebb_root_folder/
$ tar -czf ./uploads.tar.gz ./public/uploads

Agora que você tem seu banco de dados e os ativos do fórum, você precisa copiá-los para o servidor Discourse.

Importando o Banco de Dados

Se você seguiu as instruções de instalação do Discourse, deve ter o servidor Redis instalado no servidor Discourse:

$ redis-server -v
# Redis server v=5.0.2...

Agora você precisa parar o servidor Redis (importante).

Baseado em Linux:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

Mac OS:

$ brew services stop redis
$ brew services list
# redis stopped

O que você precisa fazer agora é copiar o banco de dados do fórum para o caminho local do banco de dados Redis. O importador precisa se conectar ao servidor Redis e migrar o banco de dados NodeBB para o banco de dados Discourse. Esta etapa assume que você não tenha nada importante no seu banco de dados Redis; caso contrário, você deve realizar um backup.

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"

Verifique se há arquivos e anote o usuário atual e as permissões de dump.rdb:

$ ls -la /var/lib/redis

Copie o banco de dados NodeBB (substitua se já existir um):

$ cp dump.rdb /var/lib/redis

Mais tarde, ao tentar conectar ao servidor Redis, você pode receber o erro Fatal error loading the DB: Permission denied. Portanto, você deve alterar as permissões de dump.rdb:

# Substitua o usuário pelo mesmo que você anotou anteriormente.
$ sudo chown redis:redis /var/lib/redis/dump.rdb
$ sudo chmod 660 /var/lib/redis/dump.rdb

Agora você precisa descompactar o uploads.tar.gz para qualquer caminho de sua escolha:

$ tar xvzf uploads.tar.gz

Executando o Script de Importação

Agora que nosso banco de dados está no lugar, estamos prontos para executar nosso script de importação. Antes disso, precisamos editar algumas configurações. Provavelmente, você só precisa alterar as duas linhas a seguir.

Este é o caminho da pasta de uploads do seu NodeBB:

ATTACHMENT_DIR = '/caminho_absoluto/uploads'

Este é o nome do banco de dados no Redis. O padrão é 0:

db: 0

Execute o importador com um Discourse limpo:

$ cd ~/discourse
$ bundle exec rake db:drop db:create db:migrate
$ bundle exec ruby script/import_scripts/nodebb/nodebb.rb

O importador se conectará ao servidor Redis e migrará tudo para o banco de dados PostgreSQL do Discourse.

Após a conclusão da importação, inicie a plataforma Discourse:

$ bundle exec rails server

Inicie o Sidekiq para processar os dados migrados:

$ bundle exec sidekiq

Você pode monitorar o progresso em http://localhost:3000/sidekiq/queues.

Faça um backup do Discourse e carregue-o em seu servidor de produção do Discourse seguindo este tutorial.

Assim, você deve ter realizado com sucesso uma migração completa do NodeBB para o Discourse :tada:
Por favor, se tiver alguma dúvida, ficarei feliz em ajudar :slight_smile:

9 curtidas

Eu continuo insistindo sobre minha migração em diferentes tópicos :smiley:

Eu tenho um fórum no NodeBB com Redis e consegui concluir o processo sem erros na versão de desenvolvimento, mas ainda tenho algumas dúvidas:

  • No script de migração, eu coloquei corretamente o caminho absoluto onde eu tinha as imagens e os arquivos do fórum. Quando terminei a migração, vejo que as imagens não estão visíveis nos tópicos. No Discourse, elas aparecem vinculadas no URL: assets/uploads, mas não há nada lá.

    Na versão de desenvolvimento, eu resolvi isso criando um link simbólico:
    ln -s path/to/images public/assets

    Mas na versão de produção, o que devo fazer para criar um link de assets/upload dentro do docker para a pasta onde coloquei as imagens antigas?

  • Parece que todos os tópicos do fórum foram migrados corretamente, mas não vejo as mensagens diretas entre os usuários… elas não estão na migração?

  • O script não detectou nenhum avatar de usuário.

  • E por último, no novo fórum não vejo nenhum embedding de vídeos do Youtube ou Twitts. Preciso instalar um plugin para isso?

Muito obrigado pela sua ajuda.

Isso não deveria ser necessário. Se você tem suas imagens originais em um caminho, configurado em ATTACHMENT_DIR, o Discourse criará um upload (essencialmente, uma cópia do arquivo) em caminho-para-sua-instalação/discourse/public/uploads/default/. Se você verificar a tabela Uploads, ela deve parecer com isto:

[1] pry(main)> Upload.last
  Upload Load (1.5ms)  SELECT "uploads".* FROM "uploads" ORDER BY "uploads"."id" DESC LIMIT 1
=> #<Upload:0x0000000109a460a0
 id: 196,
 user_id: 251468,
 original_filename: "Screenshot 2023-11-17 at 11.52.39.png",
 filesize: 25174,
 width: 398,
 height: 248,
 url: "/uploads/default/original/1X/2e5f7a09ba3bcd3a3597285771c53c16f20b18dd.png",
 created_at: Fri, 17 Nov 2023 19:12:47.455954000 UTC +00:00,
 updated_at: Fri, 17 Nov 2023 19:12:47.484137000 UTC +00:00,
 sha1: "2e5f7a09ba3bcd3a3597285771c53c16f20b18dd",

Correto, parece que o script do nodebb não migra mensagens privadas. Você pode verificar outros scripts para ver como as mensagens privadas são importadas, verifique o do Vanilla por exemplo.

Os avatares provavelmente não estão sendo carregados corretamente, provavelmente pela mesma questão que você mencionou acima.

Não precisa de plugin. Você provavelmente precisa refazer o bake dos seus posts. Você pode esperar o sidekiq fazer isso automaticamente, ou pode executar um rebake completo do console:

rake posts:rebake

O script do nodebb não é atualizado há alguns anos, então minha suposição é que algumas partes dele estão desatualizadas e precisam ser modificadas para funcionar com seus dados. Espero que isso ajude!

1 curtida