查找UI生成的备份和恢复站点

你好,Discourse 团队,

昨晚我在推进 Discourse 升级并重建应用时,引发了一系列 PostgreSQL 错误。我意识到这是近期升级导致的,但随后又不断收到“权限被拒绝”等错误(是的,我已经将所有文件的所有权改为 700,因此并非全局权限问题)。于是,我将原始的 /var/discourse 目录移动到了一个临时位置,并重新安装了一个全新的 Discourse 实例,试图至少让 PostgreSQL 更新到最新状态。

接下来就有趣了。我原本以为有一个由 UI 生成的、三天前的站点备份(仅数据库,上传文件保存在另一个卷中)。但现在我找到的文件名为 wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz,我意识到这并非真正的备份文件(应为 tar.gz 格式)。

目前我已将所有用户重定向到一个着陆页,希望有人能告诉我,是否仍有可能从服务器上找回三天前那个真正的 .tar.gz 备份文件,以及具体该如何操作。

我的备份和上传文件都保存在 DigitalOcean 块存储中,旧安装中原本正常工作的 discourse 文件夹也还在。但将其移动或复制回 /var/discourse 后,一切又再次崩溃,包括再次出现 PostgreSQL 错误。我已经连续工作了 9 个小时,几乎到了崩溃的边缘。是否有人能帮我,或者至少给我指个方向?:folded_hands: 我们刚刚突破了 1000 用户大关,我真的非常不希望因此丢失所有数据。

(编辑:已补充我的上传配置说明。)

如果您的 app.yml 中已配置 S3,则只需执行命令行恢复操作,系统便会从 S3 拉取备份。
由于您的资源文件已存储在 S3 中,备份仅包含数据库。

您只需克隆一个新的 /var/discourse 目录,复制您的 yml 文件,重新构建,然后执行命令行恢复即可。

使用对象存储进行上传(S3 与克隆)

从命令行恢复备份

我想我对自己备份/上传的设置方式用词不当。我使用的是这种方法:Move Uploads and Backups to DigitalOcean Block Storage

我将修正说法:我的上传文件和备份并不位于主 Discourse 文件夹本地(这也是这一切的起因之一,我当时正尝试将我们迁移到 DigitalOcean Spaces)。因此,不幸的是,我尚未配置任何 S3 设置,因为我只是将数据保存到挂载的存储中。

备份原本保存在 mnt/my_storage/shared/standalone 目录下,但当我去查看该目录中的备份时,只找到了 wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz 文件。由于没有其他更好的办法,我确实尝试过从该文件恢复(这很可能是不对的),但收到了“权限被拒绝”的错误。我确信这与这些备份的实际生成方式有关。

那么,您的上传文件还在 DO 对象存储中吗?

是的,所有上传文件均完好无损。

好的,没问题。

那么在这种情况下,你应该能够恢复 SQL 文件,然后重新挂载块存储卷以找回你的上传文件。

有两种类型的备份:sql.gz 不包含上传文件,而 tar.gz 则包含上传文件。所以你之前备份的类型不对,但好在你的上传文件存放在外部卷上,这算是救了你一命。

2 个赞

所以我进入应用程序并恢复了那个 sql.gz 文件,但收到了“权限被拒绝”的错误。知道可能是什么原因吗?

太对了!! :slight_smile:

(假设你指的是 chmod)。如果文件的所属者设置错误,它们将无法写入。

我认为这可能导致了“权限被拒绝”的错误。

具体的错误信息是什么?

是的,谢谢。我通宵未眠,脑子有点不清醒了。

