Cloudflare R2:导航设置与处理配置错误

Cloudflare R2 还没有什么进展吗?在我看来它看起来很不错。

你有没有读过上面的相关说明?它与 gzip 文件不兼容,而且没有迹象表明有更改计划。也许它适用于除上传之外的所有内容?

你试过吗?它奏效了吗?

1 个赞

是的,我读过了,但那已经是两年前了,有些事情可能已经改变了。

我想今天试试,我启用了 R2 并添加了站点。我只是不确定如何在 discourse 步骤中进行配置。因为我还没有找到从 Cloudflare 获取密钥或秘密代码的地方。我正在尝试,也许一个小细节能帮到我 :slight_smile:

3 个赞

同样 :thinking: 我的存储桶是活动的,但也许 Discourse 还没有支持,但我希望如此。

1 个赞

本页介绍如何获取密钥:Authentication · Cloudflare R2 docs

2 个赞

我尝试了一切,但总是收到此错误:

Aws::S3::Errors::BadRequest

我想知道我错过了什么?

当我在 R2 面板中上传图片时,该图片会通过特殊的 CDN URL 打开。问题是图片无法在网站上加载。我创建了 CORS 并打开了所有方法。

[
  {
    "AllowedOrigins": [
      "https://SITENAME.com"
    ],
    "AllowedMethods": [
      "GET",
      "POST",
      "HEAD",
      "DELETE",
      "PUT"
    ]
  }
]

有什么想法吗?

1 个赞

这有可能,但两年前 Cloudflare 的说法是它不太可能改变,所以真正对 R2 感到兴奋的人需要弄清楚。话虽如此,但它似乎可能适用于除 gz 文件之外的所有文件,我认为这意味着只有备份文件。

但没有 s3 备份似乎是很大的损失。

这听起来像是你的密钥不正确或端点不正确。

2 个赞

坦率地说,我目前在我的 Discourse 站点上使用 Cloudflare,并且通常将所有内容集中在一处会比较好。因此,当您拥有 r2 时,与 Amazon 打交道会有点累人。我曾尝试安装 Amazon S3 一段时间,但不知何故未能加载样式文件。(好吧,我会再试一次),但最好不要忽略 Cloudflare,尤其是在使用 Cloudflare 支持论坛 Discourse 时 :slight_smile:

1 个赞

这通常是因为您没有添加将资产推送到 s3 的节(如果您设置了 use_s3 变量,您也需要它才能使任何类似 s3 的服务正常工作)。

2 个赞

那么你尝试了其他方法并成功了吗?你是怎么做的?你能像其他人一样写一篇关于 为上传配置 S3 兼容对象存储提供商 的文章吗?

它对备份有效吗?

我尽了我所能。我尝试通过更改设置来做实验。但每次我都会收到这个错误,当我查看它时,似乎图像没有被加载。

我也没能在错误代码中看到任何东西。如果我能让它工作起来,将几乎所有东西都集中在一个面板(Cloudflare)中,那将是令人兴奋和有效的。

抱歉,我尝试了备份。当我失败时,我又转向了亚马逊。如果有人在这方面比我更成功,我将非常高兴 :slight_smile:

我从 R2 面板上传了一张图片,并且可以访问它。但是,我无法通过 discourse 上传图片,它会给出上述错误。

所以,也许它不像文档所说的那样不起作用。

1 个赞

或者我可能欠你一个道歉。我似乎确实让它起作用了,尽管我没有时间保证我可以写出允许你让它起作用的说明。

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: 'auto'
  DISCOURSE_S3_ENDPOINT: https://=ACCOUNT_ID=.r2.cloudflarestorage.com
  DISCOURSE_S3_ACCESS_KEY_ID: '=ACCESS_KEY_ID='
  DISCOURSE_S3_SECRET_ACCESS_KEY: '=SECRET_ACCESS_KEY'
  DISCOURSE_S3_CDN_URL: '=S3_CDN_URL='
  DISCOURSE_CDN_URL: '=CDN_URL='
  DISCOURSE_S3_BUCKET: '=BUCKET='
  DISCOURSE_S3_BACKUP_BUCKET: '=BUCKET=/backups'
  DISCOURSE_BACKUP_LOCATION: 's3'

别忘了那个用于将上传推送到 S3 的 rake 任务的节。

