Mi viaje de migración de phpBB (postgresql)

Comparto mis hallazgos mientras avanzo en una migración de phpBB3 a Discourse.

Las soluciones incluyen:

  • Base de datos de origen PostgreSQL
  • Emoji
  • Ajustes en el importador (corrección de error de cita, mejor soporte de bbcode (incluido YouTube), comentarios de adjuntos)
  • Publicaciones eliminadas de forma suave importadas como publicaciones normales

Soy muy exigente, así que si me sigues, deberías poder obtener un resultado bastante bueno.

Estoy considerando mudarme a Discourse desde phpbb (historial de versiones instaladas: 3.2.1 - 3.2.8).
El problema es que uso PostgreSQL para la base de datos. ¿Sugerencias? No lo he intentado, pero supongo que aún no es compatible según la publicación original.

¿Salió alguna vez el nuevo script de importación? Veo que fue hace poco más de un año.

1 me gusta

El script de importación masiva debería funcionar para ti… discourse/script/bulk_import/phpbb_postgresql.rb at 52d4de7b45eb1b7c7997da2ba8bff83a3c22a3a5 · discourse/discourse · GitHub

4 Me gusta

gracias, @gerhard

¿es correcta mi comprensión?

  • script/import_scripts/phpbb3 y script/bulk_import son importadores completamente separados
  • el importador masivo es menos sofisticado (aunque más rápido) y, por ejemplo, ¿no importará archivos adjuntos?

si es así, parece que hay desventajas en el uso del importador masivo…

¿no hay otra solución, entonces? ¿sería aconsejable explorar la posibilidad de realizar una migración de base de datos de postgresql a mysql o algo similar?

2 Me gusta

Sí, hay inconvenientes. Si te sientes cómodo trabajando con Ruby, te sugiero modificar los archivos en discourse/script/import_scripts/phpbb3/database at main · discourse/discourse · GitHub para que funcionen con el gem pg en lugar de mysql2.

¿Quizás? No tengo idea de lo fácil que sería eso y si realmente funcionaría. Puedes intentarlo…

1 me gusta

Qué lástima. Bueno, lo intentaré. Te avisaré si se me ocurre algo.

2 Me gusta

¿es ese importador el que será obsoleto? ¿cuál es el estado del ‘nuevo’? estoy tratando de decidir cuánto esfuerzo dedicar a esto, ¿habrá valor upstream?

2 Me gusta

No he lidiado con el problema de postgresql a mysql yo mismo, pero puramente desde la perspectiva de migrar de phpBB a Discourse, mi opinión es: haz lo que sea necesario para lograr la migración.

He migrado dos foros de phpBB a Discourse, y aunque hubo las habituales quejas de un pequeño número de usuarios que se obtienen con cualquier cambio, ¡los beneficios de Discourse bien valen la pena! No solo es Discourse más fácil de mantener y administrar, sino que la participación de usuarios incorporada, el manejo de imágenes, la personalización de usuarios y la legibilidad de Discourse son solo algunas de las características que están muy por delante de phpBB, hasta el punto de que no hay comparación. También obtienes un soporte mucho mejor con Discourse.

No soy un experto, pero una búsqueda rápida parece indicar que podrías migrar de postgresql a mysql haciendo un volcado del esquema, cambiando los tipos de datos en las sentencias del esquema para que coincidan con los utilizados por mysql, usando el esquema modificado para crear las tablas en una base de datos mysql y luego haciendo una exportación e importación CSV tabla por tabla.

Una vez que tengas la base de datos mysql, podrías usar el script de migración regular de phpBB y tener todos tus adjuntos.

¡Valdrá la pena el esfuerzo!

3 Me gusta

Eso suena como una receta para el desastre si no tienes cuidado con las codificaciones y las intercalaciones de la base de datos.

Hace un par de años empecé a trabajar en ello, pero está inacabado y desactualizado. De todos modos, tal vez sea útil.

3 Me gusta

No quise dar a entender que sería fácil, solo que vale la pena el esfuerzo, incluso es posible hacerlo manualmente, y parece que hay muchos recursos disponibles para lograrlo, tanto con herramientas automatizadas como manualmente. :grinning:

3 Me gusta

Dado que odio Ruby, y el importador existente será obsoleto en favor del importador masivo (que aún no es lo suficientemente bueno para mis propósitos), voy a seguir adelante con la estrategia de migración de PostgreSQL a MySQL.

