将SMF2论坛迁移到Discourse

抱歉再次回复。我还在努力弄清楚为什么没有创建永久链接。:frowning:

回顾一下:
我在顶级根域上使用 SMF2 的默认丑陋 URL。Discourse 安装在该根域的一个子域上。我使用了最新 Discourse 仓库中的 smf2.rb 导入器将 SMF2 转换为 Discourse(按照您的指南),但在导入完成后,Discourse 中没有任何永久链接。

是否还需要其他步骤,例如在 SMF2 或 Discourse 上运行某些设置或插件?

看起来那个函数是针对美观 URL 的?因此你需要相应地修改它(除非我在代码中漏掉了什么)。

1 个赞

我有点困惑,因为 Marco 没有使用美观的 URL,但系统仍为他创建了固定链接,而且他使用的是相同的导入脚本。

这是导入脚本中关于美观 URL 的函数:discourse/script/import_scripts/smf2.rb at main · discourse/discourse · GitHub

希望能得到一些帮助,让 SMF 默认的“丑陋”URL 也能正常工作……任何指导都将不胜感激。:folded_hands: 谢谢大家。

我不知道。但我能给出的最佳免费建议是:我认为你需要查看第 222 行,该行内容为:

           Permalink.find_or_create_by(url: "forums/index.php/board,#{c["id_board"]}.0.html", category_id: category.id)

你可以将该_permalink_(或者也许是其他几个?)修改为那些看起来不太美观的链接样式?不过,在我看来,这本身已经相当难看了。你也可以调整文件顶部的 permalink_normalizations

抱歉,Jay,又回复你,但第 222 行在哪里?smf2.rb 的第 222 行只有:

if parent

好吧,看来我们查看的是不同的版本。我不太确定为什么会这样。但你需要关注的是那些关于 Permalink 的行。

我感到困惑,因为我链接的版本似乎是最最新的“官方”版本……但你是第二个提到不同版本的人。我漏掉了什么?在哪里可以获取你的版本?

啊!抱歉。看来我点错了 smf1 脚本。请查看就在你正在查看的 smf2.rb 脚本旁边的 smf1.rb1

你可以查看 smf1 脚本,或者以 make_prettyurl_permalinks 为模型来创建 make_uglyurl_permalinks。但后者是从美观 URL 表读取数据的,所以可能以 smf1.rb 为模型会更简单,不过我需要查看数据库才能确定。不,除非你修改 create_xxx 函数,否则那样也无济于事。

抱歉。这里无法说明具体的修复方案。

1 个赞

我已经尽力了,但似乎无法继续下去。我甚至已在 MySQL 服务器上创建了一个使用原生密码的新用户并尝试过,但依然无济于事。

su discourse -c "bundle exec ruby script/import_scripts/smf2.rb /shared/smf2 -t UTC"
正在加载现有群组...
正在加载现有用户...
正在加载现有分类...
正在加载现有帖子...
正在加载现有主题...
回溯(最近一次调用在最后):
        7: 来自 script/import_scripts/smf2.rb:701:in `\u003cmain\u003e'
        6: 来自 script/import_scripts/smf2.rb:28:in `run'
        5: 来自 script/import_scripts/smf2.rb:28:in `new'
        4: 来自 script/import_scripts/smf2.rb:62:in `initialize'
        3: 来自 script/import_scripts/smf2.rb:274:in `create_db_connection'
        2: 来自 script/import_scripts/smf2.rb:274:in `new'
        1: 来自 /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect': 不支持 RSA 加密 - caching_sha2_password 插件是使用 GnuTLS 支持构建的 (Mysql2::Error)

好的,经过数小时的反复尝试,我终于定位到了问题所在,并在此发布,供可能遇到同样困境的参考。

MySQL Docker 容器使用的是版本 8,不知为何,MySQL 模板所引用的 MariaDB 库无法正常工作。

我没有在导入 Docker 容器的配置文件中包含 MySQL 模板文件,这是第一个改动。

我构建了导入容器,并通过 ./launcher enter import 进入其中。

然后执行:

echo "gem 'mysql2'" >> Gemfile
wget https://dev.mysql.com/get/mysql-apt-config_0.8.17-1_all.deb
dpkg -i mysql-apt-config_0.8.17-1_all.deb

该命令会弹出交互式提示,您可以选择默认选项(MySQL 8 及工具)。

接着我安装了标准的 MySQL 8 库,并继续构建:

apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libmysqlclient-dev
su discourse -c 'bundle config unset deployment'
su discourse -c 'bundle install --no-deployment --path vendor/bundle --jobs 4 --without test development'

完成上述步骤后,其余操作与之前相同,现在导入功能已正常运行。

Discourse 的开发者或许可以考虑调整导入脚本以适配此问题。至少现在论坛上已有记录,其他遇到同样问题的用户可以参考。

3 个赞
  1. 按照这些说明进行销毁操作吗?how-to-migrate-import-from-smf2-to-discourse/90129#cleanup-5

  2. 我在导入之前已手动将附件目录从 smf2 转移到 Discourse,然后运行了一次导入器,但上传的文件并未出现在 Discourse 的帖子中。请问可能是什么原因?

  3. 我已经在未启用 S3 的情况下运行过一次导入器,但现在想使用 S3。我该怎么办?

  1. 嗯……我建议您尝试启用 S3 并重新导入。
  2. 在开始导入之前启用 S3。
1 个赞

我之前在没有使用 S3 的情况下运行过一次导入器。在增量导入期间,已经导入的主题中的上传内容会被转移到 S3 吗?

最好重新开始,并在导入之前启用 S3。

在创建用户时出现以下错误:

oxipng worker: oxipng未找到;请提供正确的二进制文件或禁用此 worker(使用 --no-oxipng 参数或在选项中设置:oxipng => false

之后系统开始创建帖子。

  • 这是否就是附件未出现在 Discourse 中的原因?
  • oxipng 应该安装在哪里?

更新:我不明白为何会出现这个 oxipng 错误。我在 Discourse 中完全找不到任何相关信息,而且仅在运行 smf2 导入脚本时遇到此问题。这是否可能与以下内容有关?https://meta.discourse.org/t/faster-and-smaller-uploads-in-discourse-with-rust-webassembly-and-mozjpeg-blog

这仅来自我们在服务器端使用的图像优化库的警告,不应阻塞任何操作。

2 个赞

因此,我原本以为我的导入问题可能与 S3 有关,但结果发现 S3 似乎运行正常。我遇到的问题在于,在运行导入脚本(启用 S3)并重新构建导入容器后,Discourse 中的所有主题似乎都缺少在 smf2 主题中作为附件的上传文件。换句话说,在 Discourse 主题中没有任何视觉提示表明存在上传文件,而在其对应的 smf2 主题中,这些文件显然作为附件可见。即使禁用 S3 进行导入,结果也是一样的。我现在有点束手无策了。:confused: 有什么建议吗?

可能是图片已附加到帖子中,因此导入脚本知道要导入它们,但帖子中未引用这些图片,导致它们不显示。您需要修改帖子文本,添加指向这些图片的链接。我见过这种情况,似乎是在另一个论坛上。

您的意思是在导入 Discourse 之前,修改 smf2 上的帖子以包含附件的链接吗?

嗯,那可能是一种方法。

但我的意思是修改导入脚本,将附件附加到原始帖子中。类似这样: