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

您可以在 JavaScript 控制台中查看。我猜想 CDN 是错误的,或者您没有正确处理预编译资源部分。

https://community.itechguides.com/ 现在可以正常工作了:

如果对您来说无法正常工作,请尝试强制重新加载和/或使用无痕窗口。

2 个赞

该站点对您开放是因为当您打开它时,我已从 app.yml 文件中注释掉了以下行:

DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: nyc3
DISCOURSE_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
DISCOURSE_S3_ACCESS_KEY_ID: accesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: secretkey
DISCOURSE_S3_CDN_URL: https://community-cdn.itechguides.com
DISCOURSE_S3_BUCKET: itg-community-files
DISCOURSE_S3_BACKUP_BUCKET: itg-community-files/backups
DISCOURSE_BACKUP_LOCATION: s3

我现在重新启用了这些行并重建了容器。现在,该站点又显示空白页了!

下面的屏幕截图显示了我将代码放在 app.yml 中的位置。如您所见,我将 S3 配置代码放在了 DISCOURSE_NOTIFICATION_EMAIL 的下方。


a

1 个赞

如果注释掉 DISCOURSE_CDN_URL 会发生什么?

1 个赞

我没有这样做。但我一直在排查问题,我坚信我没有正确设置 S3 CDN。我正在使用 StackPath,我不确定在源站地址和主机头中使用什么。

1 个赞

我还不确定的是如何设置我的 DigitalOcean Space 存储桶的文件列表功能。现在,我使用的是“限制列表”。这会影响什么吗?

1 个赞

我注释掉了 DISCOURSE_S3_CDN_URL,网站就可以加载了。这证实了我的 S3 CDN 设置有问题,但我仍然不知道如何正确设置。

非常感谢任何帮助。

1 个赞

您是否完成了“配置”部分中的所有任务?
如果我没记错的话,在 app.yml 中设置 DISCOURSE_S3_CDN_URL _要求_将资产存储在 S3 上。

2 个赞

我不太了解 Discourse 的工作原理。我只是一个从 PHP 世界复制粘贴的网站管理员,但我仍然想知道为什么需要声明两次相同的 CDN。

我没有使用 DISCOURSE_CDN_URL,因为我有 DISCOURSE_S3_CDN_URL(而且我读过的任何文档可能都没有指导我使用它)。所以我尝试了一下。

我添加了 DISCOURSE_CDN_URL: <cdn-url>。重建没有报错,但我遇到了 502 错误。当我删除它时,我的论坛又恢复正常了。

不过,您的问题可能是由于其他地方的配置错误造成的。但我喜欢简单的解决方案,即使我错了,而且我抱怨的是您为不同需求两次指定 CDN 的情况。或者别的什么。

2 个赞

DISCOURSE_CDN_URL 和 DISCOURSE_S3_CDN_URL 是不同的。DISCOURSE_CDN_URL 指向您的论坛,而 DISCOURSE_S3_CDN_URL 指向您的 S3 存储 URL。

其想法是让 DISCOURSE_CDN_URL 提供可拉取的资源,如 CSS,而 DISCOURSE_S3_CDN_URL 提供可推送的资源,如 JS、图像和用户上传。

我已经设法让一切正常工作,除了我的 S3 存储 CDN。每当我启用 app.yml 文件中的那部分时,我的论坛就会显示空白。

查看浏览器检查元素的网络显示,由 DISCOURSE_S3_CDN_URL 提供的资源显示 404 错误。

我卡在这里了!我不确定为什么 S3 CDN 无法提供这些资源。

4 个赞

感谢您耐心解释!

这对我来说相当……陌生。但正如我所说,我的经验非常有限。我在 WordPress 中使用 AWS 作为 CDN,通过 S3/CloudFlare,但仅限于静态文件——脚本需要另一套设置。我认为没有必要比较 WP 和 Discourse,因为它们是根本上截然不同的平台。但我在这里试图理解这个概念的原理。

好吧,我现在比您了解得多 :smile:

编辑:而且我的设置也完全错了 :flushed: 所有 JS、图片等都通过 CDN 提供服务。但我找不到 CSS。

1 个赞

是的,它们是。但感谢您的更新。

1 个赞

@Jagster,我将非常感谢您的帮助。

我现在遇到的问题是我的网站试图从对象存储 CDN 加载 .gz.js 资源,但这些文件不存在。如何强制 Discourse 将这些 .gz.js 资源上传到对象存储?

1 个赞

这正是指南中这部分内容的作用:

1 个赞

我的 app.yml 中已经有那一行了。我把上面的代码放在了 plugins 定义之后。或者我应该把它们移到 plugin 列表的上面?

1 个赞

That’s wrong. The after_assets_precompile YAML key must be under the hooks key.

By default we ship as:

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

and you want

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
1 个赞

非常感谢您,@Falco。我现在就移动它们并重试。

2 个赞

但是其他插件呢?把它们列在下面可以吗?

  • sudo -E -u discourse bundle exec rake s3:upload_assets?
1 个赞

不。

它将变成:

## 插件放在这里
## 详情请参阅 https://meta.discourse.org/t/19157
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/docker_manager.git
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets

YAML 是一种树状数据结构,空格缩进定义了结构。

3 个赞

在您(@Falco)和 @pfaffman 的指导下,我刚刚成功完成了此配置。

供其他社区成员查看我的配置。以下是截图。在配置所有这些内容时,我还写了一份全面的指南。

我使用了 StackPath 和 DigitalOcean Spaces。我的指南包含了整个配置的详细步骤。如果有人需要这份指南,我很乐意应要求发布 URL。

2 个赞

@Falco@pfaffman 非常感谢你们的帮助。这是我第一次配置 Discourse,但我已经完成了最困难的部分(我认为!)。我非常感激!

3 个赞