J’ai une instance Discourse où, plusieurs mois après sa création initiale, nous avons activé « S3 » (dans notre cas, DigitalOcean Spaces) pendant un certain temps, uniquement via les paramètres d’administration et jamais avec des options de configuration DISCOURSE_ dans le fichier app.yml. Nous n’avons jamais migré l’intégralité des données vers S3, mais la majorité de nos images ont été écrites alors que cette option était activée. Nous souhaitons maintenant tout migrer hors de « S3 » pour diverses raisons qui ne sont pas importantes ici.
(Je sais que cela ressemble à une demande d’assistance pour l’instant. Mais ce n’est pas le cas…)
Dans une PR récemment fusionnée, j’ai ajouté une tâche Rake uploads:batch_migrate_from_s3 comme un simple wrapper autour de uploads:migrate_from_s3 afin de pouvoir migrer des lots aussi petits que les images d’un seul post, et je l’ai exécutée. À ce stade, j’ai découvert que upload:migrate_from_s3, que ma tâche appelle, suppose que discourse.conf contient des paramètres S3 qui ne sont pas disponibles dans l’interface utilisateur :
** 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'
Quelle est la meilleure solution ?
- Il est attendu que la configuration S3 soit toujours effectuée via des variables d’environnement
DISCOURSE_dans le fichier app.yml et écrites dansconfig/discourse.conflors de la construction du conteneur, et je devrais le faire et reconstruire mon application maintenant. (Je note que l’entrée de variable d’environnement pour Rake ne semble pas définirGlobalSettingsici non plus ; j’ai essayé cela aussi. Apparemment, le fait que quoi que ce soit fonctionne avec uniquementSiteSettingsconfiguré est une oversight et non intentionnel.) J’ai testé cela en ajoutants3_bucketdans monconfig/discourse.confdans mon conteneur existant, et cela a résolu l’erreur pour moi. - Modifier davantage la tâche de migration afin que, si
SiteSetting.s3_upload_bucketest défini mais queGlobalSetting.s3_bucketestnil, on affecteGlobalSetting.s3_bucketàSiteSetting.s3_upload_bucket— je suppose que ce ne serait pas un PR difficile si cela est considéré comme correct, mais je n’ai pas encore regardé de près. Édito : J’ai essayé de modifierGlobalSetting.s3_bucketdansuploads:migrate_from_s3et cela n’a pas fonctionné à cause de l’absence d’un accesseur. - Faire en sorte que
SiteSetting.absolute_base_urlutiliseSiteSetting.s3_upload_bucketsiGlobalSetting.s3_bucketestnil— est-ce même une configuration prévue ? - Ajouter la possibilité de définir
s3_bucketdans les paramètres du site afin qu’il soit exposé dans l’interface utilisateur.
La première option relève simplement de la configuration du site, et je vais probablement juste le faire. Si la deuxième est considérée comme une bonne alternative, je suis heureux de tenter un PR. Cependant, je suis encore assez nouveau ici pour ne pas être confiant dans la réalisation de modifications aussi fondamentales que les deux dernières ; les attentes concernant le fonctionnement des objets de configuration sont un peu opaques pour moi.
Pour être clair : j’ai contourné trivialement mon problème ; cela m’a simplement surpris que cela soit nécessaire.