# 备份到 Cloudflare R2 在使用 aws-sdk-s3 1.182.0 进行多部分上传时失败（nil 没有 'downcase' 方法）

**URL:** <https://meta.discourse.org/t/backups-to-cloudflare-r2-fail-during-multipart-upload-with-aws-sdk-s3-1-182-0-undefined-method-downcase-for-nil/399768>\
**Category:** Bug\
**Created:** [2026年四月2日 05:07 UTC](https://meta.discourse.org/t/backups-to-cloudflare-r2-fail-during-multipart-upload-with-aws-sdk-s3-1-182-0-undefined-method-downcase-for-nil/399768 "2026-04-02T05:07:05Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![hel\_Sinki](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hel_sinki/32/525916_2.png) [@hel\_Sinki](https://meta.discourse.org/u/hel_Sinki)\
**Post date:** [2026年四月2日 05:07 UTC](https://meta.discourse.org/t/backups-to-cloudflare-r2-fail-during-multipart-upload-with-aws-sdk-s3-1-182-0-undefined-method-downcase-for-nil/399768/1 "2026-04-02T05:07:05Z")

</div>

**优先级/严重程度：**

对于使用 S3 兼容备份存储的自托管实例，优先级为高，因为归档创建后计划备份会失败。

**平台：**

最新分支的自托管 Discourse。

观察时的当前运行版本：v2026.4.0-latest

Ruby: 3.4.0

aws-sdk-s3: 1.182.0

**描述：**

备份到 Cloudflare R2 在最后的“正在上传归档…”步骤失败。

数据库转储和本地归档创建均成功完成，但已完成备份归档的多部分上传失败。

**实际结果：**

备份失败，错误信息如下：

```plaintext
EXCEPTION: multipart upload failed: undefined method 'downcase' for nil

```

**堆栈跟踪包含：**

```plaintext
aws-sdk-s3-1.182.0/lib/aws-sdk-s3/multipart_file_uploader.rb
lib/backup_restore/s3_backup_store.rb:48
lib/backup_restore/creator.rb:434

```

**预期结果：**

备份归档应成功上传到配置的 S3 兼容备份存储。

**可复现步骤：**

1. 使用 S3 兼容备份路径将备份存储配置为 Cloudflare R2。
2. 使用大于多部分阈值的备份归档。
3. 运行手动或计划备份。
4. 观察“正在上传归档…”期间发生的失败。

**相关配置：**

- DISCOURSE\_BACKUP\_LOCATION=s3
- DISCOURSE\_S3\_ENDPOINT=https://.r2.cloudflarestorage.com
- DISCOURSE\_S3\_FORCE\_PATH\_STYLE=true
- DISCOURSE\_S3\_BACKUP\_BUCKET=
- AWS\_REQUEST\_CHECKSUM\_CALCULATION=WHEN\_REQUIRED
- AWS\_RESPONSE\_CHECKSUM\_VALIDATION=WHEN\_REQUIRED

**观察到的堆栈跟踪片段：**

```plaintext
algorithm = resp.context.params[:checksum_algorithm]
k = "checksum_#{algorithm.downcase}".to_sym

```

这表明在多部分上传路径中，checksum\_algorithm 为 nil。

其他背景信息：

Meta 上有一个类似的关于 Backblaze B2 的近期主题：

> [@Error uploading backup to B2](https://meta.discourse.org/t/error-uploading-backup-to-b2/393682):
>
> I’m facing issues with backing up my Discourse instance, the instance is setup to upload to Backblaze’s B2. Error log: Making sure archive does not already exist... Creating empty archive... Archiving data dump... Archiving uploads... Skipping uploads stored on S3. Removing tmp '/var/www/discourse/tmp/backups/default/2026-01-16-151337' directory... Gzipping archive, this may take a while... Uploading archive... EXCEPTION: failed to abort multipart upload: SSL\_read: unexpected eof while reading…

此外，1.182.0 之后的 aws-sdk-s3 更新日志条目也与此相关：

- 1.201.0：修复多部分上传以在需要时尊重 request\_checksum\_calculation 模式
- 1.210.2：在使用自定义端点或端点提供程序进行 PutObject 和 UploadPart 操作时，回退到使用头部请求校验和

Discourse 主分支目前似乎仍将 aws-sdk-s3 锁定在 1.182.0：

[https://raw.githubusercontent.com/discourse/discourse/main/Gemfile.lock](https://raw.githubusercontent.com/discourse/discourse/main/Gemfile.lock)

---

_[View the full topic](https://meta.discourse.org/t/backups-to-cloudflare-r2-fail-during-multipart-upload-with-aws-sdk-s3-1-182-0-undefined-method-downcase-for-nil/399768)._
