Discourse 如何使用命令行方式进行恢复

本文主要用于说明如何从命令行工具的方式中恢复 Discourse,以及我们在备份和恢复的过程中遇到的坑和解决办法。

恢复前需要的准备工作

  • 在新服务器上安装完整和全新的 Discourse,这个安装成功后不需要通过 UI 前台进行用户注册。
  • 备份和获得备份文件。
  • 确定你现在运行的 Discourse 版本是最新的版本,如果你的 Discourse 不是最新的版本,你需要先进行升级。

安装权限的 Discourse

因为 Discourse 必须使用域名公共网络访问才能完整安装。如果你的站点比较大的话,你需要考虑这个问题。你需要考虑修改 DNS 的配置,让你的 Discourse 能够通过公共网络访问,或者你的域名将会在访问的时候出现你 Discourse 正在安装的提示。

这部分的操作按照完整的 Discourse 安装方式进行就可以了,你不需要进行任何操作,你也不需要在安装成功后注册管理员账号。

请注意安装次数,如果你是使用 Let’s Encrypt 的签名的话,你的 CA 签名是有次数限制的。最多可以重新安装 5 次,否则你需要再等 5 天。

除非使用自己的签名。

这个问题的讨论,请参考下面的链接:Discourse 如何不使用 Let's Encrypt 而使用 CA 签名的密钥进行安装

备份和获得备份文件

Discourse 可以使用混合附件存储方式。这个方式的定义是部分附件存储在本地,部分附件存储在云上,最常用的服务就是 AWS 的 S3 服务。

因为这种方式,会导致在恢复的时候,可能出现数据错误,绝大部分情况就是因为有部分附件在本地,有部分附件在 S3 ,但是你的 Discourse 已经全部使用 S3 了,这会导致在恢复的时候提示 S3 校验失败的情况。

在进行备份恢复之前,你需要将你的 Discourse 再备份一次。通常可以直接点后台的备份按钮。

如果你的备份是上传到 S3 的话,你可以直接到 AWS 上将备份文件下载到本地。

如果你是混合存储文件的话,在这里 不要备份附件 否则你没有办法恢复你的备份文件。


如上图我们的内容,找到最新的备份文件,然后下载。

传输备份文件到新服务器

SSH 到你需要恢复的服务器上,如果你的服务器上没有下面的目录的话,你需要使用下面的命令创建一个:

mkdir -p /var/discourse/shared/standalone/backups/default

上传你下载的备份文件到这个目录中。如果你是在服务器直接进行数据传输的话,你可以使用下面的命令,下面命令是帮助你 SSH 到老服务器,然后将老服务器上的备份传输到新服务器上。

scp /path/to/backup/backup.tar.gz [email protected]:/var/discourse/shared/standalone/backups/default

参数说明:

  • /path/to/backup/backup.tar.gz 这个是你老服务器上备份文件的路径和文件名
  • 192.168.1.1 这个是你老服务器的 IP 地址,你需要根据你的实际情况进行更改

你也可以使用 FTP 将备份上传到指定的目录。

我们最终的目的就是需要将你的备份文件存储到路径 /var/discourse/shared/standalone/backups/default 中。

恢复备份

依次执行下面的命令,首先你需要进入你新服务器的 Discourse 安装目录中:

cd /var/discourse

然后通过下面的命令,进入到 Discourse 已经运行的容器,下面的操作其实是针对 Discourse 容器的操作。

./launcher enter app

针对 Discourse 的实例,你需要启用恢复功能,因为这个功能在安装后的默认情况下是禁用的。

discourse enable_restore

恢复备份文件,直接执行下面的命令进行恢复就行。在这里只需要指定文件名就行,你不需要指定特定的路径,因为在 Discourse 容器中,默认会到上面你存储的文件路径中去找你的备份。

discourse restore sitename-2019-02-03-042252-v20190130013015.tar.gz

需要注意的是,上面的参数是示例参数,你需要根据你具体的情况替换掉备份文件的名字。

如果你在这里数据恢复成功的话,你将会在界面的下面看到 [Success] 的提示。否则将会提示失败,在失败的上面将会提示你失败的原因,你可以根据失败的原因重新调整参数后再重试,很多时候主要是附件的原因。

重构 Discourse

退出 Discourse 的容器,你可以使用命令 exit,然后你会界面中看到 bye 的容器退出提示。

然后在操作系统中的 Discourse 目录中,运行下面的命令,对 Discourse 进行重构。

cd /var/discourse
./launcher rebuild app

如果你希望对你新的实例进行调整的话,比如说修改邮件地址,增加容器配置参数,修改 app.yml 文件,在重构之前,你可以对上面的内容进行后再进行重构。

踩过的坑

下面是我们在备份恢复的时候踩过的坑和发现的问题:

S3 混合存储无法恢复数据

在备份的时候,因为混合模式没有办法恢复数据。

需要修改备份方式不备份附件,只备份数据库。

文件权限

文件权限问题。

需要使用 sudo 方式,让安装程序自行确定文件和文件夹的权限,避免权限不足。

无法发送邮件

备份恢复后无法发送邮件。

开放防火墙端口,同时需要将内部配置中的允许发送邮件的域名设置一个,然后再撤销。

CA 无法签名

新实例安装过多,导致无法 CA 签名。

注意恢复次数和必要的时候使用自己的域名签名。

1 Like

自己鼓捣一下果然报错了,赶紧来咱们站点找教程
感谢分享,帮我排了很多雷,
:folded_hands:

请问混合备份的话,本地文件该怎么备份到新站点?

尝试使用 F12 调试下上面的代码。

看看上面的代码是存储在什么地方的,我感觉可能是调用了本地的图片的缘故。

是的,因为本地文件比较少,我直接在新站上重新传了一次

好的好的。

这个需要提前注意下,因为以后随着网站运营,内容会越来越多,重新上传一次就变得非常不现实了。

1 Like