本文主要用于说明如何从命令行工具的方式中恢复 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 root@192.168.1.1:/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 签名。
注意恢复次数和必要的时候使用自己的域名签名。