将 phpBB3 论坛迁移到 Discourse

我想我不该把这个问题隐藏在其他帖子中。

@gerhard 目前不同的 BBCode 是如何被区别处理的?这是偶然发生的错误,还是有意为之?

2 个赞

你们在更大的机器上测试时,每分钟能导入多少帖子?我目前在一台 8 核 Xeon 上运行导入任务,机器看起来负载很低,但导入速率始终无法显著超过 1000 条/分钟。

由于使用的是高速 NVMe SSD,我推测瓶颈不在 I/O 上。有什么建议可以进一步提升速度吗?我想争取再优化百分之几,从而将整体导入时间缩短一两个小时(目前大约需要 14 小时)。

1 个赞

你好,我遇到了一个小问题……我导入了并转换了大约 10 万篇帖子,随后发现我忘记正确设置重定向链接(另外,在 settings.yml 中也没有将表情符号链接到 emoji)。有没有办法重新导入所有内容,以便正确解析链接,同时不改变我已经设置好的其他内容?
如果我再次运行脚本,它是否会认为已经导入过而什么都不做,还是会有所不同?

1 个赞

根据我的了解,很遗憾这是不可能的。它会按照您所说的那样——忽略已导入的帖子。

1 个赞

有没有办法让它暂时忘记已导入的帖子并重新导入?
(不是永久性的,因为我之后还想添加帖子)

1 个赞

这应该不是有意为之,BBCode 到 Markdown 的转换目前还不够完美。

听起来差不多,除非你能找到单核速度更高的 CPU。

你在开始导入之前有备份吗?如果有,可以恢复备份并重新开始导入。否则就只能从头开始了。

1 个赞

真遗憾。这是否也适用于表情符号?

你说的“从头开始”是指重新安装 Discourse 吗?

1 个赞

很抱歉,在导入后尝试修正表情符号会非常困难且容易出错。如果您想走这条路,我无法为您提供帮助。

是的,基本上是这样。您可以通过删除所有数据并重建容器来跳过几个步骤。

./launcher stop app
rm -rf /var/discourse/shared/
./launcher rebuild app
2 个赞

谢谢!:slight_smile: 您的意思是,只需执行这两个命令,论坛就准备好导入了吗?不需要其他步骤吗?(那主题、奖项、群组以及其他所有已设置的项呢?有没有办法备份这些?(关于主题我知道如何保存和导入,但其他设置呢?))(括号太多了)

我主要是很高兴现在发现了这个问题,而不是在迁移过程中、系统停用时才遇到,这样就有时间修复了。但我希望尽量减少返工……

没错,如果没有备份,你就得手动重新做这些事。

2 个赞

如果还不清楚的话,这会清空整个数据库,您需要从头开始。

如果您搜索一下,会发现几种保存和恢复设置的方法。

但正如建议的那样,您最好在执行导入之后再处理这些设置,或者先完成所有设置,创建一个备份,将其作为导入前的起点。

3 个赞

你好,Helmi,

一位正在开发自定义 BB 代码插件的朋友在导入器中发现了一个漏洞,导致颜色标签无法正确渲染。

用他的话说:

颜色标签正被故意从帖子中剥离。转换器的漏洞并不在于它只移除了结束标签。所谓的“漏洞”在于它没有移除带有 命名颜色 的颜色标签。

