Tengo una instancia de Discourse en la que, meses después de crearla inicialmente, habilitamos “S3” (en nuestro caso, Digital Ocean Spaces) durante un tiempo, solo mediante la configuración de administrador y nunca con ninguna opción de configuración DISCOURSE_ en el archivo app.yml. Nunca migramos todo a S3, pero la mayoría de nuestras imágenes se escribieron mientras lo teníamos habilitado. Ahora queremos migrar todo fuera de “S3” por diversas razones que no son importantes aquí.
(Sé que esto suena como una publicación de soporte hasta ahora. Pero no lo es…)
En una PR fusionada recientemente, agregué una tarea rake uploads:batch_migrate_from_s3 como un envoltorio trivial alrededor de uploads:migrate_from_s3 para poder migrar lotes tan pequeños como las imágenes de un solo post, y la ejecuté. En este punto, descubrí que upload:migrate_from_s3, que mi tarea llama, asume que discourse.conf tiene configuraciones de S3 que no están disponibles en la interfaz de usuario:
** 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'
¿Cuál es la mejor solución?
- Se espera que la configuración de S3 siempre se realice mediante variables de entorno
DISCOURSE_en el archivo app.yml y se escriba enconfig/discourse.confdurante la construcción del contenedor, y debería hacer eso y reconstruir mi aplicación ahora. (Noto que la entrada de variable de entorno para rake no parece establecerGlobalSettingsaquí tampoco; lo he intentado también. Presumiblemente, el hecho de que algo funcionara con soloSiteSettingsconfigurado es un descuido e involuntario.) Probé esto poniendos3_bucketen miconfig/discourse.confen mi contenedor existente y resolvió el error para mí. - Modificar aún más la tarea de migración para que, si
SiteSetting.s3_upload_bucketestá configurado peroGlobalSetting.s3_bucketesnil, establecerGlobalSetting.s3_bucketenSiteSetting.s3_upload_bucket. Adivino que esto no sería una PR difícil si se considera correcto, pero aún no lo he examinado a fondo. Edición: Intenté modificarGlobalSetting.s3_bucketenuploads:migrate_from_s3y no funcionó debido a la falta de un accesorio. - Hacer que
SiteSetting.absolute_base_urluseSiteSetting.s3_upload_bucketsiGlobalSetting.s3_bucketesnil. ¿Es esto incluso una configuración pretendida? - Agregar la capacidad de establecer
s3_bucketen la configuración del sitio para que esté expuesto en la interfaz de usuario.
La primera es solo configuración del sitio, y probablemente solo lo haré. Si la segunda se considera una buena alternativa, estaré encantado de intentarla en una PR. Sin embargo, soy lo suficientemente nuevo aquí como para no tener confianza en hacer cambios tan centrales como los dos últimos; las expectativas sobre cómo funcionan los objetos de configuración son un poco opacas para mí.
Para ser claro: He solucionado trivialmente mi problema; solo me sorprendió que fuera necesario.