Estou usando os scripts de migração para migrar um fórum Vanilla 3 para Discourse auto-hospedado.
O script de migração está funcionando bem: RAILS_ENV=production ruby script/import_scripts/vanilla.rb /shared/uploads/export.text
O único problema é que, depois de fazer a exportação, não consigo reimportar novamente. O script de importação é executado bem pela segunda vez, mas quaisquer alterações de dados que fiz no arquivo de importação não são aplicadas. Além disso, o importador é cerca de 50 vezes mais rápido na segunda execução, o que me faz suspeitar que ele não está realmente importando nada.
Pergunta: existe alguma maneira de reexecutar os scripts de importação localizados em /var/www/discourse/script/import_scripts/
após a primeira execução?
Especificamente, à medida que corrijo bugs no formato do meu arquivo de importação, gostaria de poder reimportar para que as atualizações sejam feitas apenas em posts e discussões.
Até agora, a única solução que encontrei foi destruir toda a instalação do Discourse e começar do zero, o que leva quase uma hora cada vez.
Alguma dica?
Aqui está o 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
Sou programador, mas não programador ruby - existe alguma maneira de modificar este código para forçá-lo a substituir o conteúdo de um post se eu fizer uma reimportação?
Encontrei uma solução alternativa que não é nada mal - à medida que melhoro meu parser que limpa o arquivo de importação do Vanilla, foco em erros que ocorrem em posts específicos.
Portanto, à medida que melhoro meu parser, posso parar o parser no depurador (estou usando Xojo, para que valha a pena) e obter o Texto Bruto.
Então, no fórum do Discourse ativo, posso simplesmente adicionar um novo post, colar o texto e ver como fica.
Isso me permite fazer um ciclo de teste/depuração/alteração de alguns segundos, em vez de cerca de uma hora.
Meu novo plano: depois que eu estiver satisfeito com a limpeza do meu parser, então eu vou destruir o Discourse e reinstalar do zero.
Funciona assim de propósito. A ideia é que você pode fazer uma importação agora e depois executar outra com um dump novo, elas rodarão muito rápido, pois importam apenas os novos dados.
Você precisa remover, criar e migrar o banco de dados para recomeçar.
Se você tiver muitos usuários, pode parar o script depois que os usuários forem importados e fazer um backup, depois restaurar esse backup antes de tentar suas correções.
Isso faz todo o sentido, obrigado por explicar. Seria bom se houvesse uma flag que pudesse ser definida para “forçar sobrescrita”, mas eu vasculhei o código um pouco e não vi nada óbvio.
Existe uma maneira fácil de fazer isso? A única solução que encontrei são esses comandos, que basicamente são os mesmos que iniciar uma nova instalação do docker:
# ATENÇÃO: estes comandos excluem todo o seu fórum Discourse
cd /var/discourse
sudo ./launcher stop app
sudo rm -rf /var/discourse/shared/standalone
sudo ./launcher rebuild app
Leva apenas cerca de 10 minutos, mas depois tenho que passar pela configuração inicial novamente, o que é uma chatice.
Agora essa é uma ideia fantástica! Eu poderia até mesmo fazer um backup após uma nova instalação, mas antes de executar o script de importação, já que reimportar usuários/tópicos/posts/comentários é bem rápido, e este fórum não está ativo para o público.