Aspettative di configurazione S3 tra impostazioni globali e del sito

Ho un’istanza di Discourse in cui, mesi dopo averla creata inizialmente, abbiamo abilitato “S3” (nel nostro caso, DigitalOcean Spaces) per un periodo, esclusivamente tramite le impostazioni di amministrazione e mai con opzioni di configurazione DISCOURSE_ nel file app.yml. Non abbiamo mai migrato tutto su S3, ma la maggior parte delle nostre immagini è stata salvata mentre era abilitata. Ora vogliamo migrare tutto da “S3” per una serie di motivi non rilevanti qui.

(So che finora sembra un post di supporto. Ma non lo è…)

In una PR recentemente unita, ho aggiunto un task rake uploads:batch_migrate_from_s3 come semplice wrapper attorno a uploads:migrate_from_s3 per poter migrare batch piccoli quanto le immagini di un solo post, e l’ho eseguito. A questo punto ho scoperto che upload:migrate_from_s3, che il mio task chiama, presuppone che discourse.conf contenga impostazioni S3 non disponibili nell’interfaccia utente:

** 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 è la soluzione migliore?

  1. È previsto che la configurazione S3 venga sempre effettuata tramite variabili d’ambiente DISCOURSE_ nel file app.yml e scritta in config/discourse.conf durante la costruzione del container, e dovrei farlo e ricostruire la mia app ora. (Osservo che l’input della variabile d’ambiente per rake non sembra impostare nemmeno GlobalSettings qui; ci ho provato anch’io. Probabilmente, il fatto che qualcosa funzionasse con solo SiteSettings configurati è un errore e non intenzionale.) Ho testato questo inserendo s3_bucket nel mio config/discourse.conf nel mio container esistente e ciò ha risolto l’errore per me.
  2. Modificare ulteriormente il task di migrazione in modo che, se SiteSetting.s3_upload_bucket è impostato ma GlobalSetting.s3_bucket è nil, si imposti GlobalSetting.s3_bucket a SiteSetting.s3_upload_bucket — immagino che questo non sarebbe un PR difficile se considerato corretto, ma non ho ancora dato un’occhiata approfondita. Modifica: ho provato a modificare GlobalSetting.s3_bucket in uploads:migrate_from_s3 e non ha funzionato a causa della mancanza di un accessor.
  3. Far sì che SiteSetting.absolute_base_url utilizzi SiteSetting.s3_upload_bucket se GlobalSetting.s3_bucket è nil — è questa persino una configurazione intesa come corretta?
  4. Aggiungere la possibilità di impostare s3_bucket nelle impostazioni del sito in modo che sia esposta nell’interfaccia utente.

La prima opzione è solo una configurazione del sito, e probabilmente farò proprio questo. Se la seconda è considerata una buona alternativa, sono felice di provare a creare un PR. Tuttavia, sono abbastanza nuovo qui e non mi sento sicuro nel fare modifiche così fondamentali come le ultime due; le aspettative su come funzionano gli oggetti di configurazione sono un po’ oscure per me.

Per essere chiaro: ho risolto il mio problema in modo banale; mi ha solo sorpreso che fosse necessario.

2 Mi Piace