Estoy avanzando con el asistente de migración de MySQL Workbench. Escribiré una pequeña guía si tiene éxito, pero hasta ahora parece prometedor.

2 Me gusta

hasta ahora, estoy atascado en este problema:

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

básicamente, mysql workbench falla al importar unicode. intentaré con mariadb mañana y veré si puedo establecer la codificación predeterminada de la base de datos o algo antes de importar.

1 me gusta

Hubiera sido genial si MySQL Workbench hubiera funcionado. Vi un montón de informes de error con él cuando miré las opciones, así que no lo recomendé.

Mencioné el volcado de esquema y el método de exportación/importación CSV una vez antes, y solo lo mencionaré una vez más con una ligera modificación para hacerlo mucho más fácil y luego me callaré.

Si quieres ir por la ruta de la GUI:

  1. Consigue una exportación solo de estructura de todas las tablas de una copia funcional de la misma versión de phpBB3 que estás utilizando y que ejecuta MySQL/MariaDB. A alguien le tomaría literalmente dos minutos crear una desde phpMyAdmin, que está disponible en la mayoría de los hosts web que ejecutan MySQL/MariaDB. (Alternativamente, podrías obtener las sentencias CREATE TABLE que necesitas de los scripts de instalación de phpBB3 si no puedes conseguir que alguien haga la exportación solo de estructura por ti, o incluso usar una cuenta de hosting web económica para hacer una instalación limpia de tu versión de phpBB3 en un entorno MySQL/MariaDB y luego eliminar los datos en las tablas que crea para crear una base de datos MySQL/MariaDB vacía).
  2. Encuentra acceso a un host web con MySQL/MariaDB y phpMyAdmin, crea la base de datos, importa la estructura desde la exportación solo de estructura que creaste en el paso 1 usando phpMyAdmin.
  3. Crea una exportación CSV para cada tabla de tu base de datos postgresql y haz una importación CSV a la tabla correspondiente usando phpMyAdmin en tu nueva base de datos MySQL/MariaDB.

Creo que eso evitará cualquier problema con el juego de caracteres y la codificación, y no tendrás que averiguar todos los tipos de datos y tamaños de campo correspondientes que se requerirían si intentaras convertir manualmente el volcado de esquema de postgre.

Puedo darte una sentencia SQL solo de estructura, pero la única DB que todavía tengo es de phpBB3 3.3.8, por lo que podría agregar más problemas si estás usando la v. 3.2.x.

3 Me gusta

jaja. sí, se necesitaron algunos trucos no obvios para que funcionara hasta donde llegué. Creo que todavía podría funcionar, pero gracias por darme otra vía para explorar.

1 me gusta

ok, phew. aquí está mi solución para la importación de postgresql.

esto te llevará desde un volcado de postgres a un servidor mariadb funcional en el que puedas conectar el importador. requiere docker compose.

funciona para phpbb 3.2. no tengo idea sobre 3.3. si mueres por el soporte de 3.3, puedo intentar arreglarlo si me das un volcado de pg_dumpall de phpbb 3.3.

3 Me gusta

phpbb_smilies.zip (87.2 KB)

(comparar con los smileys predeterminados)

como sea, aquí está mi solución de emojis

te doy dos opciones:

  1. nativo
    • si no quieres conservar los emojis originales de phpBB, puedes mapearlos a emojis nativos que ya existen en 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
    • si quieres conservar los emojis originales de phpBB y tenerlos disponibles como códigos cortos para seguir usándolos:
      • antes de ejecutar el importador, ve a la sección de emojis del panel de control de discourse (admin/customize/emojis)
      • si quieres, primero crea un grupo de emojis llamado phpbb o algo similar
      • arrastra los archivos de emoji (5 a la vez) en new_files al navegador para importarlos como emojis personalizados

tengo un zip con la configuración para cualquiera de las opciones incluido como import.yml en el zip.

también en el zip hay una hoja de cálculo para ayudarte a decidir o crear tu propio mapeo:

phpbb_smilies
├── phpbb_smilies.xlsx # referencia principal para ayudarte a decidir
├── import.yml # archivo de configuración con ambas opciones
├── orig_phpbb_smilies.csv # datos originales de phpbb
├── orig_files # archivos de emoji originales de phpbb
│   ├── icon_arrow.gif
│   └── ...
└── new_files # archivos de emoji renombrados para que coincidan con la columna `new_shortcode` en la hoja de cálculo
    ├── phpbb_arrow.gif
    └── ...
