Migrar um fórum SMF2 para Discourse

Talvez seja melhor abrir um chamado com a Duffield Ocean sobre os caracteres estarem incorretos?

Você pode usar um cliente SSH como o PuTTY ou o novo shell que, acredito, faz parte do subsistema do Linux para Windows (a última versão do Windows que usei tinha um ano como descritor de versão, então não posso ajudar muito). Se você usa um Mac, basta abrir um terminal e usar o ssh.

Se seu banco de dados for grande, levará um tempo para carregar e não haverá nenhuma saída, apenas um novo prompt quando terminar. Minha suposição é que estava funcionando corretamente.

2 curtidas

Obrigado, @pfaffman. Acredito que entrarei em contato com eles sobre isso.

Posso tentar um cliente SSH diferente e ver se funciona melhor.

O banco de dados não é tão grande. Está parado há uma hora e ainda está no mesmo lugar. Verifiquei a CPU do servidor e ela está essencialmente ociosa.

1 curtida

É, esse era o problema! Obrigado novamente, @pfaffman. Estamos avançando novamente…

Outra solução é permitir o acesso direto ao banco de dados a partir do droplet que está executando a importação, eliminando assim a necessidade de um banco de dados local.

Se já passou uma hora, é provável que o processo não esteja ocorrendo. Você pode tentar algo como

 cat database.sql | mysql
1 curtida

Um passo à frente, um passo atrás.

Pups::ExecError: if [ -z "$LETSENCRYPT_ACCOUNT_EMAIL" ]; then echo "LETSENCRYPT_ACCOUNT_EMAIL ENV variable is required and has not been set."; exit 1; fi failed with return #<Process::Status: pid 1187 exit 1>

Eu não tinha o letsencrypt instalado, então o instalei.

O que falta em “Preparando o Host e o container do Discourse para importação” é que você precisa descomentar a linha de ambiente para LETSENCRYPT_ACCOUNT_EMAIL e inserir seu endereço de e-mail. Isso me fez ultrapassar esse erro.

Na continuação, agora estou na etapa final de importação. Entro no contêiner de importação e executo o script de importação. Ele encerra imediatamente com:

Traceback (most recent call last):
        1: from script/import_scripts/smf2.rb:4:in `<main>'
script/import_scripts/smf2.rb:4:in `require': cannot load such file -- mysql2 (LoadError)

Fiz muitas pesquisas na web, mas até agora sem sucesso.

EDIT: Acredito que isso possa ser porque o MySQL não está instalado no contêiner. Terei ‘gem install mysql2’, mas isso retorna:

mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again.

EDIT 2:
Consegui instalar o mysql2. Primeiro, precisei instalar as ferramentas de desenvolvimento, mas a fonte sugerida não estava disponível. Então, executei:

sudo apt-get install default-libmysqlclient-dev

A partir daí, consegui:

gem install mysql2

Ainda obtive o mesmo erro. Então, tentei comentar o require no script apenas para ver o que aconteceria. Apareceu um novo erro:

Traceback (most recent call last):
        6: from script/import_scripts/smf2.rb:627:in `<main>'
        5: from script/import_scripts/smf2.rb:19:in `run'
        4: from script/import_scripts/smf2.rb:447:in `parse!'
        3: from script/import_scripts/smf2.rb:502:in `parser'
        2: from script/import_scripts/smf2.rb:502:in `new'
        1: from /usr/local/lib/ruby/2.6.0/optparse.rb:1089:in `initialize'
script/import_scripts/smf2.rb:504:in `block in parser': can't modify frozen String (FrozenError)

Pesquisando sobre isso, encontrei um antigo bug do Ruby, mas ele foi corrigido há muito tempo, então estou travado novamente.

Vá até smf2.rb e altere a string congelada de true para false ou vice-versa; está na primeira ou segunda linha. Isso funcionará depois disso.

2 curtidas

Obrigado @Paracelsus! Isso resolveu. Eu mudei de true para false.

Um passo mais perto!

EDIT:
Tive um erro estranho que parecia apontar para o IP errado. Era porque eu tinha a senha errada no Settings.php. Isso foi corrigido.

Agora tentando resolver:

Traceback (most recent call last):
        7: from script/import_scripts/smf2.rb:627:in `<main>'
        6: from script/import_scripts/smf2.rb:28:in `run'
        5: from script/import_scripts/smf2.rb:28:in `new'
        4: from script/import_scripts/smf2.rb:62:in `initialize'
        3: from script/import_scripts/smf2.rb:274:in `create_db_connection'
        2: from script/import_scripts/smf2.rb:274:in `new'
        1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect': Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory (Mysql2::Error::ConnectionError)

Estou assumindo que esta linha no arquivo de ajuste do script serve para resolver isso:

ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';

Essa linha deve ser adicionada em algum lugar dentro do container de importação?

Certo, resolvi o problema acima. Isso é um problema com a versão mais recente do MySQL. Ela não suporta mais as senhas nativas mais antigas. A maneira mais fácil de resolver é executar esse processo usando o MySQL 5.7. Basta alterar a etapa 3 de:

docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql

para

docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql:5.7

e você estará ótimo. Minha importação finalmente está rodando.

2 curtidas

Uma nova pergunta: Não consigo importar os avatares dos usuários. É supposedo ser assim?

Tenho os que precisam de redimensionamento salvos em uma pasta personalizada em vez da padrão do SMF. Isso poderia ser o motivo?

Caso contrário, até agora tudo bem. Este guia é ótimo e as importações incrementais do banco de dados também funcionam muito bem :+1:.

2 curtidas

O nosso veio sem nenhuma etapa extra. Não tenho certeza de onde o SMF armazena os avatares de cabeça. Você trouxe suas anexos? Eu só importei nosso banco de dados SQL e os anexos, então minha suposição é que eles estejam lá.

Sim, eles estavam lá, mas eu movi os avatares para outra pasta e esqueci de copiá-los para a pasta de avatares que a importação usa para corresponder ao usuário. Problema resolvido (mesmo que tenha tido que refazer a importação).

Agora um novo problema… usuários banidos não aparecem como suspensos ao serem importados, apenas como inativados. Alguma ideia de como fazê-los aparecer como suspensos?

1 curtida

Estou usando a versão mais recente v2.50 beta2 do SMF v2.0.17 e há um arquivo smf2.rb diferente gerado devido ao atual:
templates/import/mysql-dep.template.yml
Como explicado no Passo 4, substituindo “quote =”, a iteração atual é:

quote = +“\n[quote="#{params[‘author’]}”

E além disso, não há:

No entanto, prossegui com a importação, mas infelizmente ela falha com “IGNORE_BBCODE, você quer dizer IgnoreUser.”
Desculpe, eu deveria ter tirado um print da Traceback, mas não fiz. De qualquer forma, é o que lembro.
Alguma ideia?
Obrigado.

Atualizei este script recentemente. Vou dar uma olhada.

1 curtida

Muito obrigado! Uma pergunta: se eu começar do zero, isso irá sobrescrever o que já importei? Ou seja, usuários, categorias.
Abraços!
G.

Geralmente não. Os scripts de importação são inteligentes o suficiente para continuar de onde você parou!

1 curtida

@tradenet deve estar corrigido agora aqui:

Desculpe pelo ocorrido!

Estará disponível em tests-passed assim que todas as verificações forem concluídas.

3 curtidas

Obrigado pela sua gentileza.
G.

2 curtidas

As URLs antigas do SMF ficarão quebradas após a conversão para o Discourse?

Não exatamente. O importador criará links permanentes que correspondem (e redirecionam) as URLs antigas para seus novos caminhos.