试试这个,看看它是否对你有用。快速测试表明它适用于上传、资产和备份。所以,我想 gzip 文件的问题不再适用了。

4 个赞

更正了区域(自动)和最后一个 URL 后,它就可以工作了。但是,出现了一个问题。当我重新创建它时,样式文件未加载,网站自然无法打开。但是,当我仅为上传打开它时,我可以从网站上传图片,并且可以通过 CDN URL 访问它。唯一的问题是,我想让样式文件从 CDN 提供服务。我们该如何做到这一点?我认为这是我们唯一的问题。

您需要按照说明将资源推送到 S3:

您使用了什么 CDN?如果是 Cloudflare,您是如何配置的?

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 url。但是,这些样式文件没有上传到 cloudflare。所以我只是在 app.yml 文件中添加了上传区域设置并进行了编译。当我从管理员处激活 S3 时,新上传的图片会被上传到 cloudflare R2 并提供访问。

唯一的问题是,当我在编译 app.yml 文件之前添加 s3 设置时,新创建的样式文件似乎没有被加载。但是网站上的 URL 和 cdn url 确实发生了变化。

CORS:

[
  {
    "AllowedOrigins": [
      "https://domain.com"
    ],
    "AllowedMethods": [
      "GET",
      "POST",
      "PUT",
      "HEAD",
      "DELETE"
    ]
  }
]

这个问题会不会和 Argo 有关?但是图片目前加载没有问题。

为了调试,您可以进入容器并尝试在那里运行 rake 任务,看看会发生什么。

我昨天在这上面花了大约 4 个小时,所以我恐怕在这个项目上的免费支持快结束了。

不知道 CORS 的事情。我会允许来自任何地方的所有内容,以确保这不是问题。我在我的测试站点上没有对 CORS 做任何事情。

您是在 k8s 下运行这个吗?

1 个赞

抱歉占用您的时间。如果我能在经济上提供帮助,我会的。我尊重您的时间。

我不知道 k8s 是什么。我正在处理我自己的服务器,并且我启用了 argo。R2 也已激活。现在一切都运行得非常好,只是在新编译后,它无法将样式文件(js、css 等)加载到 R2 中。我稍后将重新运行必要的测试并在此处添加。如果我成功了,我会详细解释如何找到问题或使其正常工作。

1 个赞

什么是 Argo?

如果这是一个标准安装,那么您可以在容器内运行 rake 命令

./launcher enter app
rake ...

您确定您包含了 USE_S3 部分吗?(我猜是的,因为我认为这使得资产可以在 CDN 上找到)

Argo:Overview · Cloudflare Argo Smart Routing docs

我在编译前添加了 USE_S3 设置,示例如下:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: 'auto'
  DISCOURSE_S3_ENDPOINT: 'https://xxxxxxxxxxxxxxxxx.eu.r2.cloudflarestorage.com'
  DISCOURSE_S3_ACCESS_KEY_ID: 'xxxxxxxxxxxxxxxxx'
  DISCOURSE_S3_SECRET_ACCESS_KEY: 'xxxxxxxxxxxxxxxxx'
  DISCOURSE_S3_CDN_URL: 'https://cdn.domain.com'
  DISCOURSE_CDN_URL: 'https://cdn.domain.com'
  DISCOURSE_S3_BUCKET: 'cloudflaredomain'
  DISCOURSE_S3_BACKUP_BUCKET: 'cloudflaredomain/backups'
  DISCOURSE_BACKUP_LOCATION: 's3'

重新编译后,所有 URL 都按预期更改。CDN URL。唯一的问题是,这些资产未加载到 R2。我已经添加了此设置:

  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
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

这是 app.yml 的开头:

templates:
  #- "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Uncomment the next line to enable the IPv6 listener
  #- "templates/web.ipv6.template.yml"
  #- "templates/web.ratelimited.template.yml"
  ## Uncomment these two lines if you wish to add Lets Encrypt (https)
  # - "templates/web.ssl.template.yml"
  # - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/cloudflare.template.yml"

## which TCP/IP ports should this container expose?
## If you want Discourse to share a port with another webserver like Apache or nginx,
## see https://meta.discourse.org/t/17247 for details
expose:
  - "80:80"   # http
  - "443:443" # https

现在我将尝试进入容器并将资产上传到 S3。