Expectativas de configuración de S3 entre ajustes globales y del sitio

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?

  1. Se espera que la configuración de S3 siempre se realice mediante variables de entorno DISCOURSE_ en el archivo app.yml y se escriba en config/discourse.conf durante 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 establecer GlobalSettings aquí tampoco; lo he intentado también. Presumiblemente, el hecho de que algo funcionara con solo SiteSettings configurado es un descuido e involuntario.) Probé esto poniendo s3_bucket en mi config/discourse.conf en mi contenedor existente y resolvió el error para mí.
  2. Modificar aún más la tarea de migración para que, si SiteSetting.s3_upload_bucket está configurado pero GlobalSetting.s3_bucket es nil, establecer GlobalSetting.s3_bucket en SiteSetting.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é modificar GlobalSetting.s3_bucket en uploads:migrate_from_s3 y no funcionó debido a la falta de un accesorio.
  3. Hacer que SiteSetting.absolute_base_url use SiteSetting.s3_upload_bucket si GlobalSetting.s3_bucket es nil. ¿Es esto incluso una configuración pretendida?
  4. Agregar la capacidad de establecer s3_bucket en 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.

2 Me gusta