异常:lib/discourse.rb:93:in `exec':无法将归档文件复制到 tmp 目录。
cp:无法打开 '/var/www/discourse/public/backups/default/wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz' 进行读取:权限被拒绝

尝试运行 chmod 644 /var/www/discourse/public/backups/default/*

2 个赞

好的,我现在正在处理这个问题,稍后会向您反馈。感谢您抽出时间帮助我。

这个方法成功启动了恢复过程,太感谢了!:folded_hands:

现在我需要弄清楚为什么网站仍然无法加载。:grimacing:

重建工作正在进行中,使用的是问题发生前保存的 app.yml 文件。

1 个赞

有没有一条命令可以直接将此备份移动到应用程序中?恢复功能找不到它,我也记不清之前是如何让它加载的。

您可以从 S3 下载它,并将其放入:

/var/discourse/shared/standalone/backups/default

之后,您应该能够使用命令行进行恢复。

但在那之后,请按照上述链接中的说明配置您的 S3 设置,这样会更便捷。

2 个赞

谢谢 Jay。是的,这绝对是我的计划。

1 个赞

好的,这是我目前的进展:

  • 从那个 .sql.gz 文件恢复成功了。(太棒了!再次感谢 Richard。)
  • 我确认 app.yml 的配置与之前一切正常时完全一致。
  • 执行了 ./launcher rebuild app。
  • 重建成功,现在使用的是 Postgres 13(终于!)。

然而,现在访问网站本身仍然无法打开。我使用了 Cloudflare,但目前开启了“开发模式”,并且已经刷新了 DNS 缓存。所有指向都应该是正确的。Cloudflare 的模板已包含在 app.yml 中。

DNS 解析正常,主机名是最新的,Discourse 安装时使用了正确的 URL,但我已经想不出其他办法了。

网址是 https://forum.wackywriters.com,目前只看到“服务器不可用”的错误。感觉我好像一直在原地打转(抱歉),但有什么建议吗?

编辑:运行 ./discourse-doctor 时,我看到 Docker 中有两个该应用的实例在运行:

这正常吗?(感觉应该不正常,但过去 24 小时里,我对 Discourse 的所有认知都被颠覆了 :sweat_smile:

编辑 2:我一直把这件事留到最后才处理,但现在打算尝试搭建一个全新的服务器,并安装干净的 Discourse。我担心之前的各种操作导致系统出现了混乱,而我无法找出问题所在。幸运的是,我仍然拥有备份以及块存储上的所有上传文件。如果运气好的话,我应该能够将它们连接到新的 droplet 并从中迁移数据。如果任何人有其他建议或技巧,我非常希望能得到比我有更多经验的指导。

编辑 3:即使更换了新服务器且 IP 已生效(nslookup 和 ping 都显示正常,whatsmydns.net 也显示正常),论坛仍然无法加载。依然出现连接错误。这就像是 IP 地址没有正确关联到 Discourse 实例,而是试图加载一个静态页面,而在这种情况下,该页面显然不存在。

在奋战了近 24 小时后,我终于弄明白为什么在开始恢复后网站无法加载。
:point_down:

由于进行了如此多次的重置和重装,以及其他种种操作,我触发了速率限制。因此,我暂时注释掉了 SSL 模板,并计划在一周后重新启用它们。

目前网站处于“运行”状态,我正在重新生成所有帖子以修复损坏的图片。非常感谢 Jay 和 Richard 今天对我的帮助,是你们帮我度过了那些我实在无法解决的难关。

接下来,我要下载一个真正的备份,以便本周能够顺利配置 S3,不再为此事担忧。:sweat_smile:

1 个赞

如果您搜索一下,会发现有一种方法可以添加第二个域名,这样 Let’s Encrypt 会将其视为独立的请求。但等待会更简单。

我建议您将 Cloudflare 设置为灰云模式,并关闭所有加速功能。

1 个赞

@pfaffman 你难道不是把对象存储和块存储搞混了吗?对象存储就是 S3,但 TS 说他们使用的是块存储,那只是挂载在上传目录的一个磁盘:

1 个赞

哦。:man_facepalming:

是啊。所以我刚才说的全都没意义了。

谢谢你指出这一点,Richard。

2 个赞

嗯,你所说的大部分内容确实有道理,只是这里让我有些困惑 :slight_smile:

2 个赞