# S3上的多站点备份问题--备份存储在根目录

**URL:** https://meta.discourse.org/t/trouble-with-multisite-backups-on-s3-backups-stored-in-root/229945
**Category:** Self-hosting
**Tags:** s3
**Created:** [2022年六月14日 16:34 UTC](https://meta.discourse.org/t/trouble-with-multisite-backups-on-s3-backups-stored-in-root/229945 "2022-06-14T16:34:30Z")
**Posts on this page:** 6
**Page:** 1

<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: [2022年六月14日 16:34 UTC](https://meta.discourse.org/t/trouble-with-multisite-backups-on-s3-backups-stored-in-root/229945/1 "2022-06-14T16:34:30Z")

</div>

我在 AWS EC2 上有一个多站点实例。我的备份配置如下：

DISCOURSE\_S3\_BACKUP\_BUCKET: lc-sitename  
DISCOURSE\_S3\_SECRET\_ACCESS\_KEY: secret-key  
DISCOURSE\_S3\_ACCESS\_KEY\_ID: key-id  
DISCOURSE\_BACKUP\_LOCATION: s3

多站点实例的备份存储在存储桶的根目录下，但在用户界面列表中没有显示。主站点的备份按预期存储在 `default` 目录下。这意味着备份在恢复时不可见，并且不会根据设置进行修剪。

多站点配置块如下所示：

```plaintext
        site:
           adapter: postgresql
           database: site
           pool: 25
           timeout: 5000
           host: data
           password: secret
           host_names:
             - community.site.org

```

会不会是因为没有设置 `DISCOURE_USE_S3`，导致备份存储在了错误的位置？（我尝试在 discourse.conf 中设置 use\_s3，但没有重启 unicorn，而是运行了一个命令行备份，它仍然将其存储在根目录下，而不是子站点的名称下）。

S3 上曾出现过一些上传问题（可能是存储桶配置错误），因此 S3 仅用于备份。

---

<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: [2022年六月16日 14:31 UTC](https://meta.discourse.org/t/trouble-with-multisite-backups-on-s3-backups-stored-in-root/229945/2 "2022-06-16T14:31:10Z")

</div>

我又花了一个半小时处理这个问题。

其中一个多站点网站正将其 ~~上传~~ **备份** 正确地放入正确的目录，但有两个不行。

那些没有放到正确位置的网站是从单个站点实例恢复的数据库，所以我的猜测是数据库中有某些东西强制将备份放入备份文件夹的根目录，而不是站点名称（或默认站点的默认值）。

@gerhard 抱歉打扰您，但您能否快速查看一下，看看我是否忽略了什么明显愚蠢的问题？

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2022年六月17日 11:29 UTC](https://meta.discourse.org/t/trouble-with-multisite-backups-on-s3-backups-stored-in-root/229945/3 "2022-06-17T11:29:49Z")

</div>

> [@pfaffman](#):
>
> 其中一个多站点正确地将其上传内容放在了正确的目录中，但另外两个没有。

是的，上传存储是[按设计](https://github.com/discourse/discourse/blob/main/lib/backup_restore/uploads_restorer.rb)进行的，如果备份来自单个站点实例，则恢复方式不同。

```plaintext
      was_multisite = BackupMetadata.value_for("multisite") == "t"
      upload_path = "/#{Discourse.store.upload_path}/"
      uploads_folder = was_multisite ? "/" : upload_path

```

但这不应该是关于_备份_放在哪里，而不是关于图像恢复到哪里吗？

---

<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: [2022年六月17日 13:08 UTC](https://meta.discourse.org/t/trouble-with-multisite-backups-on-s3-backups-stored-in-root/229945/4 "2022-06-17T13:08:40Z")

</div>

> [@RGJ](#):
>
> 但这是否是关于_备份_的存放位置，而不是关于图像的恢复位置？

是的。

> [@pfaffman](#):
>
> 多站点实例的备份存储在存储桶根目录中，但在用户界面列表中未显示。主站点的备份按预期存储在 `default` 下。这意味着备份在恢复时不可见，并且不会根据设置进行修剪。

没错。

但是，哎呀：

> [@pfaffman](#):
>
> 其中一个多站点正确地将其 ~~上传~~ **备份** 放在了正确的目录中，但有两个没有。

正如我（正确地）之前所说，这个实例（目前？）仅将 S3 用于备份，而不用于上传。

问题在于 3 个子站点中有 2 个的备份被放在了备份存储桶的根目录中。主站点按预期将它们推送到 `default`，而 **一个** 多站点实例将它们推送到 `sitename` 目录。

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [2022年六月17日 20:57 UTC](https://meta.discourse.org/t/trouble-with-multisite-backups-on-s3-backups-stored-in-root/229945/5 "2022-06-17T20:57:03Z")

</div>

> [@pfaffman](#):
>
> 多站点实例的备份存储在存储桶根目录中

嗯，这行为很奇怪。您是指从浏览器上传的备份还是系统创建的备份？

我找不到系统创建的备份会出现在错误位置的原因。代码看起来很简单。

> <https://github.com/discourse/discourse/blob/641c4e0b7a82f5c4ca5bac9b983c306ec75d7c0a/lib/backup_restore/s3_backup_store.rb#L41-L47>

`s3_helper` 使用正确的存储桶和多站点名称进行配置。

> <https://github.com/discourse/discourse/blob/641c4e0b7a82f5c4ca5bac9b983c306ec75d7c0a/lib/backup_restore/s3_backup_store.rb#L15-L17>

> <https://github.com/discourse/discourse/blob/641c4e0b7a82f5c4ca5bac9b983c306ec75d7c0a/lib/backup_restore/s3_backup_store.rb#L152-L154>

---

<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: [2022年六月17日 21:14 UTC](https://meta.discourse.org/t/trouble-with-multisite-backups-on-s3-backups-stored-in-root/229945/6 "2022-06-17T21:14:29Z")

</div>

> [@gerhard](#):
>
> 您是指从浏览器上传的备份，还是系统创建的备份？

我的意思是，无论是从 Web 界面还是通过 rake 任务为 3 个多站点主机中的 2 个（这两个主机都已从另一台服务器迁移）创建备份，都会将备份上传到备份 S3 存储桶的根目录，而不是上传到 `sitename/backupname`。

这对我来说也很奇怪。

我将尝试在这些函数中添加一些 `puts` 来查看是否能追踪到问题所在。

我认为我 `puts` 了 `source_path`，它在操作系统中具有正确的完整路径，但当它上传到 S3 时，站点名称已不在路径中。

下周我将再次仔细查看。备份在那里，只是 Discourse 找不到它们。
