Configura BackBlaze S3 con BunnyCDN

Me llevó una eternidad averiguar cómo hacer todo esto, así que quise crear esta guía para facilitárselo a otros. Servir tus imágenes de esta manera debería hacer que tu sitio web cargue más rápido. Mi configuración de Discourse combina un droplet de DigitalOcean, BackBlaze B2 S3, BunnyCDN y la versión gratuita de Cloudflare.

Elegí estos servicios después de investigar un poco sobre fiabilidad, precios y pruebas de rendimiento. Parecían las mejores opciones para mí. Cloudflare ayuda con la seguridad, pero también ralentizará ligeramente el sitio, según lo que entiendo, por lo que deberías investigar eso. Backblaze tiene asociaciones tanto con Cloudflare como con Bunny que permiten transferencias de datos gratuitas.

Aunque Cloudflare se llama CDN, no funciona como las CDN regulares y probablemente no funcionará por sí sola para configurar S3 con Discourse. Posiblemente necesitarás otro proveedor de CDN; BunnyCDN funciona bien para mí. Si alguien lo ha logrado solo con Cloudflare, avísame cómo :stuck_out_tongue:

Cómo configurar las cargas en S3:
Primero, debes registrarte en Backblaze, luego crear buckets e insertar los detalles en la configuración de Discourse:

Luego regístrate en BunnyCDN y sigue esta guía:

bunny.net - The Global Edge Platform that truly Hops (enlace de referencia, obtengo un crédito de 20 $ en mi factura)

Después de crear tu zona de extracción (pull zone) en BunnyCDN, necesitas obtener la URL correcta para insertarla en la configuración del backend de administración de Discourse para “s3 cdn url”. Ve a tu panel de control de bunnycdn > zonas de extracción > administrar zonas de extracción > haz clic en tu zona > copia la URL junto a “host name”.

La URL debería verse algo así: example.b-cdn.net, pero debes asegurarte de poner https:// al principio, así: https://example.b-cdn.net

Guarda los cambios en el área de configuración de administración de Discourse.

Presiona Ctrl+F5 dos veces en tu navegador en tu sitio de Discourse.

Realiza una prueba subiendo una imagen en el compositor de texto de Discourse. Inspecciona el elemento de la imagen de prueba o visualiza el origen de las imágenes para asegurarte de que funcionó. La URL debería verse diferente a tu dominio normal; debería ser algo como example.b-cdn.net / nombre_archivo.

Ahora, cada vez que alguien suba una imagen, estará en tu bucket de Backblaze y no ocupará espacio en tu droplet de DigitalOcean :stuck_out_tongue:

Respaldar cargas en S3
Si deseas configurar los respaldos de Discourse para que se guarden en tu bucket de Backblaze, debes hacer lo siguiente:

En la guía que publiqué más arriba en este hilo, presta atención a cómo explica que necesitas dos buckets separados. Un bucket es público; este es tu bucket de cargas para que los usuarios suban imágenes en tu foro. El otro bucket es privado; este es tu bucket de respaldos. Es importante hacer respaldos automatizados de Discourse por si algo falla; así podrás cargar tu respaldo y solucionarlo.

En tu panel de control de BunnyCDN, debes crear una segunda zona de extracción. Tu primera zona de extracción era para cargas; esta nueva zona de extracción será para respaldos.

panel de control de bunnycdn > zonas de extracción > agregar zona de extracción

Sigue la misma guía que enlazé anteriormente, “Cómo acelerar la entrega de archivos de Backblaze B2 con BunnyCDN” de BunnyCDN, pero esta vez vincula la nueva zona de extracción a tu bucket de respaldos en lugar de tu bucket de cargas.

Recomiendo usar el “nivel de alto volumen de 5 /TB" en la página de creación de zonas de extracción de BunnyCDN; creo que los respaldos no necesitan el nivel más costoso/rápido "nivel estándar de 10 /TB” que usé para mi bucket de cargas.

Configura tus opciones de respaldo en el área de configuración de administración de Discourse. “ubicación del respaldo” debe estar configurada en S3 y “endpoint de S3” debe apuntar a lo que tienes en Backblaze, algo así:
s3.us-west-002.backblazeb2.com

CTRL+F5 dos veces en tu sitio web para borrar la caché.

Inicia un respaldo y deja que termine. Luego espera 5 minutos y revisa tu carpeta de respaldos en Backblaze; deberías ver el nuevo respaldo allí.

Migrar imágenes antiguas:
Este paso es opcional pero recomendado, especialmente si tienes poco almacenamiento en tu servidor. Así que ya tienes todo configurado para las nuevas cargas de imágenes, pero las imágenes antiguas también pueden transferirse a tus buckets. Para que este proceso funcione, debes seguir esto:

Configurar Cloudflare CDN
Este paso es opcional, ya que Backblaze ha establecido una asociación que hace que la transferencia de datos a Bunny sea gratuita también, pero para seguridad adicional y otras funciones, puedes hacer que los datos pasen primero por Cloudflare y luego hacer que Bunny extraiga los datos desde donde Cloudflare los deja.

https://help.backblaze.com/hc/en-us/articles/217666928-Using-Backblaze-B2-with-the-Cloudflare-CDN

8 Me gusta

Solo quería decir que hice lo mismo que Bill y confirmo que funciona. El único inconveniente es que funciona para archivos nuevos, no para los antiguos. Lo genial del método de Bill es que ni siquiera necesitó una reconstrucción. Sin embargo, espero que alguien descubra cómo hacer que los archivos antiguos también funcionen con S3.

