Minha Jornada de Migração do phpBB (postgresql)

Estou compartilhando minhas descobertas enquanto faço uma migração do phpBB3 para o discourse.

soluções incluem:

  • banco de dados de origem postgres
  • emoji
  • ajustes no importador (correção de bug de citação, suporte aprimorado a bbcode (incluindo youtube), comentários de anexos)
  • posts excluídos logicamente sendo importados como posts normais

sou muito exigente, então se você me acompanhar, poderá obter um resultado muito bom.


Estou considerando migrar do phpbb para o discourse (histórico de versões instaladas: 3.2.1 - 3.2.8).
o problema é que uso postgresql para o banco de dados. sugestões? ainda não tentei, mas presumo que ainda não seja suportado com base no OP.

o novo script de importação foi lançado? vejo que isso foi há pouco mais de um ano.

1 curtida

O script de importação em massa deve funcionar para você… discourse/script/bulk_import/phpbb_postgresql.rb at 52d4de7b45eb1b7c7997da2ba8bff83a3c22a3a5 · discourse/discourse · GitHub

4 curtidas

obrigado, @gerhard

meu entendimento está correto?

  • script/import_scripts/phpbb3 e script/bulk_import são importadores completamente separados
  • o importador em massa é menos sofisticado (embora mais rápido) e, por exemplo, não importará anexos?

se sim, parece que há desvantagens em usar o importador em massa…

não há outra solução, então? seria aconselhável explorar a realização de uma migração de banco de dados do postgresql para o mysql ou algo assim?

2 curtidas

Sim, existem desvantagens. Se você se sente confortável trabalhando com Ruby, sugiro modificar os arquivos em discourse/script/import_scripts/phpbb3/database at main · discourse/discourse · GitHub para que funcionem com a gem pg em vez de mysql2.

Talvez? Não tenho ideia de quão fácil isso seria e se realmente funcionaria. Você pode tentar…

1 curtida

Que pena. Bem, vou tentar. Entrarei em contato se conseguir algo.

2 curtidas

esse importador é o que será descontinuado? qual o status do ‘novo’? estou tentando decidir quanto esforço investir nisso — haverá valor upstream?

2 curtidas

Eu não lidei com a questão do postgresql para mysql pessoalmente, mas puramente da perspectiva de migrar de phpBB para Discourse, minha opinião é: faça o que for preciso para realizar a migração.

Migrei dois fóruns phpBB para Discourse, e embora houvesse as habituais reclamações de um pequeno número de usuários que se obtém com qualquer mudança, os benefícios do Discourse valem muito a pena! Não só o Discourse é mais fácil de manter e administrar, mas o engajamento de usuários integrado, o manuseio de imagens, a personalização de usuários e a legibilidade do Discourse são apenas algumas das funcionalidades que estão tão à frente do phpBB que não há comparação. Você também obtém um suporte muito melhor com o Discourse.

Não sou um especialista, mas uma pesquisa rápida sugere que você poderia migrar do postgresql para o mysql fazendo um dump do esquema, alterando os tipos de dados nas declarações do esquema para corresponder aos usados pelo mysql, usando o esquema modificado para criar as tabelas em um banco de dados mysql e, em seguida, fazendo uma exportação e importação CSV tabela por tabela.

Depois de ter o banco de dados mysql, você poderia usar o script de migração phpBB regular e ter todos os seus anexos.

Valerá a pena o esforço!

3 curtidas

Isso parece uma receita para o desastre se você não for cuidadoso com os conjuntos de caracteres e as colisões do banco de dados.

Há alguns anos comecei a trabalhar nisso, mas está inacabado e desatualizado. De qualquer forma, talvez seja útil.

3 curtidas

Eu não quis implicar que seria fácil, apenas que vale a pena o esforço, e é até possível fazer manualmente, e parece haver muitos recursos disponíveis para isso, tanto com ferramentas automatizadas quanto manualmente. :grinning:

3 curtidas

Dado que odeio Ruby, e o importador existente será descontinuado em favor do importador em massa (que ainda não é bom o suficiente para meus propósitos), estou prosseguindo com a estratégia de migração postgres → mysql.

Estou progredindo com o assistente de migração do MySQL Workbench. Escreverei um pequeno guia se for bem-sucedido, mas parece promissor até agora.

2 curtidas

até agora, estou preso neste problema:

https://bugs.mysql.com/bug.php?id=89048

basicamente, o mysql workbench falha ao importar unicode. tentarei com o mariadb amanhã e verei se consigo definir a codificação padrão do banco de dados ou algo assim antes de importar.

1 curtida

Teria sido ótimo se o MySQL Workbench funcionasse. Vi vários relatórios de erro com ele quando olhei as opções, então não o recomendei.

Mencionei o método de exportação/importação de schema dump e CSV uma vez antes, e só vou mencioná-lo mais uma vez com uma pequena modificação para torná-lo muito mais fácil e depois me calar.

