Tenho uma instância do Discourse em que, meses após a criação inicial da instância, habilitamos o “S3” (no nosso caso, Digital Ocean Spaces) por um tempo, apenas nas configurações de administrador, e nunca com nenhuma opção de configuração DISCOURSE_ no arquivo app.yml. Nunca migramos tudo para o S3, mas a maioria das nossas imagens foi gravada enquanto ele estava habilitado. Agora queremos migrar tudo do “S3” por vários motivos que não são importantes aqui.
(Soube que isso parece um post de suporte até agora. Mas não é…)
Em um PR recentemente mesclado, adicionei uma tarefa rake uploads:batch_migrate_from_s3 como um wrapper trivial em torno de uploads:migrate_from_s3 para poder migrar lotes tão pequenos quanto as imagens de apenas uma postagem, e a executei. Nesse ponto, descobri que upload:migrate_from_s3, que minha tarefa chama, assume que o discourse.conf tem configurações de S3 que não estão disponíveis na interface do usuário:
** Invoke uploads:batch_migrate_from_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:batch_migrate_from_s3
Migrating uploads from S3 to local storage for 'default'...
rake aborted!
NoMethodError: undefined method `downcase' for nil:NilClass
/var/www/discourse/app/models/global_setting.rb:107:in `s3_bucket_name'
/var/www/discourse/app/models/site_setting.rb:157:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'
Qual é a melhor solução?
- É esperado que a configuração do S3 seja sempre feita por meio de variáveis de ambiente
DISCOURSE_no arquivo app.yml e gravadas emconfig/discourse.confdurante a construção do contêiner, e eu deveria fazer isso e reconstruir meu app agora. (Observo que a entrada de variável de ambiente para o rake não parece definirGlobalSettingsaqui também; tentei isso também. Presumivelmente, o fato de algo ter funcionado com apenasSiteSettingsconfigurados é uma omissão e não intencional.) Testei isso colocandos3_bucketno meuconfig/discourse.confno meu contêiner existente e isso resolveu o erro para mim. - Modificar a tarefa de migração ainda mais para que, se
SiteSetting.s3_upload_bucketestiver definido, masGlobalSetting.s3_bucketfornil, definirGlobalSetting.s3_bucketcomoSiteSetting.s3_upload_bucket— estou supondo que isso não seria um PR difícil se for considerado correto, mas ainda não olhei com muita atenção. Edição: Tentei modificarGlobalSetting.s3_bucketemuploads:migrate_from_s3e isso não funcionou devido à falta de um acessor. - Fazer com que
SiteSetting.absolute_base_urluseSiteSetting.s3_upload_bucketseGlobalSetting.s3_bucketfornil— isso é mesmo uma configuração pretendida? - Adicionar a capacidade de definir
s3_bucketnas configurações do site para que fique exposta na interface do usuário.
A primeira é apenas configuração do site, e eu provavelmente farei isso. Se a segunda for considerada uma boa alternativa, estou feliz em tentar fazer um PR. No entanto, sou novo o suficiente aqui para não ter confiança em fazer mudanças tão centrais quanto as duas últimas; as expectativas sobre como os objetos de configuração funcionam são um pouco opacas para mim.
Para ficar claro: eu já contornei trivialmente meu problema; apenas me surpreendeu que fosse necessário.