Expectativas de configuração do S3 entre configurações globais e de site

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?

  1. É esperado que a configuração do S3 seja sempre feita por meio de variáveis de ambiente DISCOURSE_ no arquivo app.yml e gravadas em config/discourse.conf durante 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 definir GlobalSettings aqui também; tentei isso também. Presumivelmente, o fato de algo ter funcionado com apenas SiteSettings configurados é uma omissão e não intencional.) Testei isso colocando s3_bucket no meu config/discourse.conf no meu contêiner existente e isso resolveu o erro para mim.
  2. Modificar a tarefa de migração ainda mais para que, se SiteSetting.s3_upload_bucket estiver definido, mas GlobalSetting.s3_bucket for nil, definir GlobalSetting.s3_bucket como SiteSetting.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 modificar GlobalSetting.s3_bucket em uploads:migrate_from_s3 e isso não funcionou devido à falta de um acessor.
  3. Fazer com que SiteSetting.absolute_base_url use SiteSetting.s3_upload_bucket se GlobalSetting.s3_bucket for nil — isso é mesmo uma configuração pretendida?
  4. Adicionar a capacidade de definir s3_bucket nas 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.

2 curtidas