我们已成功将我们的社区 (techenclave.com) 从 XenForo 迁移到 Discourse。
总帖子数: 250 万
总用户数: 79K(活跃和被封禁)
总私人消息数: 70 万
这是一个拥有 20 年历史的社区,经历过从 Proboards、Vbulletin、IPB、Xenforo 再到现在的 Discourse 的多次迁移。
我们花了 4 天时间完成了迁移。但在此之前,我们进行了 4 周的迁移前期准备和 4 周的自定义插件开发。
感谢大家在我遇到困难时提供的帮助和指导。 ![]()
总的来说,这是一次非常成功的迁移,几乎没有丢失任何有用的数据。
我们的迁移核心是基于一个增强的 XenForo 导入脚本,该脚本在标准基础上进行了显著改进。我们还利用了几个专门的辅助脚本来处理特定的数据转换,并确保导入后的数据完整性。
主 XenForo 导入脚本的关键增强功能
性能优化(键集分页): 最关键的增强功能是采用了键集分页(WHERE id > last_id)。与传统的 OFFSET 查询相比,这种方法通过使用索引主键来获取下一组记录,从而极大地提高了大数据集上的批量处理速度。
强大的检查点和恢复机制: 为用户、主题、回复和私人消息实现了高级检查点逻辑(使用 .json 文件)。这允许导入过程在中断(例如服务器重启、脚本错误)后从最后一个成功导入的记录安全地恢复,从而节省大量时间。
两阶段帖子导入策略: 帖子现在分两个不同的阶段导入:
首先导入主题:所有原始 XenForo 帖子(首帖)将被导入,确保父主题在回复之前存在。
然后导入回复:接着导入主题内的后续帖子,并将它们正确链接到新创建的 Discourse 主题。这种结构化方法最大限度地减少了孤立的回复,并提高了数据一致性。
全面的反应/点赞导入:
该脚本现在能够智能地区分直接映射到 Discourse 核心“点赞”(心形)的 XenForo 反应和自定义反应。
它支持核心点赞(插入到 post_actions 表)和自定义反应(利用 discourse-reactions 插件)的批量插入,从而显著加快了处理速度。
包括 XenForo 表情符号短代码到 Discourse 等效项的映射(例如,thumbsup 到 +1,heart_eyes 到 heart)。
增强的市场数据导入(自定义插件):
添加了一个专用部分,用于从 XenForo 的 thread_field_value 表导入详细的市场列表数据(例如,价格、地点、状况、保修、付款方式)。
这些数据存储在自定义的 TecencMarket::Listing 模型中,并作为主题自定义字段,从而在 Discourse 中实现更丰富的显示和功能。
市场反馈导入(自定义插件):
引入了一个新功能,用于迁移与市场交易相关的用户反馈/评分(点赞/点踩)。
主题前缀到标签转换: 该脚本现在自动将 XenForo 的主题前缀转换为 Discourse 标签。这对于维护内容组织和可发现性至关重要,使用了 discourse-tagging 插件。它还使用 XenForo 的 phrase 表将前缀 ID 正确映射到人类可读的标题。
增强的帖子内容处理: 此方法已进行重大更新,以更好地进行 Markdown 转换和处理 XenForo 的复杂 BBCode:
改进的引用处理: 转换 XenForo 的 [QUOTE] 标签,包括处理被引用的用户以及在可能的情况下链接到特定的 Discourse 帖子/主题。
修正的媒体嵌入: 确保所有导入的媒体(YouTube、Twitter/X)都位于单独的行上,以启用 Discourse 的一键嵌入功能,并将旧的 BBCode [MEDIA] 标签转换为标准 URL。
表格转换: 将 XenForo 的 [TABLE] BBCode 转换为 Markdown 表格。
附件处理(内联和附加): 重构了附件处理逻辑。它现在尝试将 [ATTACH] 标签替换为上传文件的正确 Markdown。至关重要的是,任何未在帖子内容中明确标记为 [ATTACH] 的附件现在都将附加在帖子末尾,并在一个清晰的“附件:”标题下,确保没有文件丢失。
表情符号/笑脸转换: 扩展了 XenForo 笑脸到原生 Discourse 表情符号的映射,提高了视觉一致性。
常规 BBCode 清理: 更全面地移除和转换各种 BBCode 标签(例如,[B]、[I]、[URL]、[IMG]、[LIST]、[CODE]、[COLOR]、[FONT]、[SIZE]、[INDENT]、[USER])。
字符编码和清理: 包括用于无效 UTF-8 序列的 .scrub! 和用于正确 HTML 实体解码的 CGI.unescapeHTML。
被暂停用户处理: 被封禁的 XenForo 用户现在被导入为被暂停的 Discourse 用户,保留他们的帐户但限制其活动,并将封禁原因保存在自定义字段中。
书签导入: 从 XenForo 导入所有书签到 Discourse。一开始书签并不多。
迁移后,大部分用户并不满意。这是可以预料的。在迁移后听到这些并不新鲜。尽管如此,我稍后会在本主题中分享反馈摘要,其中可能有一些值得思考的内容,可以为 Discourse 的未来提供参考。