1 me gusta

¿Alguien ha conseguido que la atribución de citas funcione correctamente?

Aquí tienes un ejemplo de una publicación original de phpbb que contiene una cita (nombre de usuario y contenido cambiados, IDs, etc. son los mismos)

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

bar

Así es como se ve en Discourse:

Aquí está la publicación sin procesar migrada a Discourse:

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

bar

El postid y topicid migrados son correctos, pero falta el nombre de usuario. Esto hace que no sea interactivo. Cuando el nombre de usuario es una cadena vacía, la cita no se expande y no se puede hacer clic en ella para seguir la referencia a la publicación original.

¿Puedo esperar una mejor experiencia sin hacer mejoras en el importador? Es decir, ¿estoy haciendo algo mal?

1 me gusta

Tengo la firme convicción de que eso funcionó correctamente en una importación de phpbb3 que hice el mes pasado.

1 me gusta

Todavía no he resuelto el último problema, pero aquí tienes otra pregunta.

He notado que después de que termina la importación y se inicia el contenedor de la aplicación, mi servidor phpBB existente recibe muchos ataques. Creo que esto ocurre durante la fase de postprocesamiento de Sidekiq.

phpBB todavía existe en www.example.com, y Discourse está en dc.example.com.

Estoy tratando de entender qué está sucediendo realmente, qué configuraciones tienen sentido durante esta migración de prueba y qué configuraciones tendrán sentido para la migración final. Y si necesito tener phpBB en ejecución para ese postprocesamiento de Sidekiq. Pregunto porque no tengo idea de lo que sucede en el postprocesamiento.

Algunas configuraciones posiblemente relevantes en mi settings.yml actual:

import:
  # Establece esto si importas múltiples foros phpBB en un solo foro de Discourse.
  site_name:
  site_prefix:
    # esto es necesario para reescribir enlaces internos en las publicaciones
    original: example.com    # sin http(s)://
    new: https://dc.example.com       # con http:// o https://

Si hay algo más que necesites revisar, házmelo saber.

Otra cosa que no tengo clara es el subdominio www. Actualmente redirijo a www con nginx para phpBB. Entonces, en el ejemplo anterior, ¿importa si pongo original: example.com vs original: www.example.com? Pregunta similar para new cuando haga la migración final. Mis usuarios accederían a Discourse desde www.example.com, pero no sé cuál es la mejor práctica.

1 me gusta

Algo está realmente mal con el análisis de las citas.

Acabo de intentar importar una instalación recién instalada de phpBB 3.2.8 (instalada en mariadb)

La atribución de citas está rota: el campo del nombre de usuario está en blanco en las citas importadas, pero todo lo demás es legítimo.

captura de pantalla de Discourse de la publicación importada:

Publicación importada de Discourse:

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

segundo
[/quote]

tercero
[/quote]

cuarto

publicación original de 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></QUOTE>

segundo

</e>[/quote]</e></QUOTE>

tercero

</e>[/quote]</e></QUOTE>

cuarto</r> |

quizás termine haciendo mejoras al importador después de todo…

3 Me gusta

Corregido


Soy bastante exigente con la migración de mi foro, así que sigo mejorando el importador. No estoy seguro de si me molestaré en hacer PRs ya que el importador está obsoleto y algunas de mis correcciones son semi-específicas para mi foro, pero esta rama tendrá todas mis correcciones combinadas en caso de que sea útil para alguien:

Corregí el problema de las citas, añadí soporte para algunos bbocodes añadidos comúnmente, hice que el análisis de enlaces de youtube fuera menos defectuoso y doy soporte a la extensión mentions/simplementions. Todavía tengo más cosas que mejorar, como añadir soporte para prefijos de múltiples sitios (el caso de uso principal es cuando tienes enlaces en tu foro a example.com y www.example.com).

Aunque doy soporte a algunas cosas no estándar, no debería ser un problema ejecutarlo en un foro phpBB estándar sin extensiones. Recomiendo usar el mío en cualquier caso.

La forma más fácil de usarlo es clonar mi rama en algún lugar y sobrescribir el directorio del script de importación dentro del contenedor con un montaje bind.

Es decir, clona mis cambios en algún 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

Luego, añade esto a la configuración de tu contenedor import.yml:

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

Luego reconstruye el contenedor de importación. Después de reconstruir, probablemente querrás hacer un reset de dónde clonaste mi repositorio porque el proceso de compilación sobrescribirá mis archivos, lol.

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