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.

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

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?

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…

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

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

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!

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.

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:

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.

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.

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.

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.

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.

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
    └── ...

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?

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

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.

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…

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 .