Este tema cubre cómo configurar algunos proveedores comunes de almacenamiento de objetos compatibles con S3 (clones de S3). Consulte Set up file and image uploads to S3 para obtener más detalles sobre la configuración de Amazon AWS S3, que es compatible oficialmente y se utiliza 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 | Sí |
| Contabo | Object Storage | No |
Si ha logrado que funcione un servicio diferente, agréguelo a esta wiki.
Configuración
Para almacenar los activos estáticos de Discourse en su almacenamiento de objetos, agregue esta configuración en su 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 necesita un CDN para servir lo que se almacena en el bucket. Usé StackPath CDN en mis pruebas y, más allá de necesitar configurar Dynamic Caching By Header: Accept-Encoding en su configuración, funciona bien.
DISCOURSE_CDN_URL es un CDN que apunta a su nombre de host de Discourse y almacena en caché las solicitudes. Se usará principalmente para activos extraíbles: CSS y otros activos de temas.
DISCOURSE_S3_CDN_URL es un CDN que apunta a su bucket de almacenamiento de objetos y almacena en caché las solicitudes. Se usará principalmente para activos empujables: JS, imágenes y cargas de usuarios.
Recomendamos que sean diferentes y que los administradores configuren ambos.
No usar un CDN (o ingresar la URL del bucket como la URL del CDN) probablemente cause problemas y no está soportado.
En los siguientes ejemplos, https://falcoland-files-cdn.falco.dev es un CDN configurado para servir los archivos bajo el bucket. El nombre del bucket se estableció como falcoland-files en mis ejemplos.
Configurar estas opciones en variables de entorno en su app.yml es recomendable porque es así como CDCK lo hace en su infraestructura, por lo que está bien probado. Además, la tarea de subir activos ocurre después de que los activos son compilados, lo cual sucede en una reconstrucción. Si desea iniciar un Discourse que funcione correctamente con almacenamiento de objetos desde el principio, necesita establecer las variables de entorno para que los activos se suban antes de que el sitio comience.
Elija su proveedor de la lista a continuación y agregue estas configuraciones a la sección env de su archivo app.yml, ajustando los valores en consecuencia:
AWS S3
Lo que soportamos oficialmente y usamos internamente. Su oferta de CDN Cloudfront también funciona para frontear los archivos del bucket. Consulte 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 fuera de la caja. Está bien habilitar Restringir listado de archivos. El único problema es que su oferta de CDN está terriblemente rota, por lo que necesita usar un CDN diferente para los archivos. Además, no debe instalar la regla CORS, ya que la reinstala en cada reconstrucción.
Ejemplo de configuración:
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.
Ejemplo de configuración:
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 necesita una variable de entorno adicional para omitirlo para que los activos funcionen. También omita CORS y configúrelo manualmente.
Dado que no puede listar archivos, no podrá 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 cambia el rol de Storage Legacy Object Owner a Storage Legacy Bucket Owner, las copias de seguridad funcionan correctamente. Consulte este tema para la discusión específica de Google Cloud.
Hay un plugin de terceros para mejorar la integración en Discourse GCS Helper.
Ejemplo de configuración:
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 todo funciona bien en su mayoría.
Las cargas multipartitas 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 Discourse fallé en las copias de seguridad y la carga incompleta puede necesitar ser eliminada manualmente antes de realizar más intentos. Para instancias pequeñas, esto no es un problema. Scaleway parece bastante abierto a los comentarios, así que si desea que se cambie este límite, debería contactarlos.
Tenga 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 “Bucket endpoint” que encuentra en su panel de Scaleway viene en la forma https://{bucketName}.s3.{region}.scw.cloud. Omita el subdominio del nombre del bucket para evitar errores de conexión.
Ejemplo de configuración:
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: fr-par
DISCOURSE_S3_ENDPOINT: https://s3.fr-par.scw.cloud
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
Vultr Object Storage
Se requiere un parámetro de configuración adicional, HTTP_CONTINUE_TIMEOUT, para Vultr.
Ejemplo de configuración:
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: whatever
DISCOURSE_S3_HTTP_CONTINUE_TIMEOUT: 0
DISCOURSE_S3_ENDPOINT: https://ewr1.vultrobjects.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
Backblaze B2 Cloud Storage
Debe omitir CORS y configurarlo manualmente.
Hay reportes de que clean up orphan uploads no funciona correctamente con BackBlaze. Debe cambiar las reglas de ciclo de vida de su bucket para que la limpieza de huérfanos funcione.
Ejemplo de configuración:
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: "us-west-002"
DISCOURSE_S3_INSTALL_CORS_RULE: false
DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY: false
DISCOURSE_S3_ENDPOINT: https://s3.us-west-002.backblazeb2.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
Nota: Durante la migración inicial a B2, puede encontrarse con el límite de 2500 transacciones diarias gratuitas de clase C. Necesitará agregar un método de pago para eliminar los límites.
MinIO Storage Server
Hay algunas advertencias y requisitos que debe asegurarse de cumplir antes de poder usar el servidor de almacenamiento MinIO como alternativa a S3:
- Tiene una instancia de servidor MinIO completamente configurada
- Tiene el soporte de dominio habilitado en la configuración de MinIO, para URLs de buckets basadas en dominio. Este es un requisito de configuración obligatorio para MinIO y Discourse, ya que MinIO aún admite los estilos “path” heredados de S3 que ya no son compatibles en Discourse.
- Tiene la configuración de DNS configurada correctamente para MinIO para que los subdominios de los buckets resuelvan correctamente al servidor MinIO y el servidor MinIO está configurado con un dominio base (en este caso,
minio.example.com) - El bucket
discourse-dataexiste en el servidor MinIO y tiene una política “pública” establecida en él - Su URL de CDN S3 apunta a un CDN configurado correctamente que apunta al bucket y almacena en caché las solicitudes, como se mencionó anteriormente en este documento.
- Sus CDNs están configurados para usar realmente un encabezado “Host” de la URL principal de S3 - por ejemplo,
discourse-data.minio.example.comcuando obtiene datos - de lo contrario puede causar problemas CORB.
Asumiendo que se cumplen las advertencias y prerrequisitos anteriores, un ejemplo de configuración sería algo como esto:
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: anything
DISCOURSE_S3_ENDPOINT: https://minio.example.com
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://discourse-data-cdn.example.com
DISCOURSE_S3_BUCKET: discourse-data
DISCOURSE_S3_BACKUP_BUCKET: discourse-backups
DISCOURSE_BACKUP_LOCATION: s3
DISCOURSE_S3_INSTALL_CORS_RULE: false
CORS seguirá estando habilitado en MinIO incluso si la regla no se instala por el reconstructor de la aplicación - por defecto, parece, CORS está habilitado en todos los verbos HTTP en MinIO, y MinIO no admite BucketCORS (API S3) como resultado.
Azure Blob Storage con Flexify.IO
Azure Blob Storage no es un servicio compatible con S3, por lo que no se puede usar con Discourse. Hay un plugin, pero está roto.
La forma más fácil de exponer una interfaz compatible con S3 para Azure Blob Storage es agregar un servidor Flexify.IO que traduzca el protocolo de almacenamiento de Azure a S3.
Hasta la fecha de esta escritura, el servicio es gratuito en Azure y solo necesita una capa de VM muy básica (barata) para comenzar a ejecutarlo. Sin embargo, requiere un poco de configuración.
- En el portal de Azure, cree un nuevo recurso de
Flexify.IO - Amazon S3 API for Azure Blob Storage. - Para uso ligero, la configuración mínima de VM parece funcionar perfectamente. Puede aceptar la mayoría de la configuración predeterminada. Recuerde guardar el archivo de clave PEM cuando cree la VM.
- Vaya al enlace de la VM de Flexify.IO e ingrese al sistema. Siga las instrucciones configurando el proveedor de datos de Azure Blob Storage y el endpoint S3 generado. Asegúrese de que la configuración del endpoint
Public read access to all objects in virtual bucketssea verdadera. Copie la URL del endpoint S3 y las claves. - Presione Nuevo Bucket Virtual y cree un bucket virtual. Puede tener el mismo nombre que su contenedor de Azure Blob Storage, o puede ser un nombre diferente. Vincule cualquier contenedor(s) para fusionar en este bucket virtual. Este bucket virtual se usa para exponer un bucket legible públicamente vía S3.
- Por defecto, Flexify.IO instala un certificado SSL autofirmado, mientras que un endpoint S3 requiere HTTPS. Inicie sesión en la VM usando el archivo de clave (el nombre de usuario es por defecto
azureuser) y reemplace los siguientes archivos con los archivos correctos:
-
/etc/flexify/ssl/cert.pem- reemplace con el archivo de certificado (codificación PEM) -
/etc/flexify/ssl/key.pem- reemplace con el archivo de clave privada (codificación PKCS#8 PEM, ese es el que comienza conBEGIN PRIVATE KEYy noBEGIN RSA PRIVATE KEYque es PKCS#1)Estos archivos son de root, por lo que tendría que usar
sudopara reemplazarlos. Es mejor asegurarse de que los archivos de reemplazo tengan la misma propiedad y permisos que los originales, lo que significaroot:rooty permiso600.
- Por defecto, Flexify.IO crea un servicio S3 de nivel raíz con múltiples buckets. Discourse requiere soporte de subdominio para buckets. Vaya a:
<IP de su VM Flexify.IO>/flexify-io/manage/admin/engines/configs/1que abrirá una página de configuración oculta! - Especifique el dominio base de S3 (digamos que es
s3.mydomain.com) en el campoEndpoint hostname, que debería estar en blanco por defecto. Presione Guardar para guardar la configuración. - Reinicie la VM de Flexify.IO en el portal de Azure.
- En su DNS, mapee
s3.mydomain.comy*.s3.mydomain.coma la IP de la VM de Flexify.IO. - En Discourse, configure lo siguiente en la página de administración (sí, no hay necesidad de que la configuración esté en
app.yml):
use s3: true
s3 region: anything
s3 endpoint: https://s3.mydomain.com
s3 access key: myaccesskey
s3 secret assess key: mysecret key
s3 cdn url: https://<azure-blob-account>.blob.core.windows.net/<container>
s3 bucket: <virtual bucket>
s3 backup bucket: <backup bucket> (cualquier contenedor servirá, ya que no requiere acceso de lectura pública y Flexify.IO los expondrá automáticamente)
backup location: s3
No se recomienda usar el mismo bucket para producción y staging. Si lo hace de todos modos, tome medidas para asegurarse de que su sitio de staging no elimine sus activos de producción (establezca s3 disable cleanup como mínimo, y tenga cuidado de que no elimine las copias de seguridad de producción).
Wasabi
@pfaffman probó wasabi para copias de seguridad, pero parecía fallar intermitentemente y en silencio, dejando copias de seguridad en el disco duro y eventualmente llenando el disco. Ni wasabi ni meta tenían pistas, por lo que no lo recomiendo, aunque sus resultados pueden variar. @pfaffman ahora está bastante seguro de que este problema se debió a que las copias de seguridad y los reinicios automáticos estaban programados al mismo tiempo; se usó solo para copias de seguridad, pero parecía funcionar bien. Si alguien quiere intentarlo y reportar aquí, debería funcionar, al menos para copias de seguridad.
Oracle Cloud
Oracle Cloud no admite el acceso a buckets mediante estilo de host virtual y no funcionará
Cloudflare R2
Cloudflare R2 es compatible con el almacenamiento de objetos S3 cuando se usa Cloudflare CDN. El plan gratuito de Cloudflare ofrece 10 GB de almacenamiento que debería ser más que suficiente para las necesidades de la mayoría de los foros.
Para configurar Cloudflare R2, deberá configurar los ajustes relevantes en el panel de Cloudflare bajo Almacenamiento de Objetos R2.
Dependiendo de sus necesidades (cargas o copias de seguridad o ambos), estos son los ajustes relevantes para insertar en su archivo app.yml o en su búsqueda de Admin-Todos los ajustes del sitio para S3:
DISCOURSE_ENABLE_S3_UPLOADS: true
DISCOURSE_S3_REGION: auto
DISCOURSE_S3_ENDPOINT: https://<your-account-id>.r2.cloudflarestorage.com
DISCOURSE_S3_ACCESS_KEY_ID: "xxx"
DISCOURSE_S3_SECRET_ACCESS_KEY: "xxx"
DISCOURSE_S3_UPLOAD_BUCKET: your-upload-bucket-name
DISCOURSE_S3_CDN_URL: https://uploads.yourdomain.com
# DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: true
DISCOURSE_ENABLE_DIRECT_S3_UPLOADS: true
DISCOURSE_S3_USE_ACLS: false
DISCOURSE_BACKUP_LOCATION: s3
DISCOURSE_S3_BACKUP_BUCKET: your-backup-bucket-name
Si no desea editar su app.yml, puede hacerlo en la interfaz de administración:
“Admin → Todos los ajustes del sitio” (busque S3):
- Habilitar cargas S3 =
true - Habilitar cargas directas S3 =
true - ID de clave de acceso S3 =
"xxx" - Clave de acceso secreto S3 =
"xxx" - Región S3 =
any - Bucket de carga S3 =
your upload bucket name - Endpoint S3 =
https://<your-account-id>.r2.cloudflarestorage.com - URL de CDN S3 =
https://uploads.yourdomain.com - S3 usar ACLs =
false(¡desactive esto!) - Bucket de copia de seguridad S3 =
your backup bucket name - Ubicación de copia de seguridad =
S3
Notas importantes sobre la configuración de Cloudflare R2:
- Al configurar su
app.ymloweb_only.ymlpara Cloudflare R2, solo establezcaDISCOURSE_S3_CDN_URL. NO establezcaDISCOURSE_CDN_URL. Si está proxying su dominio principal a través de Cloudflare, ya está almacenando en caché y sirviendo sus activos de la aplicación automáticamente. Si intenta configurar unDISCOURSE_CDN_URLseparado usando DNS de Cloudflare, el enrutamiento estricto de host de NGINX de Discourse rechazará las solicitudes, resultando en bucles infinitos de redirección 301, bloqueos de política CORS y un sitio roto.
- Deje
DISCOURSE_CDN_URLcomentado. - Establezca
DISCOURSE_S3_CDN_URL: https://your-r2-custom-domain.com
-
Permisos de Token de API: Dado que Discourse solo tiene un conjunto de campos de credenciales, el token de API que genera en Cloudflare debe tener permiso para acceder tanto a su bucket de carga como a su bucket de copia de seguridad. Al crear su token, seleccione “Aplicar a todos los buckets” o use “Aplicar a buckets específicos” y asegúrese de que ambos estén marcados. Además, asegúrese de marcar
Object Read & Writeal crear la clave de API (el predeterminado es soloObject Read only). -
Al copiar la URL del endpoint de Cloudflare, puede agregar el nombre del bucket a la URL: debe eliminar el nombre del bucket del final de la cadena en su archivo
.yml(o ajustes de administración) si se pega. -
Descomente
# DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: truesi desea usar su bucket de carga R2 para todas las cargas, incluidos archivosPDFyZIP. (Tenga en cuenta que esto hará que todos los archivos cargados estén disponibles públicamente mediante enlace directo) -
Si habilita
DISCOURSE_ENABLE_DIRECT_S3_UPLOADS(true), entonces debe deshabilitarDISCOURSE_S3_USE_ACLS(false). Esto se debe a que Cloudflare R2 usa permisos a nivel de bucket; su bucket de carga debe ser público y el bucket de copia de seguridad debe ser privado. Para cargas de Cloudflare R2, NO tiene que configurar las tareas de reglas CORS o escribir json IAM, ya que lo configurará en el panel de Cloudflare cuando configure los permisos de su bucket. El token “Object Read & Write” de Cloudflare otorga automáticamente permisos de carga multipartita, y pegar la siguiente regla CORS directamente en la configuración del bucket de cargas R2 del Panel de Cloudflare bajoCORS Policyreemplaza la necesidad de la tarea rake.
[
{
"AllowedOrigins": [
"https://forum.yourdomain.com"
],
"AllowedMethods": [
"GET",
"PUT",
"POST",
"DELETE",
"HEAD"
],
"AllowedHeaders": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
]
Consulte también este tema para más información sobre la configuración de Cloudflare: Using Discourse with Cloudflare: Best Practices
Contabo
@tuxed intentó hacer que Contabo Object Storage funcionara para cargas compatibles con S3. Parece que al cargar agrega el nombre del repositorio en la URL y no pudo hacerlo funcionar.
Cargas Seguras
Las cargas seguras solo son compatibles con AWS S3. Si su rake uploads:migrate_to_s3 falla, debe ingresar estos comandos para primero contar y luego marcar como no seguras esas cargas, dado que sabe que no necesitan ser seguras, en cuyo caso, necesitará usar AWS S3.
./launcher enter app
rails c
Upload.where(secure: true).count
Upload.where(secure: true).update_all(secure:false)