Este tema cubre cómo configurar algunos proveedores de almacenamiento de objetos compatibles con S3 comunes (clones de S3). Consulta Set up file and image uploads to S3 para más detalles sobre la configuración de Amazon AWS S3, que es oficialmente compatible y utilizada internamente por Discourse para nuestros servicios de alojamiento.
| Proveedor | Nombre del servicio | ¿Funciona con Discourse? |
|---|---|---|
| Amazon AWS | S3 | Sí |
| Digital Ocean | Spaces | Sí |
| Linode | Object Storage | Sí |
| Google Cloud | Storage | Sí |
| Scaleway | Object Storage | Sí |
| Vultr | Object Storage | Sí |
| BackBlaze | Cloud Storage | Sí* |
| Autoalojado | MinIO | Sí |
| Azure Blob Storage | Flexify.IO | Sí |
| Oracle Cloud | Object Storage | No [1] |
| Wasabi | Object Storage | Quizás |
| Cloudflare | R2 | No |
| Contabo | Object Storage | No |
Si has logrado que funcione un servicio diferente, por favor agrégalo a este wiki.
Configuración
Para almacenar los activos estáticos de Discourse en tu almacenamiento de objetos, agrega esta configuración en tu archivo app.yml bajo la sección hooks:
after_assets_precompile:
- exec:
cd: $home
cmd:
- sudo -E -u discourse bundle exec rake s3:upload_assets
- sudo -E -u discourse bundle exec rake s3:expire_missing_assets
Al usar almacenamiento de objetos, también necesitas una CDN para servir lo que se almacena en el bucket. Usé StackPath CDN en mis pruebas y, aparte de necesitar configurar Dynamic Caching By Header: Accept-Encoding en su configuración, funciona bien.
DISCOURSE_CDN_URL es una CDN que apunta a tu nombre de host de Discourse y almacena en caché las solicitudes. Se utilizará principalmente para activos descargables: CSS y otros activos de temas.
DISCOURSE_S3_CDN_URL es una CDN que apunta a tu bucket de almacenamiento de objetos y almacena en caché las solicitudes. Se utilizará principalmente para activos subibles: JS, imágenes y cargas de usuario.
Recomendamos que sean diferentes y que los administradores configuren ambos.
No usar una CDN (o ingresar la URL del bucket como la URL de la CDN) probablemente cause problemas y no es compatible.
En los siguientes ejemplos, https://falcoland-files-cdn.falco.dev es una CDN configurada para servir los archivos bajo el bucket. El nombre del bucket se estableció en falcoland-files en mis ejemplos.
Se recomienda configurar estos ajustes en variables de entorno en tu app.yml porque así es como lo hace CDCK en su infraestructura, por lo que está bien probado. Además, la tarea de cargar activos ocurre después de que los activos se compilan, lo cual sucede en una reconstrucción. Si quieres iniciar un Discourse que funcione correctamente con almacenamiento de objetos desde el principio, necesitas establecer las variables de entorno para que los activos se carguen antes de que el sitio inicie.
Elige tu proveedor de la lista a continuación y agrega estos ajustes a la sección env de tu archivo app.yml, ajustando los valores en consecuencia:
AWS S3
Lo que oficialmente soportamos y usamos internamente. Su oferta de CDN, Cloudfront, también funciona para frontear los archivos del bucket. Consulta Set up file and image uploads to S3 para saber cómo configurar los permisos correctamente.
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: us-west-1
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backups
DISCOURSE_BACKUP_LOCATION: s3
Digital Ocean Spaces
La oferta de DO es buena y funciona sin problemas. Está bien habilitar la restricción de listado de archivos. El único problema es que su oferta de CDN está terriblemente rota, por lo que necesitas usar una CDN diferente para los archivos. Además, no debes instalar la regla CORS, ya que se vuelve a instalar en cada reconstrucción.
Configuración de ejemplo:
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: whatever
DISCOURSE_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backups
DISCOURSE_BACKUP_LOCATION: s3
DISCOURSE_S3_INSTALL_CORS_RULE: false
Linode Object Storage
Se requiere un parámetro de configuración adicional, HTTP_CONTINUE_TIMEOUT, para Linode.
Configuración de ejemplo:
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: us-east-1
DISCOURSE_S3_HTTP_CONTINUE_TIMEOUT: 0
DISCOURSE_S3_ENDPOINT: https://us-east-1.linodeobjects.com
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
DISCOURSE_BACKUP_LOCATION: s3
Google Cloud Platform Storage
El listado de archivos está roto, por lo que necesitas una variable de entorno adicional para omitirlo para que los activos funcionen. También omite CORS y configúralo manualmente.
Dado que no puedes listar archivos, no podrás listar copias de seguridad y las copias de seguridad automáticas fallarán; no recomendamos usarlo para copias de seguridad. Sin embargo, algunos sugieren que si cambias el rol de Storage Legacy Object Owner a Storage Legacy Bucket Owner, las copias de seguridad funcionan correctamente. Consulta este tema para discusión específica de Google Cloud.
Existe un plugin de terceros para mejorar la integración en Discourse GCS Helper.
Configuración de ejemplo:
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: us-east1
DISCOURSE_S3_INSTALL_CORS_RULE: false
FORCE_S3_UPLOADS: 1
DISCOURSE_S3_ENDPOINT: https://storage.googleapis.com
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
#DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
#DISCOURSE_BACKUP_LOCATION: s3
Scaleway Object Storage
La oferta de Scaleway también es muy buena y, en su mayor parte, todo funciona bien.
Las cargas multipart de Scaleway solo admiten un máximo de 1.000 partes. Esto no coincide con Amazon S3, que admite un máximo de 10.000 partes. Para instancias más grandes, esto hará que las copias de seguridad de Discourse fallen y es posible que la carga incompleta necesite ser borrada manualmente antes de realizar nuevos intentos. Para instancias pequeñas, esto no es un problema. Scaleway parece bastante abierto a comentarios, así que si quieres que este límite se cambie, debes contactarlos.
Ten en cuenta que para el parámetro DISCOURSE_S3_ENDPOINT, Discourse usa el endpoint de toda la región: https://s3.{region}.scw.cloud. El „endpoint del bucket