(Substituído) Como migrar / importar do SMF2 para Discourse

:mega: Este documento foi substituído por este outro guia do SMF2: Migrate an SMF2 forum to Discourse

Eu realmente queria migrar nosso antigo fórum SMF2 para o Discourse. Temos mais de 1000 membros e cerca de 20 mil posts em aproximadamente 2 mil tópicos.
No SMF2, não usávamos enquetes nem anexos — na verdade, nem todos tinham um avatar. Alguns posts dependiam fortemente de BBCode “avançado”, no entanto.

Veja como fizemos isso.

Pré-requisitos

Basta instalar o Discourse da maneira habitual.
Adicionei o plugin Discourse BBCode para lidar com listas, tamanhos, cores etc. diretamente.

Se você não conseguir abrir uma conexão remota com o banco de dados MySQL do seu SMF2, será necessário importar seus dados de um dump para um contêiner Docker temporário.

Se seu banco de dados aceitar conexões remotas — ou se estiver rodando na mesma máquina, você pode pular esta etapa.

Um contêiner MySQL Docker temporário

Faça o dump do seu banco de dados:

cd /tmp/
mysqldump –u[usuário] –p[senha] [nome do banco de dados] > sqldump.sql

Crie o contêiner MySQL Docker temporário:

cd /tmp/
docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v "$PWD":/backup --name=mysql mysql

Em seguida, acesse-o:

docker exec -it mysql bash

Importe o dump do seu banco de dados:

mysql -uuser -ppass db < /backup/sqldump.sql

Se você receber o seguinte erro:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Apenas aguarde um minuto para que o contêiner seja totalmente inicializado.

Para compatibilidade de banco de dados, tive que alterar o plugin de autenticação do nosso banco de dados temporário, mas seu caso pode variar:

mysql -uuser -ppass db

Use esta consulta:

ALTER USER user
IDENTIFIED WITH mysql_native_password
BY 'pass';

Em seguida, saia e verifique o endereço IP da sua instância MySQL:

exit
docker inspect mysql | grep IPAddress

Agora você tem uma cópia funcional do seu banco de dados SMF2.

Um contêiner de importação Discourse temporário

Vamos criar um novo contêiner chamado “import”, baseado no contêiner app.yml padrão:

cd /var/discourse
cp containers/app.yml containers/import.yml

nano containers/import.yml

Adicione o template mysql-dep ao seu novo contêiner de importação:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Descomente estas duas linhas se desejar adicionar o Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"
  - "templates/import/mysql-dep.template.yml"

Então basta:

/var/discourse/launcher stop app
/var/discourse/launcher rebuild import

Importando para o Discourse

Depois que o contêiner de importação for reconstruído, precisamos acessá-lo para nossa última ajuste:

/var/discourse/launcher enter import
cd /var/www/discourse/ # o script deve ser executado a partir deste diretório exato, mas você provavelmente já estará lá
su discourse -c "bundle exec ruby script/import_scripts/smf2.rb -h 172.17.0.3 -u user -p pass -d db -f smf_ -t Europe/Paris"
  • -h: hostname do banco de dados MySQL do SMF2 (aqui, o IP de um contêiner Docker);
  • -u: usuário MySQL do SMF2;
  • -p: senha MySQL do SMF2;
  • -d: banco de dados MySQL do SMF2;
  • -f: prefixo das tabelas do SMF2;
  • -t: fuso horário do SMF2.

Limpeza

Se você criou o contêiner MySQL Docker temporário, pare-o e remova-o:

docker stop mysql
docker rmi mysql

Pare o contêiner “import” do Discourse e use o launcher para fazer a limpeza:

/var/discourse/launcher destroy import
/var/discourse/launcher cleanup

Na verdade, consegui destruir meu contêiner principal :slight_smile: Sem problemas:

/var/discourse/launcher rebuild app

Configurações do Discourse após a importação

