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

它位于 OP 中 Vultr 的示例配置块内。将其复制并粘贴到您的 app.yml 中,并调整必要的字段。

2 个赞

谢谢,我漏掉了这部分:

1 个赞

这对我来说不太顺利,抱歉回复了这么多次。

如果我执行上述操作,是否应该忽略管理面板中的 S3 和备份设置?

还是也应该配置管理面板中的设置?

1 个赞

您只需按照置顶帖中的指南操作,即可获得功能正常的对象存储配置。

3 个赞

设置这些变量会使它们无法从 UX 中访问。您必须按照此处所述进行设置,而不是通过 UX 设置。

2 个赞

我认为它现在(大部分)可以正常工作了,但这个 content security policy script src 是安全的吗?

我使用 AWS 来管理两个 S3 存储桶(用于上传和备份),以及两个 CloudFront CDN(用于文件和资源)。当我为自己的 CloudFront CDN 使用自定义 CNAME 时,在加载 Discourse 时浏览器会出现大量 script-src 网络错误。将这些条目添加到我的 CSP 后,错误不再出现。

1 个赞

这些是你在主贴(OP)中描述的环境变量里填写的 URL 吗?它们是否使用了 https?

1 个赞

是的,当我把两个 d23whatever.cloudfront.net URL 放入环境变量时,没有出现 script-src 警告。但当我把我的自定义 URL(即 community-cdn.mydomain 和 files-cdn.mydomain)放入环境变量时,就会出现这些 script-src 警告。此外,即使 Stripe JS 已包含在我的 内容安全策略 script-src 中,它仍然会发出此警告。

2 个赞

我设置了 S3 上传 和对象存储,如 OP 中所述,但没有 CDN。

对于 DISCOURSE_S3_CDN_URL 变量,我有这个:
https://my-bucket-uploads.s3.dualstack.us-west-2.amazonaws.com

一切似乎都正常,包括备份,但是,在控制台中,当回复帖子时,会出现此错误:

错误中的请求 URL 实际上是两个 URL 的字符串,这似乎是原因?

https://mydiscourse.com/t/uploads-test-for-s3/79/https://my-bucket-uploads.s3.dualstack.us-west-2.amazonaws.com/assets/markdown-it-bundle-a7328b73d3e7b030770eab70f10bdb0af655b3d8fa929bc49f1ad04c4cdaa198.br.js

2 个赞

CDN 是其正常工作的必备条件。

4 个赞

我也遇到了同样的情况,配置了对象存储(minio)但没有 CDN。这是否是一个可以支持的用例?

根据我目前测试的来看,只有 markdown-it-bundle 这个 js 文件有问题,因为它指向了错误的 URL - DISCOURSE_HOSTNAME/DISCOURSE_S3_CDN_URL/assets/markdown-it-bundle-HASH.br.js

这看起来像是一个 bug,如果我设置了 DISCOURSE_CDN_URL 变量,它仍然会以 DISCOURSE_HOSTNAME/DISCOURSE_CDN_URL/assets/markdown-it-bundle-HASH.br.js 的形式指向错误的 URL。

它实际上应该指向 DISCOURSE_S3_CDN_URL/assets/markdown-it-bundle-HASH.br.js

其他的 js 资源都指向正确的 URL。

我猜从你的话来看,我还会遇到其他尚未发现的问题。也许你可以提供更多关于可能出错的信息?

如果我理解得没错,js 资源在对象存储上,样式表应该在 CDN 上。没有 CDN 的情况下,样式表是否可以像往常一样由应用程序提供?(从我看到的情况来看,确实是这样)

感谢你的帮助。

3 个赞

根据 OP 的说法,这不是一个支持的用例:

1 个赞

各位好:

我使用 Lightsail 设置了一个新的 Discourse 服务器,并参考了这篇关于 S3 上传和备份的指南:setting-up-file-and-image-uploads-to-s3

设置完成后,我在上传图片时屏幕上出现了“存储桶不允许 ACL”的错误。

