Estoy usando los scripts de migración para migrar un foro Vanilla 3 a Discourse autoalojado.
El script de migración funciona bien: RAILS_ENV=production ruby script/import_scripts/vanilla.rb /shared/uploads/export.text
El único problema es que una vez que he hecho la exportación, no parece que pueda volver a importar. El script de importación se ejecuta bien por segunda vez, pero los cambios de datos que hice en el archivo de importación no se aplican. Además, el importador se ejecuta unas 50 veces más rápido en la segunda ejecución, lo que me hace sospechar que en realidad no está importando nada.
Pregunta: ¿hay alguna forma de volver a ejecutar los scripts de importación ubicados en /var/www/discourse/script/import_scripts/
después de la primera ejecución?
Específicamente, a medida que corrijo errores en el formato de mi archivo de importación, me gustaría poder volver a importar para que solo se realicen actualizaciones en las publicaciones y discusiones.
Hasta ahora, la única solución que encontré fue eliminar por completo la instalación de Discourse y empezar de cero, lo que lleva casi una hora cada vez.
¿Algún consejo?
Aquí está el código relevante de vanilla.rb:
def import_posts
puts "", "importing posts..."
create_posts(@comments) do |comment|
next unless t = topic_lookup_from_imported_post_id("discussion#" + comment[:discussion_id])
{
id: "comment#" + comment[:comment_id],
user_id:
user_id_from_imported_user_id(comment[:insert_user_id]) || Discourse::SYSTEM_USER_ID,
topic_id: t[:topic_id],
raw: clean_up(comment[:body]),
created_at: parse_date(comment[:date_inserted]),
}
end
end
Soy programador pero no de Ruby, ¿hay alguna forma de modificar este código para forzarlo a reemplazar el contenido de una publicación si vuelvo a importar?
Encontré una solución alternativa que no está nada mal: a medida que mejoro mi analizador que limpia el archivo de importación de Vanilla, me concentro en los errores que ocurren en publicaciones específicas.
Así que, a medida que mejoro mi analizador, puedo detener el analizador en el depurador (estoy usando Xojo, por si sirve de algo) y obtener el texto sin procesar.
Luego, en el foro de Discourse activo, puedo simplemente agregar una nueva publicación, pegar el texto y ver cómo se ve.
Esto me permite hacer un ciclo de prueba/depuración/cambio de unos pocos segundos, en lugar de aproximadamente una hora.
Mi nuevo plan: después de que esté satisfecho con la limpieza de mi analizador, eliminaré Discourse y lo reinstalaré desde cero.
Funciona así a propósito. La idea es que puedas hacer una importación ahora y luego ejecutar otra con un volcado nuevo; estas se ejecutarán muy rápido ya que solo importan los datos nuevos.
Necesitas eliminar, crear y migrar la base de datos para empezar de nuevo.
Si tienes muchos usuarios, podrías detener el script después de que se importaran los usuarios y hacer una copia de seguridad, y luego restaurar esa copia de seguridad antes de intentar tus correcciones.
Tiene perfecto sentido, gracias por explicarlo. Sería bueno si hubiera una bandera que se pudiera establecer para “forzar la sobrescritura”, pero he revisado el código un poco y no he visto nada obvio.
¿Hay una forma fácil de hacer eso? La única solución que he encontrado son estos comandos, que básicamente son lo mismo que iniciar una instalación nueva de docker:
# ADVERTENCIA: estos comandos eliminan todo tu foro de Discourse
cd /var/discourse
sudo ./launcher stop app
sudo rm -rf /var/discourse/shared/standalone
sudo ./launcher rebuild app
Solo toma unos 10 minutos, pero luego tengo que pasar por la configuración inicial nuevamente, lo cual es una molestia.
¡Esa es una idea fantástica! Incluso podría hacer una copia de seguridad después de una instalación nueva, pero antes de ejecutar el script de importación, ya que la reimportación de usuarios/temas/publicaciones/comentarios es bastante rápida, y este foro no está en vivo para el público.