# 将上传内容从 S3 迁移到本地

**URL:** <https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903>\
**Category:** Self-hosting\
**Tags:** s3\
**Created:** [2020年九月13日 22:41 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903 "2020-09-13T22:41:36Z")\
**Posts on this page:** 13\
**Page:** 2

<div class="post-metadata">

**Author:** ![RBoy](https://avatars.discourse-cdn.com/v4/letter/r/2bfe46/32.png) [@RBoy](https://meta.discourse.org/u/RBoy)\
**Post date:** [2023年六月14日 17:33 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/21 "2023-06-14T17:33:20Z")

</div>

对我来说，没有一个方法能100%奏效，真遗憾。你最后是怎么做的？

---

<div class="post-metadata">

**Author:** ![RBoy](https://avatars.discourse-cdn.com/v4/letter/r/2bfe46/32.png) [@RBoy](https://meta.discourse.org/u/RBoy)\
**Post date:** [2023年十月6日 03:34 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/22 "2023-10-06T03:34:57Z")

</div>

3.x 版本中有什么方法可以实现此功能吗？我仍然有大量图片存储在 S3 上，需要找到一种方法将它们恢复到本地。欢迎提供建议。（`rake uploads:migrate_from_s3` 命令已不存在）

我已经将所有设置改为从本地运行（只有备份在 S3 上）。发现许多帖子仍然指向 S3，链接如下：

`<img src="//x.amazonaws.com/original/1X/afda2721f64341ca46576020acae7aaee92bd9d3.PNG" width="308" height="206">`

指向：

`https://xxx.amazonaws.com/original/1X/afda2721f64341ca46576020acae7aaee92bd9d3.PNG`

---

<div class="post-metadata">

**Author:** ![kuaza](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kuaza/32/264151_2.png) [@kuaza](https://meta.discourse.org/u/kuaza)\
**Post date:** [2024年六月16日 18:01 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/23 "2024-06-16T18:01:15Z")

</div>

您对此事有什么建议吗？我真的很厌倦每次更新或更改时都遇到问题 🙂

---

<div class="post-metadata">

**Author:** ![RBoy](https://avatars.discourse-cdn.com/v4/letter/r/2bfe46/32.png) [@RBoy](https://meta.discourse.org/u/RBoy)\
**Post date:** [2024年六月17日 02:36 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/24 "2024-06-17T02:36:02Z")

</div>

未解决。如果 Discourse 有解决方案那就太好了。

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年六月17日 20:11 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/25 "2024-06-17T20:11:33Z")

</div>

哦。如果这是您的网站，并且您的文件存储在 S3 上，那么您应该能够启用 S3，启用 [Enable hidden setting to include S3 uploads in the backups](https://meta.discourse.org/t/enable-hidden-setting-to-include-s3-uploads-in-the-backups/276535) 中描述的隐藏设置，进行备份，将配置更改为本地图片，然后恢复备份。

---

<div class="post-metadata">

**Author:** ![RBoy](https://avatars.discourse-cdn.com/v4/letter/r/2bfe46/32.png) [@RBoy](https://meta.discourse.org/u/RBoy)\
**Post date:** [2024年六月19日 04:52 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/26 "2024-06-19T04:52:04Z")

</div>

很想知道是否有人能够让它正常工作。

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年六月19日 15:32 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/27 "2024-06-19T15:32:22Z")

</div>

它适用于从 `Discourse.org` 托管迁移到自托管的每个站点（并且在获取备份之前已开启该设置）。

这有点棘手，因为您必须在创建备份时设置好所有 S3 设置（在您的 YML 文件中），然后在执行还原之前将它们全部关闭（在所有地方，包括数据库，如果您曾经在那里设置过它们）。

---

<div class="post-metadata">

**Author:** ![kuaza](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kuaza/32/264151_2.png) [@kuaza](https://meta.discourse.org/u/kuaza)\
**Post date:** [2024年六月20日 15:00 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/28 "2024-06-20T15:00:40Z")

</div>

这是一个非常合乎逻辑的方法，但它不适用于使用 **cloudflare R2** 的用户。或者这个问题只发生在我身上。当我进行备份时，我也开启了隐藏设置。不幸的是，它不包括 R2 中的文件备份。它在这里出现错误：[Uploads in cloudflare R2 are not added to the backup: Failed to download \*\*\*\*\*\*\* because Aws::S3::Errors::Http501Error](https://meta.discourse.org/t/uploads-in-cloudflare-r2-are-not-added-to-the-backup-failed-to-download-because-aws-http501error/311605)

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年六月20日 15:42 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/29 "2024-06-20T15:42:50Z")

</div>

> [@kuaza](#):
>
> 它不适用于使用 **Cloudflare R2** 的用户

文档和您的经验表明 R2 不受支持，因此您需要以其他方式解决问题。

> [@Discourse](#):
>
> ### Cloudflare
> 
> Cloudflare 的产品不兼容。在测试中，@fearlessfrog 向 Cloudflare 提交了一个工单，他们在 2022 年 12 月表示：
> 
> > [@](#):
> >
> > 您 gzip 的文件目前无法被 R2 正确处理。您必须上传未压缩的文件。Cloudflare 具有透明压缩功能，它会根据客户端可以处理的内容选择 identity、gzip 或 Brotli。这与 S3 不同。

我以为它对我来说是有效的，但我没有非常仔细地测试过，也没有在简单的冒烟测试之外使用过它。

如果备份无法从 R2 下载文件，那么您将需要使用其他工具从 R2 检索文件，然后将它们推送到您的新存储桶，然后手动更新数据库（我认为您可以使用 `remap` rake 任务搜索相关主题）。

这是一个复杂的过程，因此您需要对 R2、S3 和 Discourse 的 Uploads 有相当的了解。在论坛上获得解决方案可能很难，因为您需要足够具体地解释您遇到的确切问题。

---

<div class="post-metadata">

**Author:** ![kuaza](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/kuaza/32/264151_2.png) [@kuaza](https://meta.discourse.org/u/kuaza)\
**Post date:** [2024年六月20日 15:50 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/30 "2024-06-20T15:50:08Z")

</div>

我手动下载文件并将其上传到服务器。对于那些询问如何操作的人，您可以使用 winscp 程序连接到 S3 帐户。之后，您可以轻松地将文件导入到您的计算机。之后，我将其上传到本地并重新创建了主题，它显示了 0 篇帖子。它没有采取行动。我更改了某次，但什么也没找到。也许我错过了什么，我想在再次测试之前不要说出来，也许是我的错。如果我再试一次，我会写下结果。谢谢。

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年六月20日 15:56 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/31 "2024-06-20T15:56:32Z")

</div>

将文件上传到服务器只是问题（简单）的一部分。

您可以通过以下方式查看上传的文件：

```plaintext
cd /var/discourse
./launcher enter app
rails c
Upload.pluck(:url)

```

这将显示您上传文件的 URL。然后，您需要修改所有这些上传文件，以便它们具有指向新存储桶的新路径。您可以尝试搜索 `remap` 命令。我认为它可能会起作用。

> [@kuaza](#):
>
> 我已将其上传到本地并重新创建了主题，

我不确定这是否意味着什么。

---

<div class="post-metadata">

**Author:** ![RBoy](https://avatars.discourse-cdn.com/v4/letter/r/2bfe46/32.png) [@RBoy](https://meta.discourse.org/u/RBoy)\
**Post date:** [2024年七月3日 13:08 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/32 "2024-07-03T13:08:47Z")

</div>

> [@pfaffman](#):
>
> 将配置更改为本地图片

你能告诉我如何做到这一点吗？你的意思是只将备份中的“包含S3上传”设置改为false，还是其他什么？

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年七月3日 17:19 UTC](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903/33 "2024-07-03T17:19:40Z")

</div>

[为上传配置 S3 兼容对象存储提供商](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916) 介绍了如何通过将配置添加到 `app.yml` 来配置 S3。如果你没有这样做，请在站点设置中取消设置所有与 S3 相关的内容，然后按此方法操作。

如果你已按此方法操作，请注释掉这些设置（或者可能只注释掉 use\_s3 和 upload bucket）。

[上一頁](https://meta.discourse.org/t/migrating-uploads-from-s3-to-local/163903.md?page=1)
