Como criar um script para o assistente de configuração?

Olá,

Parece ser uma FAQ e peço desculpas antecipadamente se for: aparentemente não procurei o suficiente :blush: Como posso escrever um script para fazer o mesmo que o assistente, em vez de fazê-lo pela interface web?

Começaria com algo semelhante ao fixture do Fabricate(admin) dos testes de especificação. E talvez chamado a partir da seção personalizada do container.

Obrigado antecipadamente pela sua ajuda!

O Wizard é metade configurações do site, metade chamadas de API.

Para chamadas de API, você pode ler Como fazer engenharia reversa da API do Discourse e, para configurações do site, siga o exemplo aqui:

2 curtidas

Mas… talvez seja aí que eu esteja perdido: para que eu possa chamar a API, preciso de uma chave de API. E, portanto, de um usuário administrador… que eu ainda não tenho. É possível chamar a API sem uma chave de API? Ou obter uma chave de API que esteja desvinculada de um usuário e tenha credenciais de administrador?

Parece que devo usar rake:admin para criar o usuário administrador. Na verdade, acho que o usuário administrador já foi criado, mas não foi aprovado, então precisaria alterá-lo para que seja aprovado.

Ou talvez eu possa criar uma chave de API com api_key:create_master e usá-la para criar o usuário administrador?

root@forum:/var/www/discourse# RAILS_DB=secondsite rake 'api_key:create_master[MASTERKEY]'
ad676e7413778aaaaa5d315c35f188591ef0edb4a4d4b2d644b9247a88421cfa

Mas parece que não entendo muito bem como essa chave mestra deve ser usada, pois isso não funciona:

# curl -X GET "https://forum2/categories" -H "Accept: application/json" -H "Api-Key: ad676e7413778aa3a5d315c35f91ef0edb4a4d4b2d644b924b7a88421cfa"
{"errors":["You are not permitted to view the requested resource. The API username or key is invalid."],"error_type":"invalid_access"}

No entanto, se eu criar um usuário administrador:

root@forum:/var/www/discourse# RAILS_DB=secondsite rake 'admin:create' 
Email:  loic@dachary.org
Password:  
Repeat password:  

Ensuring account is active!

Account created successfully with username loic
Do you want to grant Admin privileges to this account? (Y/n)  Y

Your account now has Admin privileges!

e depois usar a mesma chave mestra especificando o usuário recém-criado, isso funciona:

curl -X GET "https://forum2/categories" -H "Accept: application/json" -H "Api-Key: ad676e7413778aa3a5d315c358591ef0edb4a4d4b2d644b924b7a88421cfa" -H "Api-Username: loic"
{"category_list":{"can...

e tem privilégios de administrador, já que também pode acessar /admin/site_settings/category/branding

O que você está tentando realizar exatamente? Você quer automatizar a criação de um usuário administrador e configurar algumas definições?

1 curtida

Sim, exatamente. Quero criar um novo fórum do zero e populá-lo com usuários, categorias e tópicos, por meio de um script que não exija nenhuma interação com o navegador.

Talvez seja melhor criar esse banco de dados primeiro e restaurá-lo como parte do processo de instalação?

Não tenho nenhum banco de dados: os usuários, categorias e tópicos serão criados com base nos dados do mailman2.

Se você quiser importar os dados, faça isso como um processo separado.

Se fosse apenas um teste único, tudo bem. Mas quero poder testar o script de importação. E para que o teste seja executado, ele precisa primeiro criar um Discourse do zero, sem exigir algum tipo de intervenção manual no meio do teste automatizado :wink:

Para contextualizar, isso faz parte do trabalho que estou realizando para importar o Mailman2 para o Discourse. O teste seria executado a partir do tox, que:

  • criaria uma nova instância do Discourse
  • executaria vários testes
  • destruiria a instância do Discourse

Supondo uma instalação multisite, a criação de um usuário administrador aprovado e de uma chave de API de administrador pode ser feita com:

  • docker exec app env RAILS_DB=secondsite rake 'api_key:create_master[MINHA_CHAVE]'
  • ( echo usuario1@exemplo.com ; echo $pass ; echo $pass ; echo ) | docker exec -i app env RAILS_DB=secondsite rake 'admin:create'

Nota: se não estiver em uma instalação multisite, basta remover env RAILS_DB=secondsite.

Em seguida, verifique se funciona com:

curl -X GET https://forum2/admin/backups -H "Accept: application/json" -H "Api-Key: 886171a73dd12759b5d6c1915b0f0d4475e8b3fff3d97954b95171200b6" -H "Api-Username: usuario1"
[]

(grande agradecimento a Jay Pfaffman pela inspiração)

Após isso, o Discourse não exige mais a execução do assistente, embora ainda mostre que ele deveria ser executado.

Uma parte significativa da minha renda vem de atividades de importação. Tenho bastante certeza de que o que descrevo abaixo é basicamente como todos que fazem importações regularmente procedem.

O que eu recomendo é:

  • configurar e executar o importador;
  • testar se ele faz o que você deseja;
  • criar um script para reexecutar o importador e importar os dados adquiridos desde a primeira execução;
  • testar isso;
  • executar a importação final quando tudo o acima funcionar;
  • restaurar esses dados no seu servidor de produção.

A tarefa de migração e a configuração de um servidor de produção são totalmente diferentes e têm requisitos distintos. Geralmente, a tarefa de migração exige recursos que o servidor de produção não precisa (embora eu ache que o importador mailmain seja uma exceção).

Executar uma migração em um servidor multisite parece especialmente imprudente.

3 curtidas

Obrigado pelo conselho, vou seguir esse processo. Há mais de 100 GB de arquivos mbox, então serão necessários pelo menos alguns testes.

Sobre isso… parece que o importador de mbox sempre cria uma nova categoria e não consegue usar uma existente. Você sabe algo sobre isso?

Eu não sabia o significado de foolhardy: gostei e vou reutilizá-lo :slight_smile:

Isso é mais uma razão para considerar uma nova execução da importação do zero como uma má ideia. Isso provavelmente levaria semanas. Ao reexecutar o importador, apenas os novos dados são importados (e eu frequentemente o modifico para ignorar completamente os dados antigos).

Você provavelmente pode modificar o script para usar uma categoria existente criando um CategoryCustomField. Recomendo começar com um banco de dados vazio e deixar o script criá-lo; assim, você pode personalizá-lo como desejar e, ao reexecutar o script, ele continuará a usá-lo.

2 curtidas

O verdadeiro risco da sua importação é que provavelmente haverá diferenças nos dados ao longo dos anos, então o que funciona para dados de 10 anos não funcionará para dados de 5 anos e assim por diante. Mas talvez você tenha sorte.

3 curtidas

Isso me fez questionar…](Google Ngram Viewer: Foolhardy)

1 curtida

Não sei se isso é um elogio :wink:
Sempre uso multisite para importações. Isso permite que vários fóruns coexistam: um que estou ajustando enquanto o cliente pode revisar a importação no fórum vizinho. Além disso, é fácil copiar um banco de dados para reiniciar a partir de um determinado ponto.

2 curtidas

Espere… o quê!?

Bom, que o vento me leve! Você é praticamente a única pessoa no planeta que não trabalha na CDCK que eu conheço e que sabe mais sobre importações do que eu. E se você usa multisite para importações, então, bem, eu vou considerar fazer o mesmo. Geralmente, eu levanto containers separados no mesmo host com o traefik na frente, então acho que é meio que a mesma coisa, mas não exatamente.

3 curtidas

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.