证据
https://github.com/discourse/discourse/blob/master/script/import_scripts/ph pbb3/support/text_processor.rb

    def clean_bbcodes(text)
      # 许多 phpbb bbcode 标签都附带了一个哈希值。例如:
      #   [url=https://google.com:1qh1i7ky]点击这里[/url:1qh1i7ky]
      #   [quote="cybereality":b0wtlzex]一些文本。[/quote:b0wtlzex]
      text.gsub!(/:(?:\w{8})\]/, ']')

      # 移除颜色标签
      text.gsub!(/\[\/?color(=#[a-z0-9]*)?\]/i, "")
    end

最后一行 text.gsub!(/\[\/?color(=#[a-z0-9]*)?\]/i, "") 是一个正则表达式,它会捕获带有哈希代码的颜色标签以及结束颜色标签,但不会捕获带有命名颜色(如 color=green 等)的颜色标签。

解决方案:删除该行。

text.gsub!(/\[\/?color(=#[a-z0-9]*)?\]/i, "")

我们实际上并不希望这样做。我们希望保留颜色数据,无论我们决定如何显示它。(对于我们的论坛来说,这就是解决方案。对于 Discourse,你可能需要修改代码,使其移除所有颜色标签,而不仅仅是命名颜色的标签。)

2 个赞

你好,Gerhard。按照您的指示操作后(我先删除了内容,然后重新做了大量工作,接着进行了备份,随后开始导入。但导入进行到一半时,我发现自己操作有误,于是停止了导入,由于数据已经部分导入,只能从头再来。

于是,我再次删除了所有内容。
在重新构建应用以便恢复备份并再次尝试导入后,网站拒绝连接。

运行 Discourse Doctor 时,它提示:Discourse 版本在 [域名] 处未找到。在 localhost 处也未找到。没有其他错误。

我接下来该怎么做?

你不需要重新构建,只需恢复备份即可。

我猜你需要运行

./launcher start import

discourse-doctor 不知道 import 容器的存在。

你可能需要重新构建 app 和 import,因为它们应该是同一版本。

我已经重新构建了导入和应用程序,但连接仍被拒绝。:frowning:

您需要再次添加 phpBB 的数据库转储和文件。您可能在重置过程中删除了它们。

2 个赞

是的,我已经删除了那些内容。但我是不是需要先恢复我的数据?我在导入之前已经设置了很多东西,这样就不必在重新导入时再重复设置了。难道现在不会只是导入到一个原生的 Discourse 实例中吗?

然后,您将恢复位于 /var/discourse/shared/backups/default 的备份文件。

啊啊啊,我又来了,抱歉,但我现在又遇到了另一个问题……

这次是:表情符号! 我在 settings.yml 中这样配置了每个表情:

happy: [‘:D’,‘:-D’]
woo: ‘:woo:’
等等。

我将表情图片放在了 /var/discourse/shared/standalone/import/images/smilies 目录下。
导入时,我没有看到任何关于找不到表情之类的错误提示。

尽管如此,表情仍未映射为 emoji,在帖子中它们被转换成了图片。

我哪里做错了?

再次感谢你们的帮助和见解!

编辑::exploding_head: 当然……我需要用 phpBB3 而不是 phpBB2 来映射……
我想这应该能解决问题,但我仍需要测试一下这是否就是问题所在。

编辑 2:我现在用一个新的 phpBB3 数据库转储文件重新导入了,其中已包含表情数据。但依然没有表情。它们被转换成了图片,并且也不在 emoji 集合中。问题可能出在哪里?

我终于成功将表情符号映射到了 emoji。
由于我有超过 150 个自定义表情符号,它们的图片名称和表情代码各不相同,这让我走了不少弯路。因此,我为像我一样的用户提供一份简化的扩展教程。

了解导入器如何处理表情符号
我原本以为,当你在导入器中添加表情代码并将图片放入指定的图片文件时,它们会自动添加到 emoji 文件夹中。但事实并非如此。因此,你需要手动将表情图片导入到 emoji 中。
导入时,图片名称必须与你实际使用的表情代码一致。例如,如果你有一个表情,其图片文件名为“cheery_icon0.gif”,当用户输入“:cheer:”时显示该图片,那么你需要将该图片重命名为“cheer.gif”,然后上传到 emoji 文件夹中(在管理面板 > 自定义 > emoji)。

现在,当你有一堆在 phpBB 中通过类似以下内容显示的表情时,情况变得更加有趣:

<:-)
%-)
:3

例如,我有一个表情:

代码:<:-) 且文件名为“_1partyguyhat.gif”

首先,我需要决定在 Discourse 中使用的新代码是什么,因为文件名不能包含“<:-)”。然后,将 gif 文件重命名为该代码,并在设置文件中添加相应的映射。

对我来说,这个特定表情的映射如下:

party_hat: '<:-)'

导入后,帖子中所有用户输入的“<:-)”实例都会被转换为“:party_hat:”。
然后,系统会使用 party-hat emoji 来渲染该表情符号,前提是该 emoji 在 emoji 文件夹中可用

当你有 120 个表情需要转换时的提示 :wink:

  • 在你的 phpBB3 实例中创建一个测试帖子,包含所有表情符号。
  • 导入时,可以快速扫描该帖子,查看是否有任何文本残留,或者使用 [编辑] 选项,检查是否有任何表情被转换为图片而非仅显示 emoji 代码。(相信我,如果你忘记了一个冒号或误将分号当作冒号,这种情况确实会发生。)

settings.yml 故障排查

  • 你需要取消注释 emojis 这一行。(我完全忽略了这一点)
  • 格式要求:表情代码前需有 4 个空格。
  • 即使你已经有一个代码为“:cheer:”的表情,并且已经在 emoji 文件夹中放入了“cheer.gif”,你仍然需要添加所有代码。否则,它仍会被转换为图片文件,而不是 emoji 代码。
  • 如果你碰巧有代码为“:yes:”或“:no:”的表情,你需要将它们注释掉,否则它们会被解析为布尔值“:true:”或“:false:”。在这种情况下,你需要这样做:"yes": ':yes:' 来编码该特定 emoji。
  • 编辑:哦,还有一个我忘记的有趣事实:如果你在 emoji 名称中使用连字符(-),例如“party-hat”,当你将图片上传到 Discourse 时,它会自动将其转换为下划线,因此文件名会变成“party_hat”。所以,请使用下划线(_)而不是连字符(-)。

希望这对大家有所帮助。我知道,在我终于成功导入所有表情之前,我花了将近两周的时间。

8 个赞