将SMF2论坛迁移到Discourse

太棒了!即使我的旧版 SMF 没有使用美观的 URL 呢?

你说的“不算完全”是什么意思?

针对您的问题:

  1. 是的,但是……
  2. “不完全是”意味着指向主题 ID 的链接(例如 index.php?topic=123)将作为永久链接创建并正常工作,但指向特定帖子的锚点链接(例如 index.php?topic=123.msg789#msg789)将不再保留或失效。它们会被截断为仅包含主题 ID。

以下是我从 SMF2 导入的论坛中的永久链接示例:

image

2 个赞

至少该主题仍可作为特定帖子的参考,这已经足够好了。太好了,非常感谢你的回复,也谢谢你整理这些说明。

1 个赞

抱歉,忘了问——如果我的 SMF 设置为 分类->版块->子版块,我是否必须先移除“版块”这一层,使其只有两层深(论坛->子论坛),才能正确转换为 Discourse?

你好 @marcozambi

我很好奇你是如何实现这一点的。我在 10 月 19 日使用了导入器,将大量论坛从 SMF 迁移到 Discourse,但所有旧格式的链接基本上都丢失了(意味着使用旧 URL 时会返回 404 错误)。

例如,旧链接:

对应的是以下主题:

你愿意分享一下你的“魔法”吗?:grin:

没有什么特别的魔法。
当我在2018年9月从SMF导入数据时,SMF2导入脚本完成了所有的工作。
在导入每篇帖子后,脚本会生成相应的永久链接。
无论如何,我对脚本进行了一些 minor 自定义,详情已在该主题的首帖中说明。

1 个赞

没错。您需要将现有的 SMF 子论坛树“扁平化”为两层。

1 个赞

是的,非常感谢你的精彩帖子。我仔细遵循了其中的步骤,并成功迁移了一个拥有 600 万篇帖子的论坛。

不过,也许永久链接确实已生成,你是如何检查它们的?如果它们存在于数据库中,那可能只是需要修复的 Nginx 问题。

您可以通过访问 管理 → 自定义 → 固定链接 来查看您的固定链接列表。
如有需要,您还可以在此处创建新的固定链接。

1 个赞

:+1:

正如我所料,它是空的。这意味着脚本的某部分在我们的情况下没有生效。:expressionless: 没关系,我仍然可以手动构建其中一些(刚刚尝试并成功完成了上面示例中的构建)。

这一步是指使用旧的 SMF2 数据库详细信息,还是必须严格按照 ‘user’、‘pass’、‘db’ 来填写?

这一步是指使用旧的 SMF2 数据库详细信息,还是必须严格按照指定的 ‘db’、‘user’ 和 ‘pass’ 来填写?

这一步是否是我唯一需要使用原始旧 SMF2 数据库详细信息的步骤?

这些是用于连接到已容器化的 MySQL 实例的凭据,您的 SMF 论坛数据库转储文件已导入该实例。
需要明确的是,该容器化的 MySQL 运行在与 Discourse 相同的服务器上,其唯一用途是存放您从 SMF 数据库导出的转储文件。

这是您需要在托管原始 SMF2 数据库的服务器上执行的命令,以便生成转储文件,之后您需要将该文件导入上述容器化的 MySQL 实例中。

1 个赞

感谢您的回复。

是的,我已经将原始的 smf2 数据库导入到 Docker 化的 MySQL 实例中的 Discourse 服务器了。

在使用 Settings.php 中的 Docker 化 MySQL 信息后,运行导入脚本时出现以下错误:

正在加载现有群组…

正在加载现有用户…

正在加载现有分类…

正在加载现有帖子…

正在加载现有主题…

正在创建群组

回溯(最近一次调用优先):

11: 来自 script/import_scripts/smf2.rb:701:in `’

10: 来自 script/import_scripts/smf2.rb:28:in `run’

9: 来自 /var/www/discourse/script/import_scripts/base.rb:47:in `perform’

8: 来自 script/import_scripts/smf2.rb:66:in `execute’

7: 来自 script/import_scripts/smf2.rb:77:in `import_groups’

6: 来自 script/import_scripts/smf2.rb:281:in `query’

5: 来自 script/import_scripts/smf2.rb:287:in `__query’

4: 来自 /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-2.0.4/lib/patches/db/mysql2.rb:22:in `query’

3: 来自 /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:130:in `query’

2: 来自 /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:130:in `handle_interrupt’

1: 来自 /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `block in query’

/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `_query’: 表 ‘db.smf_membergroups’ 不存在 ( Mysql2::Error )

有什么建议吗?

我已经严格按照指南逐行操作了好几次,但始终卡在这个步骤。

谢谢。

请检查您的 MySQL 数据库,确认是否存在 smf_membergroups 表。如果不存在,您可以:

  1. 修改脚本以适配不同的表名,或
  2. 如果没有任何组,则跳过导入组的操作。
2 个赞

文件扩展名其实并不重要。只要文件包含有效的 SQL 语句,无论扩展名是什么都会被加载。

1 个赞

此外,数据库的前缀通常不是 smf_。许多导入工具都提供了相关选项,但我尚未检查此工具是否支持。

2 个赞

使用与 smf2 数据库相同的凭据来配置 Docker 化的 MySQL 实例,解决了我的问题。谢谢大家!

1 个赞

@Paracelsus 我似乎遇到了同样的问题:固定链接为空。:frowning:

我的 SMF2 运行在根域名上,而 Discourse 运行在 SMF2 根域名的子域名上。这会有影响吗?

是的……固定链接确实很麻烦,但我已经学会与之共存了。我搜索了所有能找到的网页,这些网页上曾发布过指向我们论坛的链接(使用旧的 SMF 格式),然后访问这些页面,提取一些文本字符串或抄录段落,在 Discourse 论坛中搜索这些内容,并替换为固定链接。如果你仍然保留着 SMF 论坛,我建议你尽快这样做,因为有时人们在网页上留下的链接并没有附带任何引用或文本内容,只有 URL,但你仍然可以找到对应的主题。

对我们来说,我们最初使用的是 discourse.forumscp.com,而 forumscp.com 在 SMF 中作为“生产论坛”运行了一段时间(以便在 Discourse 中进行测试并熟悉它)。我多次测试了增量更新的过程,并在迁移前几周再次确认,以确保过渡能够顺利进行。在迁移当天,我们关闭了旧论坛,完成了从 SMF 到 Discourse 的最后一次增量数据库更新,然后按照相关说明更改了域名。我们还需要主机提供商的帮助来检查 Nginx 配置,具体细节我记不太清了,但似乎还涉及一些 DNS 设置需要调整。不过我们只是按照主机提供商的指示操作,一切都很顺利。

您可以寻找其他支持固定链接的导入器并复制其代码。vBulletin 和 phpBB 可能是不错的例子。