Migrar una lista de correo a Discourse (mbox, Listserv, Google Groups, etc)

¡Gracias por proporcionar esta guía y script de importación! Lo he utilizado con éxito con un grupo de Google, utilizando Google Takeout. Simplemente coloqué el archivo .mbox en el directorio correcto y ejecuté el script.

Tuve una pregunta sobre la importación de correos electrónicos que tienen padres que no están en el .mbox. Por ejemplo, hay muchos hilos en nuestro grupo que se inician a partir de un reenvío de un correo electrónico que no se envió al grupo, o al agregar el grupo a la lista de respuestas en medio de una conversación para incluirlos.

Actualmente, al importar, parece que estos correos electrónicos anteriores no están presentes. Puedes encontrarlos si haces clic en el ícono del correo electrónico y ves el HTML. Tenía curiosidad si alguien más se encontró con la misma situación y tenía alguna solución. Podría imaginar incluir la cadena de correos electrónicos anterior en la publicación o intentar analizarla y extraer una serie de mensajes de ella y agregarlos todos.

1 me gusta

Tendrías que encontrar una forma de generar esos mensajes a partir del texto citado y añadirlos al archivo mbox (probablemente con encabezados Id) antes de ejecutar el script de importación.

1 me gusta

Esto es realmente excelente. Pero tengo algunos problemas con algunos correos electrónicos que llegan a Discourse con un correo electrónico inicial y luego las respuestas en formato mbox en la misma publicación, sin formato. No estoy seguro de qué está causando esto.

La pregunta es, ¿cómo puedo eliminar todos los correos electrónicos importados (20 años) sin eliminar y recrear la instancia de Discourse de destino?

Soy consciente de que el requisito recomendado de RAM es de 8 GB. Intenté importar 20 años de publicaciones en una máquina virtual de 2 GB y funcionó durante un tiempo y se bloqueó con el mensaje ‘killed’. Las máquinas de 8 GB en proveedores de alojamiento como DigitalOcean son caras (para mí). ¿Hay alguna forma de hacer esto con menos memoria? ¿Importar en lotes más pequeños quizás?

Quizás eliminar esas categorías y luego eliminar los campos personalizados de temas asociados.

No, no creo que puedas hacer mucho con una importación en una máquina pequeña. Podrías intentarlo en un escritorio, pero luego tendrías problemas de ancho de banda para devolver la base de datos a Internet.

1 me gusta

Sé que no hay mucha actividad en este hilo, pero no consigo que funcione correctamente. Muchos de los correos electrónicos en formato mbox que importo no se dividen correctamente. Las líneas “From” se ven así:

From MAILER-DAEMON Tue Nov 01 05:57:09 2022

Pero algunos mensajes se importan correctamente y luego, en el mismo cuerpo, tienen elementos en formato mbox sin procesar que comienzan con la línea “From” típica. En otras palabras, no se están dividiendo. No veo que necesite modificar la expresión regular que hace la división y no sé ruby, así que no puedo depurar el script de importación.

No sé qué hacer a partir de aquí. Hay 20 años de mensajes para importar, así que no puedo revisar los mensajes importados a mano para arreglarlos. En resumen, este script no me funciona. ¿Por qué soy el único al que le pasa esto?

No te pasa solo a ti. Mi primer trabajo pagado en Discourse fue durante meses limpiando archivos mbox antiguos que habían sido editados a mano por alguna razón que no recuerdo.

Parece que necesitas modificar la expresión regular o encontrar alguna otra forma de arreglar los mensajes erróneos. Una forma es usar alguna otra herramienta para dividir los mensajes, uno por archivo.

Por cierto, escribí varios scripts de importación antes de saber ruby.

Cada importación es única. Con 20 años de datos, es muy probable que tengas varios problemas diferentes a medida que las cosas cambiaron en los diversos sistemas que se utilizaron.

2 Me gusta

Tú lo dices. Eso es seguro.

Quiero importar 20 años de mensajes de mi sistema mailman2 a un directorio de archivo, pero no quiero crear identificadores de usuario (ni siquiera provisionales) para ellos, ya que muchos de nuestros suscriptores se han mudado o han fallecido y se crearían muchas cuentas que solo ocuparían espacio.

¿Puedo importarlos todos bajo el mismo identificador de usuario (quizás ‘archive’)?

Y esta puede ser una pregunta tonta, pero dado que la aplicación se apaga durante el proceso de importación, ¿significa eso que los usuarios que se han suscrito a correos electrónicos sobre nuevas publicaciones no se verán inundados con correos electrónicos sobre todos los archivos que se acaban de cargar?

Puedes comentar la función import_users y todos los mensajes serán propiedad del sistema.

No ahorrarás mucho espacio.

Ningún usuario recibirá correos electrónicos hasta que haya utilizado el proceso de “olvidé mi contraseña” para iniciar sesión en su cuenta. Si estás importando estos datos a una comunidad existente, creo que los usuarios recibirán notificaciones sobre los nuevos mensajes creados por el script de importación.

1 me gusta

Gracias, estaba revisando el script de importación y pensé que podría simplemente deshabilitar la sección de nuevos usuarios. Probar eso está en mi lista.

No se trata de espacio en disco, sino de tener posiblemente cientos de cuentas de usuario preparadas que nunca se usarán, por lo que es más como espacio mental o una lista de usuarios muy larga.

