我好不容易才将现有的 XenForo 社区勉强迁移到 Discourse,所以我想在这里分享我的经验,希望能帮助到正在尝试做同样事情的人。请记住,我并不懂我在做什么,所以我的一些推断可能不正确。我成功地将数据导入 Discourse,附件丢失率约为 20%。我无法真正解释原因,但这个问题似乎只影响了我论坛过去 2-3 年的帖子,而在此之前的所有帖子的导入成功率约为 95% 以上。我唯一的猜测是这与从 XF 1.x 迁移到 XF 2.x 有关。
任何尝试这样做的人都应该知道,这个脚本需要大量更新才能与 XF 2.x 配合使用。特别是,第 375-378 行没有正确的数据库表来导入 Xenforo Media Gallery 的附件。我通过断开 XFMG 与论坛的连接并卸载它来解决这个问题,因为我当时只使用 XFMG 来镜像论坛的附件。
如果你好奇的话,第 376 行指的是表 xengallery_media,这显然是指 XFMG 1.x,因为在 XFMG 2.x 中,这个表已被更改为 xf_mg_media_item。其余部分我无法匹配,我怀疑需要一些额外的代码来匹配附件与帖子的 ID。
我最终注释掉了第 314 行:s = process_xf_attachments(:gallery, s)
这样脚本就不会因为缺少 SQL 表而报错。
完成这些之后,我遵循了 @Jack51 在此帖子中的帖子:
并进行了以下编辑:
第六步需要更新 mariadb 版本。将 mariadb-server-10.3 改为 mariadb-server-10.5。
第七步应该是 service mariadb start 而不是 service mysql start。
我确实更改了
frozen_string_literal: true
为
frozen_string_literal: false
因为我遇到了和这个帖子里其他人提到的同样的错误。
这个帖子里似乎有很多关于附件应该放在哪里才能被脚本识别的困惑,我承认我也遇到了一些困难。对于像我这样完全不熟悉 docker 的人来说,指出 docker 本质上是在你的服务器上运行的虚拟机(所以你实际上是在处理两个不同的操作系统/文件系统),但有一个用于传输文件的共享空间会非常有帮助:
/var/discourse/shared/standalone/tmp
这个目录位于你的主机上,放在那里的文件会出现在:
/shared/tmp
当你进入 docker 容器后。所以,假设你保留了 xenforo 的相同文件/文件夹结构,你会将文件夹复制:
internal_data/attachments
到主机上的
/var/discourse/shared/standalone/tmp
然后,在进入你的 docker 容器后,该文件夹将出现在 /shared/tmp。
接下来,在编辑 xenforo.rb 脚本时,将:
ATTACHMENT_DIR = '/tmp/attachments'
更改为:
ATTACHMENT_DIR = '/shared/tmp/internal_data/attachments'
这样你的附件就会被放在正确的位置。值得注意的是,xenforo 还有一个 data/attachments 文件夹,但里面充满了 .jpg 文件而不是你正在寻找的 .data 文件。我看到有人在这个帖子里之前犯了这个错误,所以我觉得值得指出来。
另外,我收到了一个脚本的权限错误,所以你可能需要 chmod 该目录:
sudo chmod a+rw -R /shared/tmp/internal_data/
我认为最大的线索是脚本没有识别到你的附件,因为它会异常安静,而它应该会偶尔输出错误:
所以如果导入进行了几个小时而没有列出任何错误,那很可能就是没有识别到附件。
这就是我所知道的。别误会,我很高兴这个脚本存在,80% 的成功率总比没有好(我在 2009 年从 vBulletin 迁移到 Xenforo 时也有类似的成功率),而且我很高兴能使用 Discourse 平台。希望这篇帖子能帮助到一些人,也许有一天,比我技能更好的人能够更新这个脚本,使其工作得更好一些。