Por cierto, las copias de seguridad tampoco funcionan. Al menos no para mí, y yo hice exactamente lo mismo que Bill.

5 Me gusta

Puedes migrar archivos antiguos usando la tarea de rake.

1 me gusta

Si te refieres a este comando, ya lo intenté y no subió los activos antiguos:

sudo -E -u discourse bundle exec rake s3:upload_assets

También reprocessé mis publicaciones, pero sin éxito.

La tarea es:

cd /var/discourse
./launcher enter app
rails c
rake uploads:migrate_to_s3
cd /var/discourse
./launcher enter app
rails c
rake uploads:migrate_from_s3

¿Funciona esto para ti, @AntiMetaman?
Si es así, lo añadiré a la guía.

Voy a intentar averiguar cómo hacer que las copias de seguridad funcionen correctamente y actualizaré la guía con esa información también. Sé con certeza que necesito crear una segunda zona de extracción.

Tengo copias de seguridad funcionando correctamente con Backblaze… ¿Qué problema estás teniendo?

1 me gusta

Mis copias de seguridad también funcionan bien con este método. Debes tener algo configurado incorrectamente. Actualizaré la guía ahora mismo con cómo configuré las copias de seguridad. @AntiMetaman

Lo siento, no entiendo esto. ¿Cómo es posible que algo funcione correctamente si estás sugiriendo que tengo algo configurado mal?

Está hablándome @itsbhanusharma. Mis copias de seguridad no están funcionando. Mi configuración es la misma que la de Bill. Sin embargo, no utilicé una zona de extracción separada para el bucket de copia de seguridad, así que quizás sea por eso. Solo tengo el nombre del bucket de copia de seguridad en las variables de entorno.

Más tarde probaré la sugerencia de Bhanu de migrar los activos de S3.

He creado dos zonas de extracción (pull zones), una para cada bucket (subida y copia de seguridad). Inicié una copia de seguridad desde mi panel de administración, pero falló. Lo único que Discourse conoce es el nombre del bucket de copias de seguridad.

DISCOURSE_S3_CDN_URL: https://duelistsunite.b-cdn.net
DISCOURSE_S3_BUCKET: s3omega
DISCOURSE_S3_BACKUP_BUCKET: s3omegabackup
DISCOURSE_BACKUP_LOCATION: s3

No estoy seguro de qué me falta. ¿Existe una variable S3_CDN_BACKUP_URL? Dado que la URL es diferente para las copias de seguridad.

@itsbhanusharma Además, intenté tu método, pero migrate_from_S3 no está definido.

Tampoco estaba seguro si te referías a migrate_to_s3, así que lo intenté también, pero eso tampoco estaba definido.

Lo siento por la confusión, me refería a rake uploads:migrate_to_s3

1 me gusta

Parece que aborta la tarea rake porque agrega amazonaws.com a la URL, lo cual es incorrecto. Este es el problema. Si usas un S3 que no es de Amazon, la tarea rake no funcionará, ya que está codificada para modificar la URL.

1 me gusta

¿Puedes confirmar o negar si agregaste la configuración a la sección env de app.yml o si agregaste la configuración a la página Administración > Configuración?

También tengo mis copias de seguridad funcionando con S3. Así que tengo subidas antiguas y nuevas funcionando con S3. Estoy usando Cloudflare para SSL y protección contra DDoS, BunnyCDN para las zonas de subida y extracción de copias de seguridad, y BackBlaze para el almacenamiento S3. ¡Todo perfecto ahora!

Ten en cuenta que es mejor definir las variables de entorno en el archivo app.yml como se muestra aquí: Configure an S3 compatible object storage provider for uploads

Luego reconstruye para que la configuración de S3 esté definida globalmente y no solo en el panel de administración. De esta manera, cuando migres archivos antiguos a S3, podrás hacerlo más fácilmente con 3 comandos:

./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake

3 Me gusta

No estoy seguro de qué me estoy perdiendo aquí. ¿Existe una S3_CDN_BACKUP_URL? Dado que la URL es diferente para la copia de seguridad.

¿Resolviste esta pregunta? Tampoco tengo claro dónde colocar la URL de la zona de extracción que apunta al bucket de copia de seguridad.

Edición: ¿Tengo razón al pensar que el CDN solo es necesario para el bucket de subidas? La guía sobre este tema sugiere que se debe crear una segunda zona de extracción del CDN para el bucket de copias de seguridad. Si eso es incorrecto, tal vez la guía deba actualizarse @Bill

Aparentemente, solo necesita el nombre del bucket de respaldo. A partir del nombre, puede obtener la URL de respaldo de S3, ya que será la misma que la de carga, salvo por la diferencia en el nombre. Por eso no es necesario definir una URL de respaldo de S3 separada. Esto, por supuesto, asume que ambos buckets están en el mismo servicio S3.

Pero si el bucket de respaldo es privado, ¿cómo accedería la CDN a él? Soy nuevo en las CDN y es posible que esté pasando por alto algo, pero sospecho que Discourse no utiliza la CDN en absoluto para los respaldos.

Sí. Fui a mi bucket de respaldo y veo que la copia de seguridad se subió allí. Es privado, pero Discourse puede acceder a él. Puedes configurar los permisos si la URL está disponible. También puedes configurarlo para que solo tu sitio pueda acceder al bucket o cualquier fuente HTTPS.

¿Puedes verificar que la copia de seguridad pasó por la CDN, en lugar de ir directamente desde tu instalación de Discourse a BackBlaze B2?