Conoces a tus usuarios, pero tener cuentas que nadie usará parece mucho mejor que no saber quién publicó mensajes durante 20 años.

3 Me gusta

Ese es un punto válido, Jay.

No encuentro el archivo import_mbox.sh y cuando intento ejecutar el script mbox.rb directamente, obtengo un montón de errores de Ruby:

root@lists-import:/var/www/discourse/script/import_scripts# ruby mbox.rb mbox
fatal: detected dubious ownership in repository at ‘/var/www/discourse’
To add an exception for this directory, call:

    git config --global --add safe.directory /var/www/discourse

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.7/lib/zeitwerk/loader/callbacks.rb:25:in `on_file_autoloaded’: expected file /var/www/discourse/lib/freedom_patches/pluck_first.rb to define constant FreedomPatches::PluckFirst, but didn’t (Zeitwerk::NameError)

  raise Zeitwerk::NameError.new(msg, cref.last)

Saludos a todos. Qué gran guía. Gracias a Gerhard y a otros por contribuir.

¿Alguien ha adaptado esto para Lyris? Estoy interesado en migrar una instalación histórica y me gustaría entender si hubo alguna preocupación especial que encontraron en un proyecto similar.

Tuve que importar publicaciones de una lista de correo a Discourse y me encontré con dos problemas.

  • No se encontró sqlite3.
  • No pude encontrar import_mbox.sh

Aquí están mis soluciones:

Instalar sqlite3

Agregué a Gemfile:

 gem "sqlite3", "~> 1.3", ">= 1.3.13"

luego ejecuté:

cd discourse
bundle config set frozen false
bundler install

Ejecutar la importación

cd discourse
RAILS_ENV=production bundle exec rails runner script/import_scripts/mbox.rb script/import_scripts/mbox/settings.yml
1 me gusta

Probablemente te perdiste el siguiente paso que está oculto detrás de “Importación regular” en 1.2. Preparación del contenedor Docker.

1 me gusta

Tengo este error can't modify frozen String. ¿Alguien puede sugerir una solución o averiguar qué estoy haciendo mal?

root@sajcf:~# /var/discourse/launcher stop app
Se detectó la arquitectura x86_64.
+ /usr/bin/docker stop -t 600 app
app
root@sajcf:~# /var/discourse/launcher enter import
Se detectó la arquitectura x86_64.
root@sajcf-import:/var/www/discourse# import_mbox.sh
La importación de mbox está comenzando...

Cargando grupos existentes...
Cargando usuarios existentes...
Cargando categorías existentes...
Cargando publicaciones existentes...
Cargando temas existentes...

Creando índice
Indexando archivos en /shared/import/data/jjcf
Indexando /shared/import/data/jjcf/SAJCF.mbox

Indexando respuestas y usuarios

Creando categorías
/var/www/discourse/script/import_scripts/base.rb:447:in `strip!': can't modify frozen String: "jjcf" (FrozenError)
        from /var/www/discourse/script/import_scripts/base.rb:447:in `block in create_categories'
        from /var/www/discourse/script/import_scripts/base.rb:438:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:438:in `create_categories'
        from /var/www/discourse/script/import_scripts/mbox/importer.rb:50:in `import_categories'
        from /var/www/discourse/script/import_scripts/mbox/importer.rb:34:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from script/import_scripts/mbox.rb:13:in `<module:Mbox>'
        from script/import_scripts/mbox.rb:11:in `<module:ImportScripts>'
        from script/import_scripts/mbox.rb:10:in `<main>'

Puedes buscar en Google cómo resolver eso. Creo que un .dup podría ser una forma fácil.

1 me gusta

Para ser más específico, he modificado con éxito el código que permitía la importación, añadiendo .dup en la línea 447 del archivo /var/www/discourse/script/import_scripts/base.rb:

params[:name].dup.strip!

Una cosa no está clara: ¿cómo puedo importar a uno de los sitios múltiples?

¿Alguien ha encontrado un error de “no se puede modificar una cadena congelada”? Mi index.db se crea bien, pero falla al crear categorías.

root@xxxxxxxxxx:/var/www/discourse# import_mbox.sh
El proceso de importación de mbox está comenzando...

Cargando grupos existentes...

Cargando usuarios existentes...

Cargando categorías existentes...

Cargando publicaciones existentes...

Cargando temas existentes...

creando índice

indexando archivos en /shared/import/data/xxxxx-xxxxxxx@xxxxxxx.com

indexando /shared/import/data/xxxxx-xxxxxxx@xxxxxxx.com/export.mbox

indexando respuestas y usuarios

creando categorías

/var/www/discourse/script/import_scripts/base.rb:447:in `strip!': **no se puede modificar una cadena congelada: \"xxxxx-xxxxxxx@xxxxxxx.com\" (****FrozenError****)**

from /var/www/discourse/script/import_scripts/base.rb:447:in `block in create_categories'

from /var/www/discourse/script/import_scripts/base.rb:438:in `each'

from /var/www/discourse/script/import_scripts/base.rb:438:in `create_categories'

from /var/www/discourse/script/import_scripts/mbox/importer.rb:50:in `import_categories'

from /var/www/discourse/script/import_scripts/mbox/importer.rb:34:in `execute'

from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'

from script/import_scripts/mbox.rb:13:in `<module:Mbox>'

from script/import_scripts/mbox.rb:11:in `<module:ImportScripts>'

from script/import_scripts/mbox.rb:10:in `<main>'