将 phpBB3 论坛迁移到 Discourse

在我成功将导入器用于第一个测试环境后,我现在希望将旧论坛再次/全新导入到一个新的、将成为正式生产环境的系统中,但这次失败了。

我收到了以下错误:
/var/www/discourse/plugins/discourse-migratepassword/plugin.rb:71:in `crypt’: 字符编码不兼容:ASCII-8BIT 和 UTF-8 (Encoding::CompatibilityError)。

看起来这个问题发生在第三个用户身上,而该用户的用户名中包含变音符号(umlaut)。

那么,自上次成功以来我做了哪些更改?

  • 新的虚拟机,运行 Ubuntu 18.04.3 LTS(旧的是 16.04)
  • 更新了 Discourse(最新版本)
  • 启用了“Unicode 用户名”支持,包括 [äöüßÄÖÜẞ],因为我的许多用户的用户名中包含变音符号(第一次导入时未启用此设置,导致用户导入后变音符号上的点丢失)
  • 预先安装了 migratepassword 插件(上次是稍后安装的)。

有任何线索可以指出问题出在哪里吗?我真的很希望能在不更改用户名的情况下完成用户迁移。

1 个赞

看起来这触发了 migratepassword 插件中的一个 bug。在我的测试中它能正常工作,所以我不确定这里发生了什么。我建议你在迁移过程中禁用该插件。反正迁移期间并不需要它。

6 个赞

谢谢,成功了 :slight_smile:

2 个赞

你好,我试图在本地环境中进行试运行,看看能否将我的论坛迁移到 Discourse。

我使用了这篇安装指南来安装 Discourse。

我本地有一个 phpBB3 数据库的导出文件。

我已在 Mac 上通过 Docker Desktop 安装了本地版 Discourse。

现在我正尝试按照该主题中的说明操作,但遇到了困难,因为我使用的是 Docker 而非 Ubuntu,且是在本地环境中。因此,我不知道该如何继续:
我的 Discourse 目录中没有 app.yml 文件。

有人能告诉我接下来该采取哪些步骤吗?

提前非常感谢!

1 个赞

很抱歉,我没有使用 Mac、Docker 以及您环境设置的经验。您或许可以大致参考使用开发环境导入的指南,但我无法为此提供具体支持。

1 个赞

我认为您最好遵循“官方安装指南”(即使是在您的本地 Mac 上),并以此方式运行安装程序。

4 个赞

太好了,我成功完成了导入!
最后,我决定直接使用 DigitalOcean 的 Droplet,然后按部就班地操作。结果成功了!

关于 Sidekiq 有个问题,@gerhard 你提到:

这具体是做什么的?在论坛中可以操作之前,我必须等待它完成吗?

2 个赞

除非你需要备份以恢复到不同的服务器,否则你没问题。你可以直接使用它,Sidekiq 会处理相关任务。

4 个赞

您好,目前我尝试将 phpBB 3.1 论坛的数据导入 Discourse,但导入投票功能无法正常工作:

如果帖子所有者(即投票创建者)已被删除,在导入过程中我会收到以下错误信息:

创建帖子 70978 时出错。已跳过。[“您无权创建投票。”]

对于以下投票选项:
<12
12

12

我收到以下错误信息:
创建帖子 345655 时出错。已跳过。[“投票选项必须互不相同。”]

那么,我该如何解决这些问题?

提前感谢!

此致

1 个赞

您是否启用了投票功能?

1 个赞

是的,部分投票已导入,但并非全部。

1 个赞

你需要创建该用户,或者修改脚本,例如在所有者不存在时使用系统账户。

1 个赞

已正常导入来自已删除用户的普通帖子。我该如何修改导入脚本,以便也能导入来自已删除用户的投票?

1 个赞

我目前正尝试首次从 phpBB 迁移,想知道之后如果导出 Discourse 备份,是否会包含导入的所有元数据(例如 phpBB 的原始帖子 ID)。原因是我打算在一台性能更强的机器上进行导入以加快速度,之后再将论坛部署到 VPS 上,并可能在将所有内容迁移到 VPS 后再进行一次增量导入。我想知道仅通过 Discourse 备份和重新导入是否足够,或者是否最好以其他方式导出数据库(具体是哪种方式?)

还有一个问题:导入器中的 URL 重写对于之后更换域名是否安全?我计划先使用不同的域名或子域名进行初始迁移,之后再切换到正式域名。

3 个赞

是的,备份中包含自定义字段里的原始帖子 ID。在云端执行最终导入应该没问题。

更改主机名需要做一些工作。Change the domain name or rename your Discourse

4 个赞

我刚刚完成了首次测试迁移,在开始其他工作之前,我想先感谢 @gerhard 以及所有为此做出贡献的人。第一次尝试就能如此顺利,实在令人惊叹。我大约花了 24 小时导入了近 90 万篇帖子,包括用户、私信等内容,整体效果对于首次尝试来说非常出色。能有如此优秀的导入工具来完成这项工作,真是太棒了。

不过还有一些问题,其中最重要的是我目前正在排查的:部分内部链接似乎完全出错,而其他链接则表现良好。更准确地说,出错的链接远少于正常的链接。我正在尝试找出哪些链接未生效的模式。有人能提供一些关于内部链接转换机制的见解吗?是否存在某些可能导致失败的陷阱?

顺便一提:导入完成后,我最初发现引用中的所有头像都缺失了,但后来发现它们似乎是动态生成的。大约 20 分钟后,所有头像都正常显示了。真是令人惊叹 :wink:

关于导入时间:此次操作是在 Hetzner 的 4 核 VPS 上进行的,使用了独占 CPU 核心。我打算在裸金属服务器上重新尝试此次导入,以进一步优化迁移时间。不过首先需要确认 Discourse 备份的迁移方式是否可行。

5 个赞

替换内部链接的代码位于此处:discourse/script/import_scripts/phpbb3/support/text_processor.rb at 43ddf60cdf27a865b7b1aa0d54a144a3e46c74cf · discourse/discourse · GitHub

当帖子包含指向尚未导入的帖子的链接时,重写内部链接将会失败。帖子是按其原始创建顺序导入的。

6 个赞

这是一个有趣的提示。在我检查的一些案例中,我不明白为什么会这样,但我肯定会沿着这个方向继续排查。奇怪的是,在我的情况下,它链接了错误的帖子。如果失败,我本以为它应该什么都不做,或者保持链接不变。不幸的是,我对 Ruby 的了解几乎为零,但我还是会查看一下代码。

有什么办法可以绕过这个问题吗?我认为在教程类帖子中,如果帖子被反复编辑和补充,并添加了链接,这种情况可能会频繁发生。除了手动修改这些帖子之外,还有其他解决办法吗?

感谢您的帮助!:+1:

1 个赞

嗯,刚刚注意到用户组尚未被导入,同时也发现初始帖子中并未列出它们,但实际上用户组是导入器中首先列出的项目之一。我想知道是否有办法导入用户组,包括将用户关联到这些组?还是说该功能目前尚不可用?如果是后者,我们可能需要寻找一个变通方案。

1 个赞

是的,这很奇怪。这表明你的一些本地链接格式与导入脚本预期的格式不同,导致正则表达式匹配到了错误的帖子。如果有人后来编辑了某个帖子,将其指向一个该帖子最初撰写时还不存在的帖子(你确认过这种情况吗?),那么他们可能使用了其他方法来创建链接,从而混淆了脚本。

每次导入(尤其是针对成熟论坛的导入)都如此独特,这令人惊讶。很少有导入工作仅仅是运行脚本那么简单(不过,我想,如果导入过程确实存在复杂情况,人们可能更愿意聘请我)。

1 个赞