Algumas configurações padrão podem causar problemas com posts importados e permissões. Altere-as conforme necessário no painel de configurações do Discourse:

  • comprimento mínimo do título do tópico: mudei para 3 — tópicos com títulos muito curtos provaram ser muito difíceis de trabalhar (não podiam ser movidos, etc.);
  • title prettify: tive que desativar — tópicos cujo título não começava com letra maiúscula provaram ser muito difíceis de trabalhar (não podiam ser movidos, etc.).

Bibliografia

10 curtidas

Thanks for providing this. Maybe @marcozambi can use this for the guide he was planning to write after his successful import (including attachments)?

See here:

Also can anybody from the Discourse team let us know what happened to the old topic that was a guide for SMF2 imports? I can no longer find it via search.

1 curtida

Still determined to contribute, as soon as all the details will be in place. I’m taking notes of everything and I’ll write someting asap

1 curtida

poke @codinghorror @sam @HAWK

I think we can combine what @_vincent has compiled here, what was in the “missing” topic, and a few notes from @marcozambi’s migration to make a pretty comprehensive guide for migrating SMF2 to Discourse.

I have undeleted it here: https://meta.discourse.org/t/importer-for-simple-machines-2-forums/17656

I am assuming it was deleted because it contained info that is no longer up to date so grab what you need from it and we’ll remove it again to avoid future confusion.

1 curtida

Thanks! For the most part it was up-to-date. I did a migration with it a couple months ago and I would have been lost as f*$# without it.

I think the guide isn’t the problem, so much as the importer itself could use a little attention in a few areas. Also, if possible, we should change some of the MySQL settings in the Discourse docker container when it gets created to prevent connection timeouts. That would probably take care of everything IMO.

1 curtida

Ok, it’s out. SMF2 to Discourse - The Ultimate Guide
I hope the Guide is readable enough, as I am not a native english speaker. It goes without saying that any constructive feedback is more than welcome.

3 curtidas

Hello guys,

Let me start that you did a wonderful job with [SMF2 to Discourse - The Ultimate Guide] and this migration tool.

I could migrate a huge SMF instante (61k members, 400k posts, 350k, topics).
I did a dry run and everything worked as it should.

My question is: will this script override Discourse specific settings like the ones in /admin/site_settings/ ? - I’m asking this as I want to make a final migration of the content that came up in the meantime on the SMF site, but I would not want to overwrite the settings already configured in /admin/site_settings/.

Thank you

1 curtida

No it should not override any of the site settings.

1 curtida

Thank you so much.

I don’t have the expertise to “read” the script and what exactly it is copying over. I was hoping the same

Obrigado pelo guia.

Estou travado logo após você dizer:

Para compatibilidade com o banco de dados, precisei alterar nosso plugin de autenticação temporário do banco de dados, mas imagino que seu caso possa variar:

Eu recebo o erro:

Plugin caching_sha2_password não pôde ser carregado: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: não foi possível abrir o arquivo compartilhado: Arquivo ou diretório inexistente (Mysql2::Error::ConnectionError)

Gostaria de saber se você poderia me dar uma dica sobre como corrigir isso, por favor? Provavelmente está relacionado à alteração do ‘plugin de autenticação do banco de dados’? Se for, como faço isso, por favor?

Obrigado!

Em seguida, tentei importar o banco de dados para um MySQL separado fora do Docker, etc. Ele está rodando em localhost.

Agora, ao executar o script, recebo o seguinte erro no mesmo ponto de antes:

from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in initialize' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in connect’: Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2) (Mysql2::Error::ConnectionError)

Tentei aguardar por um período e executar novamente, conforme orientado no guia, mas o mesmo erro sempre ocorre, infelizmente. Alguém poderia me ajudar, por favor?

Obrigado

Aqui está uma captura de tela https://drive.google.com/file/d/1z8TLY4zBr0KzrL9aJDQTG4NKG5Dhbg11/view?usp=drivesdk