为上传配置与 S3 兼容的对象存储提供商

:information_source: 本主题介绍如何配置一些常见的 S3 兼容对象存储提供商(S3 克隆版)。有关 Amazon AWS S3 配置的更多详细信息(该配置是官方支持的,并且 Discourse 内部用于我们的托管服务),请参阅 https://meta.discourse.org/t/setting-up-file-and-image-uploads-to-s3/7229。

提供商 服务名称 是否适用于 Discourse?
Amazon AWS S3
Digital Ocean Spaces
Linode Object Storage
Google Cloud Storage
Scaleway Object Storage
Vultr Object Storage
BackBlaze Cloud Storage 是*
自托管 MinIO
Azure Blob Storage Flexify.IO
Oracle Cloud Object Storage [1]
Wasabi Object Storage 可能
Cloudflare R2
Contabo Object Storage

如果您成功使用了其他服务,请将其添加到本维基中。

配置

若要将在您的对象存储中存储 Discourse 静态资源,请在 app.yml 文件的 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

使用对象存储时,您还需要一个 CDN 来提供存储在桶中的内容。我在测试中使用了 StackPath CDN,除了需要在他们的配置中设置Dynamic Caching By Header: Accept-Encoding外,其他方面运行正常。

DISCOURSE_CDN_URL 是一个指向您 Discourse 主机名并缓存请求的 CDN。它主要用于可拉取的资源:CSS 和其他主题资源。

DISCOURSE_S3_CDN_URL 是一个指向您对象存储桶并缓存请求的 CDN。它主要用于可推送的资源:JS、图片和用户上传。

我们建议这两个地址不同,并且管理员应同时设置两者。

不使用 CDN(或将桶 URL 作为 CDN URL 输入)可能会导致问题,且不受支持。

在以下示例中,https://falcoland-files-cdn.falco.dev 是一个配置为提供桶下文件的 CDN。在我的示例中,桶名称设置为 falcoland-files

建议在您的 app.yml 中通过环境变量配置这些设置,因为这是 CDCK 在其基础设施中采用的方式,因此经过充分测试。此外,上传资源的任务发生在资源编译之后,而资源编译发生在重建过程中。如果您希望从一开始就运行一个能正常与对象存储配合工作的 Discourse,则需要设置环境变量,以便在站点启动前上传资源。

从下面的列表中选择您的提供商,并将这些设置添加到 app.yml 文件的 env 部分,相应地调整值:

AWS S3

这是我们官方支持并在内部使用的服务。他们的 CDN 产品 Cloudfront 也可以用于提供桶文件。有关如何正确配置权限,请参阅 https://meta.discourse.org/t/setting-up-file-and-image-uploads-to-s3/7229。

  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

Digital Ocean 的产品表现良好,开箱即用。启用“限制文件列表”功能是可以的。唯一的问题是他们的 CDN 产品 存在严重缺陷,因此您需要使用不同的 CDN 来提供文件。此外,您不需要安装 CORS 规则,因为它会在每次重建时重新安装。

示例配置:

  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

Linode 需要额外的配置参数 HTTP_CONTINUE_TIMEOUT

示例配置:

  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

文件列表功能存在缺陷,因此您需要添加一个额外的环境变量来跳过该功能,以便资源能够正常工作。同时跳过 CORS 并手动配置它。

:warning: 由于您无法列出文件,因此无法列出备份,自动备份将会失败,我们不推荐将其用于备份。不过,有人建议如果将角色从 Storage Legacy Object Owner 更改为 Storage Legacy Bucket Owner,备份可以正常工作。有关 Google Cloud 的特定讨论,请参阅 此主题

有一个第三方插件可以更好地集成,详见 https://meta.discourse.org/t/discourse-gcs-helper/247705。

示例配置:

  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

Scaleway 的产品也非常好,大部分功能都能正常工作。

:warning: Scaleway 的多部分上传仅支持 最多 1,000 个部分。这与 Amazon S3 不同,后者支持最多 10,000 个部分。对于较大的实例,这将导致 Discourse 备份失败,并且可能需要 手动删除 未完成的上传,然后才能进行进一步尝试。对于小型实例,这不是问题。Scaleway 似乎很乐意接受反馈,如果您希望更改此限制,应联系他们。

