# Backblaze备份问题 - 无法列出S3备份：签名验证失败

**URL:** https://meta.discourse.org/t/problem-with-backblaze-for-backup-failed-to-list-backups-from-s3-signature-validation-failed/188431
**Category:** Support
**Created:** [2021年四月28日 19:55 UTC](https://meta.discourse.org/t/problem-with-backblaze-for-backup-failed-to-list-backups-from-s3-signature-validation-failed/188431 "2021-04-28T19:55:31Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![JulianR](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/julianr/32/218562_2.png) [@JulianR](https://meta.discourse.org/u/JulianR)
#### Post date: [2021年四月28日 19:55 UTC](https://meta.discourse.org/t/problem-with-backblaze-for-backup-failed-to-list-backups-from-s3-signature-validation-failed/188431/1 "2021-04-28T19:55:31Z")

</div>

你好，

我正在尝试设置一个仅用于备份的 Backblaze 存储桶。

我参考了以下内容：

> [@REQ: Support S3 backup to a service like Backblaze](https://meta.discourse.org/t/req-support-s3-backup-to-a-service-like-backblaze/162196/4):
>
> By the way - I only want the backup to be stored remote from the server. No need for upload like images etc is stored on a CDN. My forum is not that big or have that high usage… Its on a simple 5 dollars droplet…

并查阅了链接帖子“using-object-storage-for-uploads-s3-clones”。

在 `app.yml` 中，我添加了以下配置：

```plaintext
  DISCOURSE_S3_REGION: "s3.us-west-002"
  DISCOURSE_S3_INSTALL_CORS_RULE: false
  DISCOURSE_S3_ENDPOINT: https://s3.us-west-002.backblazeb2.com
  DISCOURSE_S3_ACCESS_KEY_ID: xxxxxxxxxxxxxxxxxxxx
  DISCOURSE_S3_SECRET_ACCESS_KEY: xxxxxxxxxxxxxxxxxxxxxxx
  DISCOURSE_S3_BACKUP_BUCKET: bucket/backups
  DISCOURSE_BACKUP_LOCATION: s3

```

在阅读 [Set up file and image uploads to S3](https://meta.discourse.org/t/setting-up-file-and-image-uploads-to-s3/7229) 后，我重新创建了一个新的存储桶，将其设置为公开访问，并将名称全部改为小写。

在 Backblaze 中，我创建了一个新的应用密钥（App Key），该密钥仅对 Discourse 存储桶有访问权限；它确实具有列出所有存储桶名称的权限。

在 Discourse 的备份页面上，我看到一个悲伤的表情/页面损坏。日志显示：

`Failed to list backups from S3: Signature validation failed`

堆栈跟踪如下：

```plaintext
/var/www/discourse/lib/backup_restore/s3_backup_store.rb:83:in `rescue in unsorted_files'

/var/www/discourse/lib/backup_restore/s3_backup_store.rb:72:in `unsorted_files'

/var/www/discourse/lib/backup_restore/backup_store.rb:23:in `files'

/var/www/discourse/app/controllers/admin/backups_controller.rb:22:in `block (2 levels) in index'

actionpack-6.1.3.1/lib/action_controller/metal/mime_responds.rb:214:in `respond_to'

/var/www/discourse/app/controllers/admin/backups_controller.rb:11:in `index'

actionpack-6.1.3.1/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'

actionpack-6.1.3.1/lib/abstract_controller/base.rb:228:in `process_action'

actionpack-6.1.3.1/lib/action_controller/metal/rendering.rb:30:in `process_action'

actionpack-6.1.3.1/lib/abstract_controller/callbacks.rb:42:in `block in process_action'

activesupport-6.1.3.1/lib/active_support/callbacks.rb:117:in `block in run_callbacks'

/var/www/discourse/app/controllers/application_controller.rb:383:in `block in with_resolved_locale'

i18n-1.8.10/lib/i18n.rb:314:in `with_locale'

/var/www/discourse/app/controllers/application_controller.rb:383:in `with_resolved_locale'

activesupport-6.1.3.1/lib/active_support/callbacks.rb:126:in `block in run_callbacks'

activesupport-6.1.3.1/lib/active_support/callbacks.rb:137:in `run_callbacks'

actionpack-6.1.3.1/lib/abstract_controller/callbacks.rb:41:in `process_action'

actionpack-6.1.3.1/lib/action_controller/metal/rescue.rb:22:in `process_action'

actionpack-6.1.3.1/lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'

activesupport-6.1.3.1/lib/active_support/notifications.rb:203:in `block in instrument'

activesupport-6.1.3.1/lib/active_support/notifications/instrumenter.rb:24:in `instrument'

activesupport-6.1.3.1/lib/active_support/notifications.rb:203:in `instrument'

actionpack-6.1.3.1/lib/action_controller/metal/instrumentation.rb:33:in `process_action'

actionpack-6.1.3.1/lib/action_controller/metal/params_wrapper.rb:249:in `process_action'

activerecord-6.1.3.1/lib/active_record/railties/controller_runtime.rb:27:in `process_action'

actionpack-6.1.3.1/lib/abstract_controller/base.rb:165:in `process'

actionview-6.1.3.1/lib/action_view/rendering.rb:39:in `process'

rack-mini-profiler-2.3.1/lib/mini_profiler/profiling_methods.rb:111:in `block in profile_method'

actionpack-6.1.3.1/lib/action_controller/metal.rb:190:in `dispatch'

actionpack-6.1.3.1/lib/action_controller/metal.rb:254:in `dispatch'

actionpack-6.1.3.1/lib/action_dispatch/routing/route_set.rb:50:in `dispatch'

actionpack-6.1.3.1/lib/action_dispatch/routing/route_set.rb:33:in `serve'

actionpack-6.1.3.1/lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'

actionpack-6.1.3.1/lib/action_dispatch/routing/mapper.rb:49:in `serve'

actionpack-6.1.3.1/lib/action_dispatch/journey/router.rb:50:in `block in serve'

actionpack-6.1.3.1/lib/action_dispatch/journey/router.rb:32:in `each'

actionpack-6.1.3.1/lib/action_dispatch/journey/router.rb:32:in `serve'

actionpack-6.1.3.1/lib/action_dispatch/routing/route_set.rb:842:in `call'

/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:71:in `call'

rack-2.2.3/lib/rack/tempfile_reaper.rb:15:in `call'

rack-2.2.3/lib/rack/conditional_get.rb:27:in `call'

rack-2.2.3/lib/rack/head.rb:12:in `call'

actionpack-6.1.3.1/lib/action_dispatch/http/permissions_policy.rb:22:in `call'

/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'

/var/www/discourse/lib/middleware/anonymous_cache.rb:355:in `call'

rack-2.2.3/lib/rack/session/abstract/id.rb:266:in `context'

rack-2.2.3/lib/rack/session/abstract/id.rb:260:in `call'

actionpack-6.1.3.1/lib/action_dispatch/middleware/cookies.rb:689:in `call'

actionpack-6.1.3.1/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'

activesupport-6.1.3.1/lib/active_support/callbacks.rb:98:in `run_callbacks'

actionpack-6.1.3.1/lib/action_dispatch/middleware/callbacks.rb:26:in `call'

actionpack-6.1.3.1/lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'

actionpack-6.1.3.1/lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'

actionpack-6.1.3.1/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'

logster-2.9.6/lib/logster/middleware/reporter.rb:43:in `call'

railties-6.1.3.1/lib/rails/rack/logger.rb:37:in `call_app'

railties-6.1.3.1/lib/rails/rack/logger.rb:28:in `call'

/var/www/discourse/config/initializers/100-quiet_logger.rb:23:in `call'

/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'

actionpack-6.1.3.1/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'

actionpack-6.1.3.1/lib/action_dispatch/middleware/request_id.rb:26:in `call'

/var/www/discourse/lib/middleware/enforce_hostname.rb:23:in `call'

rack-2.2.3/lib/rack/method_override.rb:24:in `call'

actionpack-6.1.3.1/lib/action_dispatch/middleware/executor.rb:14:in `call'

rack-2.2.3/lib/rack/sendfile.rb:110:in `call'

actionpack-6.1.3.1/lib/action_dispatch/middleware/host_authorization.rb:92:in `call'

rack-mini-profiler-2.3.1/lib/mini_profiler/profiler.rb:373:in `call'

message_bus-3.3.4/lib/message_bus/rack/middleware.rb:61:in `call'

/var/www/discourse/lib/middleware/request_tracker.rb:177:in `call'

railties-6.1.3.1/lib/rails/engine.rb:539:in `call'

railties-6.1.3.1/lib/rails/railtie.rb:207:in `public_send'

railties-6.1.3.1/lib/rails/railtie.rb:207:in `method_missing'

rack-2.2.3/lib/rack/urlmap.rb:74:in `block in call'

rack-2.2.3/lib/rack/urlmap.rb:58:in `each'

rack-2.2.3/lib/rack/urlmap.rb:58:in `call'

unicorn-6.0.0/lib/unicorn/http_server.rb:634:in `process_client'

unicorn-6.0.0/lib/unicorn/http_server.rb:732:in `worker_loop'

unicorn-6.0.0/lib/unicorn/http_server.rb:547:in `spawn_missing_workers'

unicorn-6.0.0/lib/unicorn/http_server.rb:143:in `start'

unicorn-6.0.0/bin/unicorn:128:in `<top (required)>'

/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/unicorn:23:in `load'

/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/unicorn:23:in `<main>'

```

我认为我理解每个构建模块和步骤，但不知道下一步该如何调试这个问题。

密钥 ID 和密钥都是字母数字，不包含“+”或其他符号……但即便如此，它们是否应该被加引号？

欢迎提供任何建议！

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [2021年四月28日 20:06 UTC](https://meta.discourse.org/t/problem-with-backblaze-for-backup-failed-to-list-backups-from-s3-signature-validation-failed/188431/2 "2021-04-28T20:06:33Z")

</div>

您可以尝试按照[使用对象存储进行上传（S3 及克隆）](https://meta.discourse.org/t/using-object-storage-for-uploads-s3-clones/148916)进行操作吗？

---

<div class="post-metadata">

### Author: ![JulianR](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/julianr/32/218562_2.png) [@JulianR](https://meta.discourse.org/u/JulianR)
#### Post date: [2021年四月28日 21:41 UTC](https://meta.discourse.org/t/problem-with-backblaze-for-backup-failed-to-list-backups-from-s3-signature-validation-failed/188431/3 "2021-04-28T21:41:51Z")

</div>

感谢建议 @Falco！

我的 `app.yml` 中相应的部分现在如下所示：

```plaintext
  ## DISCOURSE_USE_S3: true -- 用于 CDN 使用？！
  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: XXXXXXXXXXXXXXXXXX
  DISCOURSE_S3_SECRET_ACCESS_KEY: XXXXXXXXXXXXXXXXXX
  ## DISCOURSE_S3_CDN_URL: https://
  DISCOURSE_S3_BUCKET: discourse
  DISCOURSE_S3_BACKUP_BUCKET: discourse/backups
  DISCOURSE_BACKUP_LOCATION: s3

```

我还注意到了关于 CORS 的说明，因此我也尝试将存储桶的 CORS 策略设置为允许来自所有域名的访问，同时适用于 S3 和 B2 协议（一旦功能正常，我会再收紧权限。）

但这也没有成功。

我还创建了另一个具有所有存储桶完全访问权限的应用密钥，并用它重新构建。同样没有成功。

还有其他建议吗？

---

<div class="post-metadata">

### Author: ![JulianR](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/julianr/32/218562_2.png) [@JulianR](https://meta.discourse.org/u/JulianR)
#### Post date: [2021年四月28日 21:56 UTC](https://meta.discourse.org/t/problem-with-backblaze-for-backup-failed-to-list-backups-from-s3-signature-validation-failed/188431/4 "2021-04-28T21:56:43Z")

</div>

我也刚刚用上面的配置尝试过，但添加了：

`DISCOURSE_USE_S3: true`

我有其他存储桶已成功用于备份其他服务（注意：该备份工具使用的是 B2 API。）

小更新：移除了“所有存储桶”的 API 密钥，现在收到无效密钥错误，说明我的服务器已连接到 Backblaze。不知道签名为何出错。刚刚再次确认，时间设置正确（时区为 UTC）。

---

<div class="post-metadata">

### Author: ![JulianR](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/julianr/32/218562_2.png) [@JulianR](https://meta.discourse.org/u/JulianR)
#### Post date: [2021年四月29日 20:00 UTC](https://meta.discourse.org/t/problem-with-backblaze-for-backup-failed-to-list-backups-from-s3-signature-validation-failed/188431/5 "2021-04-29T20:00:16Z")

</div>

第二天它“就正常工作了”。🙄
