如果你有两个你希望合并成一个的 Discourse 站点,本指南就是为你准备的。
有一个名为 discourse_merger 的工具,可以将一个 Discourse 站点合并到另一个站点中。
先决条件
这不是一项简单的任务,应将其视为任何其他迁移到 Discourse 的操作。你不会在实时生产站点上运行 discourse_merger。你将在另一个环境中执行合并,在那里你可以审查输出,然后再将结果迁移到生产环境。
复制与合并
几乎所有内容都会从一个站点复制到另一个站点,但分类(Categories)和用户(Users)可以合并,以避免重复。
- 如果两个站点上的用户具有相同的电子邮件地址,则用户将被合并。
- 如果分类具有相同的名称,则分类将被合并。
如果你想对数据进行任何重新组织,请在合并前进行。
选择目标站点
选择哪个站点将作为数据的目标。这将是保留所有样式和设置的站点。另一个站点的用户、分类、主题、帖子、上传等将被复制/合并到目标站点中。
如何操作
备份两个站点*(包括文件)*并将它们复制到你将执行合并的环境中。它们可能来自不同版本的 Discourse,因此我们需要将它们更新到相同的版本。在执行合并时,我建议使用最新版本的 Discourse。
将目标站点恢复到合并环境。如果从命令行执行此操作:
bundle exec ruby script/discourse restore destination-2018-08-02-134227-v2018xxx.tar.gz
接下来我们将解压另一个站点。
cd /path/to/data
tar xvzf other-2018-08-02-134227-v2018xxx.tar.gz
输出将包括数据库转储和上传文件。
使用数据创建一个数据库:
psql
CREATE DATABASE "copyme" ENCODING = 'utf8';
\q
gunzip < /path/to/data/other-2018-08-02-134227-v2018xxx.tar.gz | psql -d copyme
如果你在官方 Docker 容器中运行导入(推荐),你需要重置 postgres 密码并将其提供给脚本,否则你可能会遇到 postgres 用户无法访问数据库的错误。
要更改密码:
sudo -u postgres psql
\password postgres
(输入新密码)
\q
现在是运行脚本的时候了。你需要设置一些环境变量:
DB_NAME:要合并到目标站点的数据库名称。
DB_HOST:(可选) 要合并的数据库的主机名。如果它在本地,则留空。
DB_PASS:postgres 用户访问数据库的密码
UPLOADS_PATH:包含 “original” 和 “optimized” 目录的目录的绝对路径(被合并的站点)。例如:/path/to/data/uploads/default
SOURCE_BASE_URL:要合并的站点的基本 URL。例如:https://meta.discourse.org
SOURCE_CDN:(可选) 要合并的站点的 CDN 的基本 URL。
在运行导入脚本之前,你可能需要先运行 bundle install 以避免错误。为此:
su discourse -c 'bundle config set --local with generic_import && bundle install'
在第一次运行时,你可能需要为导入所需的 gem 安装一些额外的依赖项。
捆绑完成后,运行导入。
su discourse -c 'DB_NAME=copyme DB_PASS=password SOURCE_BASE_URL=http://copy.othersite.com UPLOADS_PATH=/shared/import/data/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb'
完成后,在网络浏览器中查看输出。
你可以使用 remap 工具来更新来自旧论坛的链接。
bundle exec ruby script/discourse remap 'copy.othersite.com' 'hot.newsite.com'
还要重新烘焙所有包含上传的帖子:
rake posts:rebake_match["upload:"]
如果一切看起来正常,请备份结果并将其恢复到生产服务器。
bundle exec ruby script/discourse backup