Hola Comunidad Discourse,
Quiero compartir mi experiencia importando un foro IPB 3.1 a Discourse 2.1, con la esperanza de que esto sea útil para otros.
Un breve resumen sobre la Comunidad:
- Tema: Yii PHP Framework (discusiones y soporte relacionados con código)
- Miembros: ~26k
- Temas: ~64k
- Publicaciones: ~293k
La importación tomó 27 horas y 46 minutos en una máquina con 16 GB de RAM y 4 núcleos de CPU.
Requisitos de la importación:
- Mantener a los miembros, pero limpiar todas las cuentas de SPAM (~250k cuentas, de las cuales ~26k permanecen después de la limpieza)
- Implementar SSO desde el sitio web (las cuentas de usuario no son gestionadas por Discourse)
- Mantener temas, publicaciones y categorías con sus URLs originales para que los resultados de búsqueda web sigan funcionando, así como otros enlaces desde plataformas como Stackoverflow
Esto se basa en Migrating from Invision Power Board to Discourse - #23 by pfaffman, así que gracias a @pfaffman por el gran trabajo realizado en el importador.
Preparación
Exportar datos desde IPB
mysqldump <nombre_de_base_de_datos> > /tmp/ipb.sql
cd /var/www/yiiframework.com/forum/ && tar czvf uploads.tgz uploads/
Copie el volcado SQL y las subidas al nuevo servidor y colóquelos en /var/discourse/shared/standalone/.
Asumo aquí una configuración simple de Docker de Discourse.
¿Qué script usar?
Hay dos scripts de importación, ipboard.rb y ipboard3.rb; el script ipboard3.rb parece muy tosco y tampoco se ajusta al esquema de tablas que tenemos, así que opté por ipboard.rb.
La versión actual del script de importación ipboard.rb no maneja bien los archivos adjuntos y tampoco convierte las etiquetas de código, lo cual es muy importante para nosotros ya que hablamos mucho sobre código PHP. Por lo tanto, realicé los siguientes cambios en el script:
Hacer disponibles los archivos adjuntos subidos
El script de importación reemplaza los archivos adjuntos de las publicaciones con URLs al archivo subido.
Si planea mantener su instancia de IPB en línea en la URL donde estaba antes, puede simplemente especificar la URL (UPLOADS es una configuración del script de importación, ver más abajo) al directorio de subidas y ya está:
UPLOADS="https://www.yiiframework.com/forum/uploads"
Pero estamos importando a Discourse para eliminar completamente el foro antiguo, por lo que debemos colocar las subidas en otro lugar. Si está utilizando un proxy nginx frente a Discourse, puede configurarlo para servir los archivos subidos desde un directorio en el servidor. Coloque lo siguiente en la parte server de la configuración de nginx:
location /ipb_uploads/ {
alias /var/www/ipb_uploads/;
}
Y configure la URL de los archivos adjuntos (ver más abajo) de la siguiente manera:
UPLOADS="https://forum.yiiframework.com/ipb_uploads"
Configurar MySQL en el contenedor de Discourse
Inicie una shell bash en el contenedor de la aplicación de Discourse:
docker exec -it app bash
Dentro del contenedor, instale MySQL e importe la base de datos:
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
Cuando intenté la primera importación para probar el script, tardó varios días en importar 200k usuarios, de los cuales sabíamos que una gran cantidad eran cuentas de SPAM, por lo que creamos algunas consultas SQL para eliminar cuentas que nunca habían publicado nada:
Tenga en cuenta que vamos a usar SSO, por lo que los usuarios eliminados se volverán a crear cuando inicien sesión.
Si no va a usar SSO, sus criterios para eliminar usuarios podrían ser diferentes.
Puede importar sus datos sin limpiarlos.
mysql -uroot -p
# luego aplique las consultas de limpieza
A continuación, necesitamos instalar las dependencias para el script de importación:
cd /var/www/discourse
echo "gem 'mysql2'" >> Gemfile
echo "gem 'reverse_markdown'" >> Gemfile
bundle install --no-deployment
Para permitir el acceso a la base de datos de Discourse Postgres, reemplace peer con trust en /etc/postgresql/10/main/pg_hba.conf. Tenga en cuenta que 10 representa la versión de postgres; si el archivo no existe en su configuración, reemplace 10 con la versión de postgres que esté ejecutando actualmente.
Reinicie Postgres para cargar los cambios: service postgresql restart
Importando
Prepare los avatares y los archivos subidos:
mkdir /shared/imports
mv /shared/uploads.tgz /shared/imports
cd /shared/imports && tar xzvf uploads.tgz
Ejecute el script del 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
Asegúrese de ajustar la URL de UPLOADS como se discutió anteriormente, ya que las subidas se incluirán en las publicaciones como enlaces al archivo de subida original.
Limpieza
Si todo salió bien, limpie con service mysql stop, apt-get purge mysql-server, rm -rf /var/lib/mysql
Configuración de redirección de URLs
Para mantener intactas las URLs existentes al foro, el script de importación crea enlaces permanentes (permalinks) para cada tema que reflejan la URL de los temas y categorías en IPB.
Sin embargo, estos permalinks no cubren enlaces a publicaciones específicas dentro de un tema o diferentes páginas.
Para que estas URLs funcionen correctamente, debe configurar algunas reglas de reescritura de URLs; hay 3 opciones:
- Usar la configuración
permalink normalizationsen Discourse para eliminar partes innecesarias de las URLs - Reglas de reescritura en nginx, si tiene un proxy nginx frente a Discourse
- Si el foro antiguo estaba en una URL/Hospedaje diferente que Discourse, puede tener un script personalizado para reescribir las URLs (esto es lo que hice)
Aquí está el código PHP que usamos para la redirección de URLs:
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
- Despliegue de Discourse usando SaltStack:
server-salt/states/discourse at master · yiisoft-contrib/server-salt · GitHub