Olá, Comunidade Discourse,
Gostaria de compartilhar minha experiência com a importação de um fórum IPB 3.1 para o Discourse 2.1, na esperança de que isso seja útil para outros.
Um breve resumo sobre a Comunidade:
- Tópico: Yii PHP Framework (discussões e suporte relacionados a código)
- Membros: ~26 mil
- Tópicos: ~64 mil
- Posts: ~293 mil
A importação levou 27h 46min em uma máquina com 16 GB de RAM e 4 núcleos de CPU.
Requisitos da Importação:
- Manter os membros, mas limpar todas as contas de SPAM (~250 mil contas, das quais ~26 mil permanecem após a limpeza)
- Implementar SSO a partir do site (as contas de usuário não são gerenciadas pelo Discourse)
- Manter tópicos, posts e categorias com seus URLs originais para que os resultados de pesquisa na web continuem funcionando, bem como outros links de plataformas como o Stackoverflow
Isso é baseado em Migrating from Invision Power Board to Discourse - #23 by pfaffman, então obrigado a @pfaffman pelo excelente trabalho feito no importador.
Preparação
Exportando Dados do IPB
mysqldump <databasename> > /tmp/ipb.sql
cd /var/www/yiiframework.com/forum/ && tar czvf uploads.tgz uploads/
Copie o dump SQL e os uploads para o novo servidor e coloque-os em /var/discourse/shared/standalone/.
Estou assumindo uma configuração simples do Docker do Discourse aqui.
Qual script usar?
Existem dois scripts de importação, ipboard.rb e ipboard3.rb. O script ipboard3.rb parece muito bruto e também não se encaixa no esquema de tabelas que temos, então optei pelo ipboard.rb.
A versão atual do script de importação ipboard.rb não lida bem com anexos e também não converte tags de código, o que é muito importante para nós, já que falamos muito sobre código PHP. Portanto, fiz as seguintes alterações no script:
Tornando os Anexos Carregados Disponíveis
O script de importação substitui os anexos de post por URLs para o arquivo carregado.
Se você pretende manter sua instância IPB online no URL onde estava anteriormente, basta especificar o URL (UPLOADS é uma configuração do script de importação, veja abaixo) para o diretório de uploads e pronto:
UPLOADS="https://www.yiiframework.com/forum/uploads"
Mas estamos importando para o Discourse para remover completamente o fórum antigo, então precisamos colocar os uploads em outro lugar. Se você estiver usando um proxy nginx na frente do Discourse, pode configurá-lo para servir os arquivos carregados a partir de um diretório no servidor. Coloque o seguinte na parte server da configuração do nginx:
location /ipb_uploads/ {
alias /var/www/ipb_uploads/;
}
E configure o URL de anexo (veja abaixo) assim:
UPLOADS="https://forum.yiiframework.com/ipb_uploads"
Configurando o MySQL no contêiner do Discourse
Inicie um shell bash no contêiner do aplicativo Discourse:
docker exec -it app bash
Dentro do contêiner, instale o MySQL e importe o banco de dados:
apt-get install mysql-server mysql-client libmysqlclient-dev
service mysql start
echo "create database ipb" | mysql -uroot -p
mysql -uroot -p ipb < /shared/ipb.sql
Quando tentei a primeira importação para testar o script, ela rodou por vários dias para importar 200 mil usuários, dos quais sabíamos que uma grande quantidade eram contas de SPAM. Então, criamos algumas consultas SQL para excluir contas que nunca haviam postado nada:
Note que vamos usar SSO, então os usuários excluídos serão recriados quando fizerem login.
Se você não for usar SSO, seus critérios para excluir usuários podem ser diferentes.
Você pode importar seus dados sem limpá-los.
mysql -uroot -p
# então aplique as consultas de limpeza
Em seguida, precisamos instalar as dependências para o script de importação:
cd /var/www/discourse
echo "gem 'mysql2'" >> Gemfile
echo "gem 'reverse_markdown'" >> Gemfile
bundle install --no-deployment
Para permitir o acesso ao banco de dados Postgres do Discourse, substitua peer por trust em /etc/postgresql/10/main/pg_hba.conf. Note que 10 representa a versão do postgres; se o arquivo não existir em sua configuração, substitua 10 pela versão do postgres que você está executando atualmente.
Reinicie o Postgres para carregar as alterações: service postgresql restart
Importando
Prepare os avatares e os arquivos carregados:
mkdir /shared/imports
mv /shared/uploads.tgz /shared/imports
cd /shared/imports && tar xzvf uploads.tgz
Execute o script do importador:
cd /var/www/discourse
DB_HOST="localhost" DB_NAME="yiisite" DB_USER="root" DB_PW="root" TABLE_PREFIX="ipb_" IMPORT_AFTER="1970-01-01" UPLOADS="https://www.forum.yiiframework.com/ipb_uploads" AVATARS_DIR="/shared/imports/uploads/" USERDIR="user" bundle exec ruby script/import_scripts/ipboard.rb | tee import.log
Certifique-se de ajustar o URL UPLOADS conforme discutido acima, pois os uploads serão incluídos nos posts como links para o arquivo de upload original.
Limpeza
Se tudo correu bem, faça a limpeza com service mysql stop, apt-get purge mysql-server, rm -rf /var/lib/mysql
Configurando o redirecionamento de URL
Para manter os URLs existentes do fórum intactos, o script de importação cria permalinks para cada tópico que refletem o URL de tópicos e categorias no IPB.
No entanto, esses permalinks não cobrem links para posts específicos em um tópico ou páginas diferentes.
Para que esses URLs funcionem corretamente, você precisa configurar algumas regras de reescrita de URL; há 3 opções:
- Usar a configuração
permalink normalizationsno Discourse para remover partes desnecessárias dos URLs - Regras de reescrita no nginx, se você tiver um proxy nginx na frente do Discourse
- Se o fórum antigo estava em um URL/Host diferente do Discourse, você pode ter um script personalizado para reescrever os URLs (foi isso que fiz)
Aqui está o código PHP que usamos para redirecionamento de URL:
Recursos Relacionados
- Migrate a XenForo forum to Discourse
- Migrating from Invision Power Board to Discourse - #23 by pfaffman
- Feature: Invision Power Board Importer by pfaffman · Pull Request #5543 · discourse/discourse · GitHub
- Implantação do Discourse usando SaltStack:
server-salt/states/discourse at master · yiisoft-contrib/server-salt · GitHub