请注意,对于 DISCOURSE_S3_ENDPOINT 参数,Discourse 使用的是整个区域的端点:https://s3.{region}.scw.cloud。您在 Scaleway 仪表板中找到的“桶端点”形式为 https://{bucketName}.s3.{region}.scw.cloud。请省略桶名称子域名以防止连接错误。

示例配置:

  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

Vultr 需要额外的配置参数 HTTP_CONTINUE_TIMEOUT

示例配置:

  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

您需要跳过 CORS 并手动配置它。

报告 指出 clean up orphan uploads(清理孤儿上传)无法在 BackBlaze 上正常工作。您必须 更改桶的生命周期规则 才能使孤儿清理正常工作。

示例配置:

  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

注意:在初始迁移到 B2 期间,您可能会遇到 2500 次免费每日 C 类交易限制。您需要添加付款方式以解除限制。

MinIO Storage Server

在使用 MinIO 存储服务器作为 S3 的替代方案之前,您需要确保满足一些注意事项和要求:

  1. 您拥有一个完全配置的 MinIO 服务器实例
  2. 您已在 MinIO 配置中启用了域支持,以支持基于域名的桶 URL。这是 MinIO 和 Discourse 的强制性设置要求,因为 MinIO 仍支持不再受 Discourse 支持的旧版 S3“路径”样式。
  3. 您已为 MinIO 正确设置了 DNS 配置,以便桶子域名能正确解析到 MinIO 服务器,并且 MinIO 服务器已配置了基础域(在此例中为 minio.example.com
  4. discourse-data 存在于 MinIO 服务器上,并且已对其设置了“公开”策略
  5. 您的 S3 CDN URL 指向一个正确配置的 CDN,该 CDN 指向桶并缓存请求,如本文档前面所述。
  6. 您的 CDN 配置为在实际获取数据时使用核心 S3 URL 的“Host”标头——例如 discourse-data.minio.example.com——否则可能会导致 CORB 问题。

假设上述注意事项和先决条件已满足,示例配置如下:

  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 仍将在 MinIO 上启用——默认情况下,MinIO 在所有 HTTP 动词上启用了 CORS,因此 MinIO 不支持 BucketCORS(S3 API)。

Azure Blob Storage with Flexify.IO

Azure Blob Storage 不是 S3 兼容服务,因此无法与 Discourse 一起使用。有一个插件,但它已损坏。

Azure Blob Storage 提供 S3 兼容接口的最简单方法是添加一个 Flexify.IO 服务器,该服务器将 Azure 存储协议 翻译 为 S3。

截至撰写本文时,该服务在 Azure 上是免费的,您只需要一个非常基本(便宜)的 VM 层级即可开始运行。不过,它确实需要一些设置。

  1. 在 Azure 门户中,创建一个名为 Flexify.IO - Amazon S3 API for Azure Blob Storage 的新资源。
  2. 对于轻度使用,最低 VM 配置似乎就足够了。您可以接受大多数默认配置。创建 VM 时,请务必保存 PEM 密钥文件。
  3. 浏览到 Flexify.IO VM 链接并进入系统。按照说明设置 Azure Blob Storage 数据提供程序和生成的 S3 端点。确保端点配置设置虚拟桶中所有对象的公共读取访问为 true。复制 S3 端点 URL 和密钥。
  4. 按下 New Virtual Bucket 并创建一个虚拟桶。它可以与您的 Azure Blob Storage 容器同名,也可以是不同的名称。链接任何容器以合并到此虚拟桶中。此虚拟桶用于通过 S3 暴露一个公开可读的桶。
  5. 默认情况下,Flexify.IO 安装自签名 SSL 证书,而 S3 端点需要 HTTPS。使用密钥文件 SSH 到 VM(默认用户名为 azureuser),并用正确的文件替换以下文件:
  • /etc/flexify/ssl/cert.pem - 替换为证书文件(PEM 编码)

  • /etc/flexify/ssl/key.pem - 替换为私钥文件(PKCS#8 PEM 编码,即以 BEGIN PRIVATE KEY 开头而不是以 BEGIN RSA PRIVATE KEY 开头的 PKCS#1)

    这些文件属于 root 用户,因此您必须使用 sudo 来替换它们。最好确保替换文件具有与原始文件相同的权限和所有权,即 root:root600 权限。

  1. 默认情况下,Flexify.IO 创建一个具有多个桶的根级 S3 服务。Discourse 需要桶的 子域名 支持。转到:<your Flexify.IO VM IP>/flexify-io/manage/admin/engines/configs/1,这将打开一个 隐藏 配置页面!
  2. Endpoint hostname 字段中指定 S3 基础域(例如 s3.mydomain.com),该字段默认应为空白。按下 Save 保存设置。
  3. 在 Azure 门户中重启 Flexify.IO VM。
  4. 在您的 DNS 中,将 s3.mydomain.com*.s3.mydomain.com 映射到 Flexify.IO VM IP。
  5. 在 Discourse 的管理页面中设置以下内容(是的,不需要将这些设置放在 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>  (任何容器都可以,因为它不需要公共读取访问,Flexify.IO 会自动暴露它们)
backup location: s3

不建议在生产环境和测试环境使用同一个桶。如果您执意这样做,请采取措施确保您的测试站点不会删除生产资源(至少设置 s3 disable cleanup,并留意它是否删除了生产的备份)。

Wasabi

@pfaffman 尝试使用 Wasabi 进行备份,但它似乎间歇性且静默地失败,导致备份留在硬盘上并最终填满磁盘。Wasabi 和 meta 都没有提供任何线索,因此我不推荐它,尽管您的体验可能有所不同。 @pfaffman 现在相当确定这个问题是由于备份和自动重启被安排在同一时间导致的;它仅用于备份,但似乎运行正常。如果有人想尝试并在此报告,它应该可以工作,至少对于备份来说是这样。

Oracle Cloud

Oracle Cloud 不支持虚拟主机风格的桶访问,并且 无法正常工作

Cloudflare

Cloudflare 的产品不兼容。在测试中,@fearlessfrog 向 Cloudflare 提交了一张工单,2022 年 12 月他们回复说:

Contabo

@tuxed 尝试让 Contabo Object Storage 支持 S3 兼容上传。似乎上传时它会在 URL 中前缀仓库名称,他无法使其正常工作。

安全上传

安全上传仅支持 AWS S3。如果您的 rake uploads:migrate_to_s3 失败,您应该输入以下命令先计数,然后将那些不需要安全的上传标记为不安全(如果您知道它们不需要安全),在这种情况下,您将需要使用 AWS S3。

./launcher enter app
rails c
Upload.where(secure: true).count
Upload.where(secure: true).update_all(secure:false)

  1. Oracle Cloud 不支持虚拟主机风格的桶访问,并且 无法正常工作 ↩︎

69 个赞
Defining DISCOURSE_S3_CDN_URL links to assets in S3 CDN URL
Backblaze S3 issue: duplicated uploads after delete
Migrate from AWS to Digital Ocean with 2 containers, spaces and 2 CDNs
Using Scaleway s3-compatible object storage
Extend S3 configuration for other s3 API compatible cloud storage solutions
Set up BackBlaze S3 with BunnyCDN
Can not access backup page and related error when restoring using GCP Object Storage
Setting up backup and image uploads to Backblaze B2
Upload assets to S3 after in-browser upgrade
What are the right settings to use S3 bucket (with non-Amazon URL)?
Use WebTorrent to load media objects
Issues with changing File/Image upload location to S3 Server from local storage
Hosting Optimization with Digital Ocean
Hosting Optimization with Digital Ocean
Theme modifiers: A brief introduction
Configure automatic backups for Discourse
Problem with Backblaze for backup- Failed to list backups from S3: Signature validation failed
Move from BackBlaze B2 to Digital Ocean Spaces
Which free storage for many images? also to be used for thumbnails etc
Migrate from AWS to Digital Ocean with 2 containers, spaces and 2 CDNs
Restore Failure - S3 (compatible) backup
Restore Failure - S3 (compatible) backup
Digitalocean block storage VS amazon S3
Digitalocean block storage VS amazon S3
Custom emoji don't use CDN for S3 stored assets in a few pages
Admin upgrade page doesn't load with a CDN
Install Discourse for Production Environment on Windows Server
Running Discourse on Azure Web Sites vs. Azure VM?
How to turn off S3 storage?
Access Denied error message when trying to upload images
What are the right settings to use S3 bucket (with non-Amazon URL)?
REQ: Support S3 backup to a service like Backblaze
REQ: Support S3 backup to a service like Backblaze
Using Scaleway s3-compatible object storage
Overwrite meta og:image image source to use externally public loaded images on topics?
How to store uploads with multiple web_only servers?
Can not edit topics with picture with S3 backend
Finding UI generated backup and restoring site
Looking for doc to connect discourse with digital ocean spaces
Looking for doc to connect discourse with digital ocean spaces
Looking for doc to connect discourse with digital ocean spaces
403 Error with digital ocean cdn
Link to headers (anchor links)
NoMethodError downcase s3_bucket_name absolute_base_url
What should I enter in the S3 CDN settings if I don't have a CDN?
Backing up files in Object Storage
Minio: A header you provided implies S3 functionality that is not implemented
Configure automatic backups for Discourse
S3 OVH Object Storage
File directory system
Unable to backup or navigate to backups
Uploads to AWS S3 and Configured CDN
Migration to a Self-Hosted solution from Kubernetes
How to develop discourse in a team?
Images didn't load after configuring S3 uploads
Need Azure blob storage
Use Google Cloud Storage Instead of S3
Run Discourse as docker swarm service
Move discourse uploads to free space on server
Strange behavior with Digital Ocean Spaces/S3 and lots of duplicated CORS rules for `example.com`
Can't upload PDF to S3
"canned acl" error when uploading images
AWS S3 Object Ownership
What’s your server configurations?
How to debug S3 uploads
Problems with Patreon Login, Force HTTPS, and S3 CDN (three) Issues
Cron task to sync local backups to DigitalOcean Spaces
Cron task to sync local backups to DigitalOcean Spaces
Problems with Patreon Login, Force HTTPS, and S3 CDN (three) Issues
Help restoring - system hung at midnight
Help restoring - system hung at midnight
Image upload error: The bucket does not allow ACL's
Make s3_region a string value
How can I set s3_force_path to true?
Install Discourse on a residential internet with Cloudflare Tunnel
S3 assets folder, is a cleanup needed?
BunnyCDN storage for automatic backups
BunnyCDN storage for automatic backups
Move Uploads and Backups to DigitalOcean Block Storage
Required local storage for URL referenced images vs. uploaded images?
Is DO Spaces CDN still broken? Any workarounds?
Is DO Spaces CDN still broken? Any workarounds?
Is DO Spaces CDN still broken? Any workarounds?
Basic How-To for Using MinIO storage server run by you for your Discourse Instance
Minio instead of S3?
Configure automatic backups for Discourse
S3 image bandwidth costs are getting annoying
S3 image bandwidth costs are getting annoying
Support for ImgBB image upload service
Install Discourse on Amazon Web Services (AWS)
Account creation not working with discourse_encrypt
Cannot load any images “Uncaught (in promise) no-response: no-response”
Tips on Google Cloud S3
Enable a CDN for your Discourse
Invalid URL for markdown-it-bundle
Not using volumes (or automatically using S3) when hosting with Docker
Configuring automatic backups
I have a problem with my proxy status
Inline PDF Previews
My images are not working
Getting error 422 invalid argument when configure S3 upload with GCS
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Strange behavior with Digital Ocean Spaces/S3 and lots of duplicated CORS rules for `example.com`
My install broke after updating, how can I fix it?
Uploads Subdomain For Cloudflare
[PAID] Configure an S3 compatible object storage provider for uploads
Hetzner deleted my account, my server and I was left with nothing. What to do?
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Understanding Uploads, Images, and Attachments
S3, Assets & CDN Error
Capacity planning / Resource requirements
Migrate assets to s3 rake tasks
Best option for DB and file Storage
Forum rendered unusable
Forum rendered unusable
Configure automatic backups for Discourse
Migrate Discourse broke S3 images
Configure automatic backups for Discourse
Cloud storage and cdn
Migrating uploads from S3 to local
Another discourse offline "bootstrap failed with exit code 5"
Another discourse offline "bootstrap failed with exit code 5"
AI Plugin Build Error - 'bundle exec rake db:migrate' failed
Your Docker installation is not working correctly - no space left on device - safe to use ./launcher cleanup?
Uncaught SyntaxError: forum spins nonstop and never loads
Why is my upload limit 100mb?It's set to 500mb
Trouble with Google Bucket for backup
Did I overwrite my site settings with a cross-instance backup/restore?
S3 and Cloudfront - Setup Not Working
S3 and Cloudfront - Setup Not Working
Need tips on making my forum faster
What should be the server requirements
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Why you should use Discourse internally for your company/team instead of Slack (4 years use case)
Make s3_region a string value
Decoupled Discourse Application - Managed Redis, Managed Postgres, and DIgital Ocean Volume with Discourse
S3 and Cloudfront - Setup Not Working
Cannot upload images in mobile discourse
Cloudflare R2: Navigating Setup and Handling Configuration Errors
Cloudflare R2: Navigating Setup and Handling Configuration Errors
Cloudflare R2: Navigating Setup and Handling Configuration Errors
S3 assets broken after moving forum
Colored loading dots because assets not uploaded
Backup request via FTP
Error when doing "bundle exec rake s3:upload_assets" - Could not locate Gemfile or .bundle/ directory
Separate S3 access keys for backups and uploads?
Secure Uploads
Topic List Previews (legacy)
Disk usage spike during backup, Discourse crashed hard :-(
Make s3_region a string value
Favicon setup: "To work correctly over a CDN it must be a png"
Change image folder to symlinked folder
Migrating uploads from S3 to local
S3 Upload Confusion: Dashboard vs. app.yml
Old installation failing upgrade
Where are Images and uploads stored?
Rebuild issue: [Cannot set dual-stack in combination with a custom endpoint.]
Problem updating data in the separate database
Backup Files Not Showing in Discourse Backend After Uploading to Cloudflare R2
Resizing images off server
Unable to setup S3 bucket
Discourse Stuck on Loading (Logs)
Discourse Stuck on Loading (Logs)
Unable to setup S3 bucket
Rebuild failure - skipping "after_assets_precompile" section of app.yml
How to add AWS Cloudfront as a Discourse CDN
Unable to setup S3 bucket
Configured s3, but i want asset to serve locally
Configured s3, but i want asset to serve locally
Set up BackBlaze S3 with BunnyCDN
Discourse s3 backup folder
SSO broken after rebuild with stable v3.3.3
How to Configure Cloudflare R2 for your Discourse Community
如何批量修改文件链接地址
Can't migrate uploads to S3
Backup discourse from the command line
Stuck and lost updating forum, problems with PG migration
Can't rebuild due to AWS SDK gem bump and new AWS Data Integrity Protections
Can't rebuild due to AWS SDK gem bump and new AWS Data Integrity Protections
S3 (not AWS) backups stopped working, presumably since an update
Troubleshooting S3 Uploads: Site hangs after rebuild, JS assets fail to load with net::ERR_... on both R2 and GCS
Inquiry About Discourse’s Support for Amazon S3 Storage
Setting up backup and image uploads to Backblaze B2
Inquiry About Discourse’s Support for Amazon S3 Storage
Inquiry About Discourse’s Support for Amazon S3 Storage
Cloudflare R2 Storage Issues
Hetzner S3 support
Can the /var/discourse and /var/lib/docker folders be on different volumes?
An AWS S3 Integration with Discourse Tutorial would be nice
Issues with AWS CDN and S3
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Issues with AWS CDN and S3
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
为啥我的七牛云s3附件上传成功后,论坛中无法加载出来?
Imgur upload built into the post buttons
Backup discourse from the command line
Is Scaleway a good option for object storage?
Blackblaze&Cloudflare: image uploading works, but not showing in post
SMF2 Conversion and Rake to S3 Help
Backing up your forum
What causes rake uploads:fix_relative_upload_links
Running 2 hosts behind haproxy fails with random 404s
Site Blank After Rebuild
Rebuild goes into a loop
Backblaze S3 issue: duplicated uploads after delete
Migrate_to_S3 Fails on Rebake
Downloads coming from S3 even with DISCOURSE_S3_CDN_URL set
Errors trying to use custom S3 storage
Moving from one S3 bucket to another
S3 image bandwidth costs are getting annoying
Basic How-To for Using MinIO storage server run by you for your Discourse Instance
SSL error - can't upload images
Digital Ocean Spaces don’t implement the AWS S3 API for the CORS rule
Extend S3 configuration for other S3 API compatible services
How to separate uploaded files to another server
Storing Images in the cloud
Migrate_to_S3 Fails on Rebake
Cannot rebake after setting up CDN
High Availability 3 Server setup
Enable hidden setting to include S3 uploads in the backups
S3 error, when updating to 2.9.0.beta1
Azure Blob Storage Plugin
How might we better structure #howto?
Migrating uploaded files from DO to S3
Discourse as a closed wiki
Using multiple containers - what needs to be shared?
Virus scanning of uploaded files
Imgur images broken
Admin role conflates server admin and board admin
Error in rebuilding using minio as object store

大家好,

多年来我一直使用 S3 存储,且搭配 CDN。

根据我在另一个帖子中获得的建议,我今天已配置了 CloudFront CDN。

在将 CDN URL 添加到控制面板并重新烘焙 230,000+ 篇帖子之前,我想先确认一下:如果我的 CloudFront 设置有误导致一切出错,这是否符合预期?:bowing_man:t2:

目前,这是一个用户上传的图片的示例 URL:

https://greyarrows.s3.dualstack.eu-west-2.amazonaws.com/original/3X/8/3/8335cab232f512f4a979c7f0c8562e149c01b212.png

显示效果如下:

我的 CloudFront“域名”是:d1q8cepst0v8xp.cloudfront.net

如果我手动编辑上述示例 URL,将域名中的 S3 部分替换为我 CloudFront 的域名,结果如下:

https://d1q8cepst0v8xp.cloudfront.net/original/3X/8/3/8335cab232f512f4a979c7f0c8562e149c01b212.png

果然,图片仍然能正确加载:

因此,我是否可以认为,我只需要在 Discourse 控制面板中添加 S3 CDN URL d1q8cepst0v8xp.cloudfront.net,重新烘焙所有帖子,然后坐等奇迹发生?

提前感谢,CDN 对我来说完全是新事物,而且我没有开发环境来安全地测试这些 :grimacing:

4 个赞

我还启用了 s3 configure tombstone policy 设置:

Screen Shot 2021-02-14 at 21.08.39

这会有问题吗?毕竟我现在使用的是 CDN?还是说后台仍在检查原始的 S3 存储桶,而不是 CDN 的 URL?

我自然倾向于认为是后者,但再次强调,我可不敢冒险导致数十万用户的照片上传失败::scream:

:blush:

2 个赞

答案是肯定的。

为了验证这一理论,在重新烘焙数十万篇帖子之前,我进行了以下合理性检查:

  • 上传了一张图片
  • 修改了 S3 CDN 地址设置
  • 通过界面重新构建了我的测试帖子的 HTML
  • 在浏览器中刷新页面
  • 检查浏览器控制台的“网络”标签,确认图片是通过 CloudFront 加载的
  • 在新帖子中上传了一张新的测试图片
  • 再次检查浏览器控制台的“网络”标签,确认图片是通过 CloudFront 加载的

我现在正在重新烘焙所有帖子 :+1:t2:

14 个赞

感谢你的报告,Richie。我也已经运行 AWS S3 图片存储好几年了,是通过控制台消息找到这篇帖子的。但顶部的描述并没有提到你已经拥有 S3 存储、只需要 CDN 的情况。

在此记录一下我所做的操作:

  1. 进入 AWS 控制台,在“网络和内容交付”下选择 CloudFront。
  2. 点击“创建分发”按钮。
  3. 填写表单,内容相当直观。你真正需要做的只是从下拉菜单中选择存放图片的 AWS S3 存储桶。
  4. 稍等片刻,等待 CloudFront 配置完成。
  5. 在 CloudFront 分发列表的“域名”列中会出现一个形如 <乱码>.cloudfront.net 的域名。
  6. 我将该域名复制并粘贴到站点管理“文件设置”中的“s3 cdn url”字段。
  7. 我进行了一些测试:
    a. 发布了一篇包含图片上传的新帖子,确认图片确实托管在 CloudFront 上。
    b. 对某些随机的现有图片帖子执行“重建 HTML”,发现它们也使用 cloudfront.net 的图片重新构建。
  8. 一切看起来正常后,我执行了重新烘焙(rebake),由于我现在有大约五十万篇帖子,这个过程耗时数小时:
./launcher enter app
# rake posts:rebake
  1. 目前一切运行正常。它向 Sidekiq 队列中提交了大量任务,看起来每篇帖子对应一个任务,这些任务需要几天时间才能处理完毕,但系统正在逐步处理中。
18 个赞

你确定情况确实如此吗?这个网站使用了 CDN 的资源,我们并不需要清除缓存。而且这也是一个 EmberCli 的变更,理论上不应该影响生产环境 :thinking:

5 个赞

那些该死的优化器真让人头疼。如果可能的话,我建议你禁用它们,因为 Discourse 已经为每个资源提供了最优配置。这些优化器在托管 2000 年代那种“黑盒”Web 软件时表现不错,但在现代技术面前却常常彻底失效。就连 Cloudflare 那家知名公司的优化器也经常导致 Discourse 出错,所以我对其他优化器也没什么期待。它们可能今天还能用,明天就出问题,结果所有访问者看到的只是一片空白。而这一切,却没有任何实际好处。

6 个赞

有没有可能在站点设置中启用了 secure_uploads

另外,看起来这个问题今天已经有人报告并修复了,原因是与 Discourse 的兼容性问题:

6 个赞

有没有办法在管理仪表板上禁用此警告?

服务器已配置为将文件上传到 S3,但未配置 S3 CDN。

我在设置 S3 CDN 时遇到了一些问题,但直接使用 S3 并不会让我付出高昂代价,所以我完全可以接受。不过,我希望这个通知能消失,因为我完全清楚相关的后果。

2 个赞

大家好。

我想做个更新:我们现在可以使用 GCS 来设置备份了。我也在 另一个帖子 中发布了相关信息。希望这能帮助到其他正在苦苦寻找此解决方案的人。

具体怎么做呢?
启用备份的默认配置(或者你也可以在管理面板中进行设置)。

DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
DISCOURSE_BACKUP_LOCATION: s3

然后将存储桶权限设置为 Storage Legacy Object Owner

  1. 进入 Google Cloud 控制台中的你的项目
  2. 选择“存储”
  3. 选择你的存储桶
  4. 进入“权限”标签页
  5. 添加新权限,填写你的服务账号邮箱及对应的账号。在角色中选择 Storage Legacy Object Owner
  6. 保存并完成。

抱歉重复发帖,我只是想分享这个好消息。
谢谢。

5 个赞

如果您也能添加 Wasabi 那就太好了……

1 个赞

我曾使用 Wasabi 进行备份一段时间。就配置而言,它“开箱即用”,如果你愿意,可以试试看。

但备份会频繁地静默失败,导致备份文件仍留在本地机器上,占满磁盘空间。我查看了 Wasabi 和 Discourse 的错误日志,却始终找不到能让任何一方“修复”问题的合理解释。

我不推荐它,因为我不确定它是否“出色”。

2 个赞

谢谢!
我会看看这次的情况如何。
默认备份频率为每 7 天备份一次,最多保留 5 个备份。
我会分享后续进展。

1 个赞

我一直在做每日备份;我不记得当时打算保留多少份,但本地硬盘只能容纳几份。

2 个赞

您个人会推荐哪种存储方案?
我认为 AWS 和 Azure 对于个人项目来说不够经济实惠。
对 Azure 不太确定,但 AWS 看起来既复杂又难以预测……

1 个赞

我希望 Wasabi 至少能用于备份。Backblaze S3 价格实惠。我不确定自己是否用它上传过文件,但用于备份应该没问题(我想)。我认为 Backblaze 的唯一问题是(根据我上次测试的情况),你必须使用全局密钥(因此无法用于那些可能看到密钥的客户)。我记得最近有人发布了一个修复方案(好像是关于“旧版”的某个东西,具体位置记不清了)。如果是个人项目,我接下来会尝试这个方案。(另外,如果你在使用 Digital Ocean,Spaces 也是个不错的选择,我想。)

3 个赞

我在使用 DO,但就成本而言,Blackblaze/Wasabi 更便宜。
你用什么进行上传?

1 个赞

抱歉,我无法理解。
为什么我们需要在 app.yml 中指定设置,毕竟这些信息可以在 Discourse → 设置中直接输入?

1 个赞

我认为这是由于容器构建时处理构建资产的方式所致。设置位于环境变量中和位于数据库中时行为不同,这确实令人困惑,但这就是其工作方式。这也是一种更好的处理方式,因为它意味着您可以从命令行构建并恢复新站点。

4 个赞

我应该在哪里设置这个?我在 Discourse 管理设置中找不到它?

1 个赞