这是我的 S3 策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectVersionTagging",
                "s3:CreateBucket",
                "s3:GetObjectAcl",
                "s3:GetBucketObjectLockConfiguration",
                "s3:PutLifecycleConfiguration",
                "s3:GetObjectVersionAcl",
                "s3:PutObjectTagging",
                "s3:DeleteObject",
                "s3:DeleteObjectTagging",
                "s3:GetBucketPolicyStatus",
                "s3:GetObjectRetention",
                "s3:GetBucketWebsite",
                "s3:ListJobs",
                "s3:DeleteObjectVersionTagging",
                "s3:GetObjectLegalHold",
                "s3:GetBucketNotification",
                "s3:PutBucketCORS",
                "s3:GetReplicationConfiguration",
                "s3:ListMultipartUploadParts",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DescribeJob",
                "s3:PutObjectVersionAcl",
                "s3:GetAnalyticsConfiguration",
                "s3:GetObjectVersionForReplication",
                "s3:GetLifecycleConfiguration",
                "s3:GetAccessPoint",
                "s3:GetInventoryConfiguration",
                "s3:GetBucketTagging",
                "s3:GetBucketLogging",
                "s3:ListBucketVersions",
                "s3:ReplicateTags",
                "s3:ListBucket",
                "s3:GetAccelerateConfiguration",
                "s3:GetBucketPolicy",
                "s3:GetEncryptionConfiguration",
                "s3:GetObjectVersionTorrent",
                "s3:AbortMultipartUpload",
                "s3:PutBucketTagging",
                "s3:GetBucketRequestPayment",
                "s3:GetAccessPointPolicyStatus",
                "s3:GetObjectTagging",
                "s3:GetMetricsConfiguration",
                "s3:PutObjectAcl",
                "s3:GetBucketPublicAccessBlock",
                "s3:ListBucketMultipartUploads",
                "s3:ListAccessPoints",
                "s3:PutObjectVersionTagging",
                "s3:GetBucketVersioning",
                "s3:GetBucketAcl",
                "s3:GetObjectTorrent",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:GetBucketCORS",
                "s3:GetBucketLocation",
                "s3:GetAccessPointPolicy",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket-upload",
                "arn:aws:s3:::mybucket-upload/*",
                "arn:aws:s3:::mybucket-backup",
                "arn:aws:s3:::mybucket-backup/*"
            ]
        }
    ]
}

这是我的 S3 存储桶公共访问设置:

有人能帮我解决这个问题吗?
非常感谢!
此致,
Quang

3 个赞

我的暂存网站应该使用与我的生产网站相同的 S3 存储桶吗?

1 个赞

不,那将非常不安全,它可能会删除在其他环境中仍应存在的文件的,并更改其他环境中的文件(这可能导致文件丢失、文件错误等)。

存储桶和凭据都应不同(并且暂存凭据不应访问生产存储桶,尤其是在写入和删除操作方面)。

也许可以使用具有不同凭据的路径来访问每个路径,但弄巧成拙的可能性很高,因此我建议使用单独的存储桶。

5 个赞

DISCOURSE_CDN_URLDISCOURSE_S3_CDN_URL 也需要分开吗?

1 个赞

我猜是的,因为如果您的暂存和生产域/URL不同(它们是不同的,不是吗?),那么DISCOURSE_CDN_URL(最终指向CDN提供商,它指向您的网站域)应该与暂存和生产环境不同。同样的逻辑也适用于DISCOURSE_S3_CDN_URL(因为不同的存储桶应该有不同的URL)。

4 个赞

大家好,我是 S3 的新手,不太确定如何表述,但我会尽力而为。我刚开始使用 S3 进行上传和备份,并且我一直在使用 Discourse Connect 来允许登录我网站的其他部分,但现在个人资料图片无法正常显示。我认为这与 CORS 策略有关,但不确定在哪里可以配置它。我理想情况下希望将其列入白名单,用于 forum.domain.tlddomain.tld - 或者所有子域名的通配符也可以。这是我应该在 Discourse 中设置的吗,还是在哪里设置?我使用的是 Vultr 对象存储,如果这有区别的话。

1 个赞

是否可以在 files S3 存储桶上启用版本控制?AWS Backup 是备份 Discourse 的 S3 存储桶的推荐方法吗?

1 个赞

是的。

使用版本控制或同步到另一个区域都是很好的策略。

4 个赞