Este tópico aborda como configurar alguns provedores comuns de armazenamento de objetos compatíveis com S3 (clones do S3). Consulte Set up file and image uploads to S3 para mais detalhes sobre a configuração do Amazon AWS S3, que é oficialmente suportado e usado internamente pelo Discourse para nossos serviços de hospedagem.
| Provedor | Nome do Serviço | Funciona com o Discourse? |
|---|---|---|
| Amazon AWS | S3 | Sim |
| Digital Ocean | Spaces | Sim |
| Linode | Object Storage | Sim |
| Google Cloud | Storage | Sim |
| Scaleway | Object Storage | Sim |
| Vultr | Object Storage | Sim |
| BackBlaze | Cloud Storage | Sim* |
| Auto-hospedado | MinIO | Sim |
| Azure Blob Storage | Flexify.IO | Sim |
| Oracle Cloud | Object Storage | Não [1] |
| Wasabi | Object Storage | Talvez |
| Cloudflare | R2 | Sim |
| Contabo | Object Storage | Não |
Se você conseguiu fazer um serviço diferente funcionar, adicione-o a esta wiki.
Configuração
Para armazenar ativos estáticos do Discourse em seu armazenamento de objetos, adicione esta configuração em seu app.yml na seção 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
Ao usar armazenamento de objetos, você também precisa de uma CDN para servir o que é armazenado no bucket. Eu usei a CDN da StackPath em meus testes e, além de precisar definir Dynamic Caching By Header: Accept-Encoding em sua configuração, funciona bem.
DISCOURSE_CDN_URL é uma CDN que aponta para o nome do host do seu Discourse e faz cache das solicitações. Será usada principalmente para ativos puxáveis: CSS e outros ativos de temas.
DISCOURSE_S3_CDN_URL é uma CDN que aponta para o bucket do seu armazenamento de objetos e faz cache das solicitações. Será usada principalmente para ativos empurráveis: JS, imagens e uploads de usuários.
Recomendamos que sejam diferentes e que os administradores configurem ambas.
Não usar uma CDN (ou inserir a URL do bucket como a URL da CDN) provavelmente causará problemas e não é suportado.
Nos exemplos a seguir, https://falcoland-files-cdn.falco.dev é uma CDN configurada para servir os arquivos dentro do bucket. O nome do bucket foi definido como falcoland-files em meus exemplos.
Configurar essas variáveis de ambiente no seu app.yml é recomendado, pois é assim que a CDCK faz em sua infraestrutura, portanto, é bem testado. Além disso, a tarefa de upload de ativos ocorre após a compilação dos ativos, o que acontece em uma reconstrução. Se você deseja iniciar um Discourse que funcione corretamente com armazenamento de objetos desde o início, você precisa definir as variáveis de ambiente para que os ativos sejam enviados antes que o site seja iniciado.
Escolha seu provedor na lista abaixo e adicione essas configurações à seção env do seu arquivo app.yml, ajustando os valores conforme necessário:
AWS S3
O que oficialmente suportamos e usamos internamente. Sua oferta de CDN, Cloudfront, também funciona para servir os arquivos do bucket. Consulte Set up file and image uploads to S3 para saber como configurar as permissões corretamente.
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
A oferta da DO é boa e funciona imediatamente. É seguro ativar a opção “Restrict File Listing” (Restringir listagem de arquivos). O único problema é que sua oferta de CDN está terivelmente quebrada, então você precisa usar uma CDN diferente para os arquivos. Além disso, você não deve instalar a regra CORS, pois ela a reinstala a cada reconstrução.
Exemplo de configuração:
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
Um parâmetro de configuração extra, HTTP_CONTINUE_TIMEOUT, é necessário para o Linode.
Exemplo de configuração:
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
A listagem de arquivos está quebrada, então você precisa de uma variável de ambiente extra para ignorá-la para que os ativos funcionem. Além disso, ignore o CORS e configure-o manualmente.
Como você não pode listar arquivos, não poderá listar backups e os backups automáticos falharão, portanto, não recomendamos o uso para backups. No entanto, alguns sugerem que, se você alterar a função de Storage Legacy Object Owner para Storage Legacy Bucket Owner, os backups funcionam corretamente. Consulte este tópico para discussões específicas do Google Cloud.
Existe um plugin de terceiros para melhorar a integração em Discourse GCS Helper.
Exemplo de configuração:
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
A oferta da Scaleway também é muito boa e tudo funciona bem na maioria das vezes.
Os uploads multipart da Scaleway suportam apenas um máximo de 1.000 partes. Isso não corresponde ao Amazon S3, que suporta um máximo de 10.000 partes. Para instâncias maiores, isso fará com que o Discourse falhe nos backups e o upload incompleto pode precisar ser excluído manualmente antes de novas tentativas. Para instâncias pequenas, isso não é um problema. A Scaleway parece bastante aberta a feedback, então, se você quiser que esse limite seja alterado, entre em contato com eles.
Observe que, para o parâmetro DISCOURSE_S3_ENDPOINT, o Discourse usa o endpoint de toda a região: https://s3.{region}.scw.cloud. O “Bucket endpoint” encontrado no seu painel da Scaleway vem no formato https://{bucketName}.s3.{region}.scw.cloud. Omita o subdomínio do nome do bucket para evitar erros de conexão.
Exemplo de configuração:
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
Um parâmetro de configuração extra, HTTP_CONTINUE_TIMEOUT, é necessário para o Vultr.
Exemplo de configuração:
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
Você precisa ignorar o CORS e configurá-lo manualmente.
Há relatos de que a função “limpar uploads órfãos” não funciona corretamente com a BackBlaze. Você deve alterar as regras de ciclo de vida do seu bucket para que a limpeza de órfãos funcione.
Exemplo de configuração:
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 a migração inicial para o B2, você pode atingir o limite de 2.500 transações gratuitas diárias da classe C. Você precisará adicionar um método de pagamento para remover os limites.
MinIO Storage Server
Existem algumas ressalvas e requisitos que você precisa garantir que sejam atendidos antes de poder usar o servidor de armazenamento MinIO como alternativa ao S3:
- Você tem uma instância de servidor MinIO totalmente configurada
- Você tem o suporte a domínio ativado na configuração do MinIO, para URLs de buckets baseados em domínio. Esta é uma configuração obrigatória para MinIO e Discourse, pois o MinIO ainda suporta os estilos “path” legados do S3, que não são mais suportados no Discourse.
- Você tem a configuração de DNS corretamente definida para o MinIO, para que os subdomínios do bucket resolvam corretamente para o servidor MinIO e o servidor MinIO esteja configurado com um domínio base (neste caso,
minio.example.com) - O bucket
discourse-dataexiste no servidor MinIO e tem uma política "pública