Se você quiser seguir um caminho GUI:

  1. Obtenha uma exportação apenas de estrutura de todas as tabelas de uma cópia funcional da mesma versão do phpBB3 que você está usando, que esteja rodando MySQL/MariaDB. Levaria literalmente dois minutos para alguém criar uma a partir do phpMyAdmin, que está disponível na maioria dos provedores de hospedagem web que rodam MySQL/MariaDB. (Alternativamente, você pode conseguir as instruções CREATE TABLE que precisa dos scripts de instalação do phpBB3 se não conseguir que alguém faça a exportação apenas de estrutura para você, ou até mesmo usar uma conta de hospedagem web barata para fazer uma instalação limpa da sua versão do phpBB3 em um ambiente MySQL/MariaDB e depois excluir os dados nas tabelas que ele cria para criar um banco de dados MySQL/MariaDB vazio.)
  2. Encontre acesso a um provedor de hospedagem web com MySQL/MariaDB e phpMyAdmin, crie o banco de dados, importe a estrutura da exportação apenas de estrutura que você criou no passo 1 usando o phpMyAdmin.
  3. Crie uma exportação CSV para cada tabela do seu banco de dados postgresql e faça uma importação CSV para a tabela correspondente usando o phpMyAdmin no seu novo banco de dados MySQL/MariaDB.

Acho que isso evitará quaisquer problemas com conjunto de caracteres e codificação, e você não terá que descobrir todos os tipos de dados e tamanhos de campo correspondentes que seriam necessários se você tentasse converter manualmente o schema dump do postgre.

Posso fornecer uma instrução SQL apenas de estrutura, mas o único DB que ainda tenho é do phpBB3 3.3.8, então pode adicionar mais problemas se você estiver usando a v. 3.2.x.

3 curtidas

haha. sim, foram necessárias algumas artimanhas não óbvias para fazê-lo funcionar até onde eu consegui. acho que ainda pode funcionar, mas obrigado por me dar outra via para explorar.

1 curtida

Ok, ufa. Aqui está minha solução para importação do PostgreSQL.

Isso levará você de um dump do PostgreSQL para um servidor MariaDB funcional no qual você pode conectar o importador. Requer Docker Compose.

Funciona para phpBB 3.2. Não sei sobre 3.3. Se você está desesperado por suporte ao 3.3, posso tentar consertar se você me der um dump pg_dumpall do phpBB 3.3.

3 curtidas

phpbb_smilies.zip (87.2 KB)

(compare to default smilies)

fwiw aqui está minha solução de emoji

eu te dou duas opções:

  1. nativo
    • se você não quiser preservar o emoji original do phpBB, você pode mapeá-los para emojis nativos já existentes no discourse

:grin: :smile: :wink: :slightly_frowning_face: :astonished: :exploding_head: :confounded: :sunglasses: :joy: :rage:
:stuck_out_tongue: :person_facepalming: :sob: :imp: :smiling_imp: :roll_eyes: :exclamation: :question: :bulb: :arrow_forward:
:neutral_face: :smiley_cat: :nerd_face: :nerd_face:

  1. importado
    • se você quiser preservar o emoji original do phpBB e tê-los disponíveis como shortcodes para continuar usando:
      • antes de executar o importador, vá para a seção de emojis do painel do discourse (admin/customize/emojis)
      • se quiser, crie primeiro um grupo de emojis chamado phpbb ou algo assim
      • arraste os arquivos de emoji (5 por vez) em new_files para o navegador para importá-los como emojis personalizados

eu tenho um zip com a configuração para qualquer uma das opções incluída como import.yml no zip.

também no zip há uma planilha para te ajudar a decidir ou fazer seu próprio mapeamento:

phpbb_smilies
├── phpbb_smilies.xlsx # referência principal para te ajudar a decidir
├── import.yml # arquivo de configuração com ambas as opções
├── orig_phpbb_smilies.csv # dados originais do phpbb
├── orig_files # arquivos de emoji originais do phpbb
│   ├── icon_arrow.gif
│   └── ...
└── new_files # arquivos de emoji renomeados para corresponder à coluna `new_shortcode` na planilha
    ├── phpbb_arrow.gif
    └── ...
1 curtida

alguém conseguiu fazer a atribuição de citações funcionar corretamente?

aqui está um exemplo de uma postagem original do phpbb contendo uma citação (nome de usuário e conteúdo alterados, IDs etc. são os mesmos)

[quote=someuser post_id=46649 time=1677556325 user_id=48]
foo
[/quote]

bar

aqui está como fica no discourse:

aqui está a postagem bruta migrada para o discourse:

[quote=", post:37, topic:1893"]
foo
[/quote]

bar

o postid e topicid migrados estão corretos, mas o nome de usuário está faltando. isso faz com que não seja interativo. quando o nome de usuário é uma string vazia, a citação não se expande e você não pode clicar nela para seguir a referência à postagem original.

