Mi viaje de migración de phpBB (postgresql)

las publicaciones eliminadas de forma lógica se importan como publicaciones normales (y son visibles). esto es claramente un problema porque creo que los usuarios eliminan de forma lógica por defecto, y las publicaciones eliminadas pueden contener información sensible.

las columnas relevantes incluyen: post_delete_user, post_delete_time, post_visibility, post_delete_reason

parece que post_visibility es la única relevante: los valores de las otras columnas no se borran si una publicación se elimina de forma lógica y luego se restaura. normal = 1, invisible = 2

mi solución es simplemente descartar las publicaciones eliminadas de forma lógica porque a nadie le importan.

ejecuta esto en tu base de datos de origen antes de la migración:

DELETE FROM phpbb_posts WHERE post_visibility = 2;
1 me gusta

tengo un pipeline de “migración continua” de hombre pobre. es un montón de scripts de shell para hacer tareas como:

  • extraer la base de datos de phpbb, archivos adjuntos, etc. del servidor remoto
  • crear/administrar instancias de discourse
  • se aplican site_settings específicos cuando se crea una instancia de discourse a partir de una instancia de plantilla
  • hacer copias de seguridad/restaurarlas
  • ejecutar la migración con un conjunto específico de scripts de importación de un repositorio de git
  • hacer tareas posteriores a la migración

básicamente, esto me permite trabajar en una instancia de discourse dctemplate pre-migración con la que juego. sigo ajustando la configuración de discourse a mi gusto.

por la noche, extraigo de la phpbb en vivo existente y hago una nueva migración en una nueva instancia de discourse (dcstaging) recién creada a partir de la plantilla más reciente.

hacer esto lleva horas, por supuesto, así que también tengo una phpbb local en ejecución con una base de datos muy pequeña que uso para hacer pruebas y mejorar los scripts de migración. puedo hacer migraciones relativamente rápidas para probar en otra instancia de discourse (dcdev).

así que el flujo de trabajo de prueba durante el día es como

hice algo de trabajo en la plantilla, me gusta dónde estoy:

./dc_template_create.sh dctemplate

ups, cometí un error en mi plantilla. restáurala al estado anterior:

./dc_template_restore.sh dctemplate

hago una migración rápida para probar algunas cosas

# crea una nueva instancia dcdev de dctemplate (y aplica site_settings específicos a dcdev)
./dc_template_restore.sh dcdev dctemplate
./dc_migrate.sh dcdev # se ejecuta con el repositorio de script de migración específico para esa instancia

hago una migración larga durante la noche desde la phpbb real y en vivo:

./dc_template_create.sh dctemplate
./dc_template_restore.sh dcstaging dctemplate

./phpbb_pull.sh
./dc_migrate.sh dcstaging
sleep 300
./dc_rake.sh dcstaging # tareas adicionales posteriores a la migración no manejadas por el importador para (crear moderadores, etiquetado detallado, mover algunos temas, etc.)

si a alguien le interesa lo suficiente, podría limpiarlo un poco y compartirlo.

2 Me gusta

Discourse tiene etiquetas, por lo que podría ser aconsejable aprovecharlas y eliminar las subcategorías donde tenga sentido.

Mis subcategorías tenían cada una varios temas fijados/pegajosos, y al combinarse en una gran categoría, son demasiados temas fijados. Es disruptivo.

Mi solución fue pasar de categorías como:

Comida
- Americana
- China
- ...

a esto:

Comida
- Destacados

Americana, china, etc. se convierten en etiquetas, y todos los temas fijados van a Destacados y se desanclan.

# Desanclar todos los temas fijados en una categoría y moverlos a una subcategoría
def move_pinned_topics_to_subcategory(category, subcategory_name)
  subcategory = Category.where(name: subcategory_name).find_by(parent_category_id: category.id)
  topics = Topic.where(category_id: category.id).where.not(pinned_at: nil)
  topics.each do |topic|
    topic.update(pinned_at: nil, pinned_globally: false, pinned_until: nil,
      category_id: subcategory.id) if not topic.title[/Acerca de la categoría .+/]
  end
  Category.update_stats
end

food_cat = Category.find_by(name: 'Comida')
move_pinned_topics_to_subcategory(food_cat, 'Destacados')
4 Me gusta

mi foro también tiene una encarnación anterior y muerta (también phpBB) de la que tenemos un wget siterip, así que estoy trabajando en un importador para eso. Analizar archivos html con nokogiri, ingerir en una base de datos intermedia y luego trabajar con la clase base del importador para obtener filas en discourse.

Vi esto:

Supongo que este es un problema poco común, pero si alguien más se enfrenta a este problema, tal vez le ponga un poco más de cuidado y lo comparta. Avísame.

O si alguien ya ha hecho esto y quiere compartirlo conmigo, eso es aún mejor. Aún no he avanzado mucho en el proyecto.

2 Me gusta