posso esperar uma experiência melhor sem fazer melhorias no importador? ou seja, estou apenas fazendo algo errado?

1 curtida

Tenho quase certeza de que isso funcionou corretamente em uma importação do phpbb3 que fiz no mês passado.

1 curtida

Ainda não resolvi o último problema, mas aqui está outra pergunta.

Percebi que, após a importação terminar e você iniciar o contêiner do aplicativo, meu servidor phpBB ainda existente é muito exigido. Acho que isso acontece durante a fase de pós-processamento do Sidekiq.

O phpBB ainda existe em www.example.com, e o Discourse está em dc.example.com.

Estou tentando entender o que realmente está acontecendo, quais configurações fazem sentido durante esta migração de teste e quais configurações farão sentido para a migração final. E se preciso ter o phpBB em execução para esse pós-processamento do Sidekiq. Estou perguntando porque não tenho ideia do que acontece no pós-processamento.

Algumas configurações possivelmente relevantes no meu settings.yml atual:

import:
  # Defina isso se você importar vários fóruns phpBB em um único fórum Discourse.
  site_name:
  site_prefix:
    # isso é necessário para reescrever links internos em posts
    original: example.com    # sem http(s)://
    new: https://dc.example.com       # com http:// ou https://

Se houver mais alguma coisa que você precise verificar, por favor me avise.

Outra coisa que não está clara para mim é o subdomínio www. Atualmente, redireciono para www com nginx para o phpBB. Então, no exemplo acima, faz diferença se eu coloco original: example.com vs original: www.example.com? Pergunta semelhante para new quando eu fizer a migração final. Meus usuários realmente acessarão o Discourse de www.example.com, mas não sei qual é a melhor prática.

1 curtida

algo está realmente errado com a análise de citações.

acabei de tentar importar um phpBB 3.2.8 recém-instalado (instalado no mariadb)

a atribuição de citação está quebrada – o campo nome de usuário está em branco nas citações importadas, mas todo o resto é legítimo

captura de tela do discourse da postagem importada:

postagem importada do discourse:

[quote=", post:4, topic:12"]
[quote=", post:3, topic:12"]
[quote=", post:2, topic:12"]
msg 1
[/quote]

segundo
[/quote]

terceiro
[/quote]

quarto

postagem original do phpbb:

MariaDB [phpbb]> select post_text from phpbb_posts where post_id=5;
...
| <r><QUOTE author="admin" post_id="4" time="1678400691" user_id="2"><s/>[quote=admin post_id=4 time=1678400691 user_id=2]</s/>
<QUOTE author="admin" post_id="3" time="1678400685" user_id="2"><s/>[quote=admin post_id=3 time=1678400685 user_id=2]</s/>
<QUOTE author="admin" post_id="2" time="1678400675" user_id="2"><s/>[quote=admin post_id=2 time=1678400675 user_id=2]</s/>msg 1</e>[/quote]</e>
segundo

</e>[/quote]</e></QUOTE>
terceiro
</e>[/quote]</e></QUOTE>
quarto</r> |

talvez eu acabe fazendo melhorias no importador, afinal…

3 curtidas

Corrigido


Sou bastante exigente com a migração do meu fórum, então continuo a melhorar o importador. Não sei se vou me dar ao trabalho de fazer PRs, já que o importador está obsoleto e algumas das minhas correções são semi-específicas para o meu fórum, mas este branch terá todas as minhas correções combinadas caso seja útil para alguém:

Corrigi o problema das citações, adicionei suporte para alguns BBCodes comumente adicionados, tornei o parsing de links do YouTube menos quebrado e suportei a extensão mentions/simplementions. Ainda tenho mais coisas para melhorar, como adicionar suporte para múltiplos prefixos de site (o principal caso de uso é quando você tem links no seu fórum para example.com e www.example.com).

Mesmo que eu esteja suportando algumas coisas não padrão, não deve ser um problema executá-lo em um fórum phpBB padrão sem extensões. Eu recomendo apenas usar o meu em qualquer caso.

A maneira mais fácil de usá-lo é baixar meu branch em algum lugar e sobrescrever o diretório do script de importação dentro do contêiner com um bind mount.

Ou seja, baixe minhas alterações em algum lugar:

git clone --filter=blob:none --no-checkout https://github.com/ftc2/discourse.git discourse_dev
cd discourse_dev
git sparse-checkout set --cone
git switch phpbb_import
git sparse-checkout set script/import_scripts

Em seguida, adicione isso à configuração do seu contêiner import.yml:

docker_args:
  - '-v /path/to/discourse_dev/script/import_scripts:/var/www/discourse/script/import_scripts'

Em seguida, reconstrua o contêiner de importação. Após reconstruir, você provavelmente vai querer fazer um reset onde baixou meu repositório, porque o processo de build sobrescreverá meus arquivos, lol.

cd /path/to/discourse_dev
git reset --hard HEAD
chown -R 1000:1000 .
5 curtidas