将SMF2论坛迁移到Discourse

或许可以就字符错误的问题向 Duffield Ocean 提交一个工单?

您可以使用 SSH 客户端,例如 PuTTY,或者使用我认为已集成到 Windows 的 Linux 子系统(WSL)中的新 Shell(我使用的最后一个 Windows 版本以年份作为其版本标识,因此我无法提供更多帮助)。如果您使用的是 Mac,只需打开终端并使用 ssh 即可。

如果您的数据库很大,加载数据库可能需要一些时间,期间不会有输出,完成后只会显示一个新的命令提示符。我猜测它之前应该是正常工作的。

2 个赞

感谢 @pfaffman。我想我会就此联系他们。

我可以尝试使用不同的 SSH 客户端,看看效果是否更好。

数据库并不大。它已经挂起一个小时了,进度没有任何变化。我检查了服务器的 CPU,它几乎处于空闲状态。

1 个赞

没错,问题就出在这儿!再次感谢 @pfaffman。进度又回来了……

另一种解决方案是允许直接从执行导入的 Droplet 访问数据库,从而省去设置本地数据库的步骤。

如果已经过了一小时,很可能操作并未执行。你可以尝试如下命令:

 cat database.sql | mysql
1 个赞

进一退一。

Pups::ExecError: if [ -z "$LETSENCRYPT_ACCOUNT_EMAIL" ]; then echo "LETSENCRYPT_ACCOUNT_EMAIL 环境变量是必需的,但尚未设置。"; exit 1; fi 执行失败,返回状态为 <Process::Status: pid 1187 exit 1>

我此前未安装 Let’s Encrypt,因此进行了安装。

在“准备 Discourse 主机和容器以进行导入”部分中,缺少一步:需要取消注释 LETSENCRYPT_ACCOUNT_EMAIL 的环境变量行,并填入您的邮箱地址。这一步帮我解决了该错误。

继续之前的操作,我现在到了最后的导入步骤。我进入导入容器并运行导入脚本。脚本立即退出,报错如下:

Traceback (most recent call last):
        1: from script/import_scripts/smf2.rb:4:in `<main>'
script/import_scripts/smf2.rb:4:in `require': cannot load such file -- mysql2 (LoadError)

我进行了大量网络搜索,但至今一无所获。

编辑:我认为这可能是容器内未安装 MySQL 导致的。我尝试运行 ‘gem install mysql2’,但返回了以下错误:

mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again.

编辑 2:
我成功安装了 mysql2。首先,我需要安装开发工具,但建议的源不可用。于是我运行了:

sudo apt-get install default-libmysqlclient-dev

之后,我成功执行了:

gem install mysql2

但我仍然遇到相同的错误。于是,我尝试在脚本中注释掉那个 require 语句,看看会发生什么。结果出现了新的错误:

Traceback (most recent call last):
        6: from script/import_scripts/smf2.rb:627:in `<main>'
        5: from script/import_scripts/smf2.rb:19:in `run'
        4: from script/import_scripts/smf2.rb:447:in `parse!'
        3: from script/import_scripts/smf2.rb:502:in `parser'
        2: from script/import_scripts/smf2.rb:502:in `new'
        1: from /usr/local/lib/ruby/2.6.0/optparse.rb:1089:in `initialize'
script/import_scripts/smf2.rb:504:in `block in parser': can't modify frozen String (FrozenError)

搜索该错误后,发现这是一个旧的 Ruby bug,但据说早已修复,因此我又卡住了。

打开 smf2.rb 文件,将冻结字符串选项从 true 改为 false,或者反过来,它位于第一行或第二行。修改后问题即可解决。

2 个赞

谢谢你,@Paracelsus!问题解决了。我把 true 改成了 false。

又前进一步!

编辑:
我之前遇到了一个奇怪的错误,似乎指向了错误的 IP。原因是我在 Settings.php 中设置了错误的密码。现在已修复。

接下来需要解决的是:

Traceback (most recent call last):
        7: from script/import_scripts/smf2.rb:627:in `<main>'
        6: from script/import_scripts/smf2.rb:28:in `run'
        5: from script/import_scripts/smf2.rb:28:in `new'
        4: from script/import_scripts/smf2.rb:62:in `initialize'
        3: from script/import_scripts/smf2.rb:274:in `create_db_connection'
        2: from script/import_scripts/smf2.rb:274:in `new'
        1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect': Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory (Mysql2::Error::ConnectionError)

我猜脚本调优文件中的这一行就是为了解决这个问题:

ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';

是否需要将其添加到导入容器中的某个位置?

好的,我已经解决了上述问题。这是最新版本的 MySQL 导致的问题,它不再支持旧的本地密码。最简单的解决方法是使用 MySQL 5.7 来运行此过程。只需将第 3 步从:

docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql

改为:

docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql:5.7

这样应该就能顺利解决了。我的导入操作终于开始运行了。

2 个赞

一个新问题:我似乎无法导入用户头像。应该就是这样吗?

我将需要调整尺寸的头像保存在自定义文件夹中,而不是 SMF 的标准文件夹,这会是原因吗?

除此之外,目前一切顺利。这份指南非常棒,增量数据库导入也非常顺畅 :+1:

2 个赞

我们的迁移过程无需任何额外步骤。我一时想不起 SMF 将头像存储在哪里。你迁移附件了吗?我只导入了我们的 SQL 数据库和附件,所以我猜它们应该就在其中。

是的,他们确实在那里,但我将头像移动到了另一个文件夹,却忘了将其复制到导入功能用于与用户匹配的头像文件夹中。问题已解决(尽管我不得不重新执行导入操作)。

现在出现了一个新问题……被禁用的用户在导入时并未显示为“已暂停”,而只是显示为“已停用”。有什么办法可以让它们显示为“已暂停”吗?

1 个赞

我使用的是 v2.50 beta2,这是 SMF v2.0.17 的最新版本。由于当前的 templates/import/mysql-dep.template.yml 文件,生成的 smf2.rb 有所不同。

正如第 4 步中解释的,将 “quote =” 替换为当前迭代的内容:

quote = +“\n[quote="#{params[‘author’]}”

此外,以下内容也不存在:

不过,我还是继续执行了导入操作,但不幸的是,它因 “IGNORE_BBCODE 是否指 IgnoreUser” 而终止。
抱歉,我本应截取回溯(Traceback)的屏幕截图,但当时没有。无论如何,这就是我的记忆。
有什么建议吗?
谢谢。

我最近更新了此脚本。我会看一下。

1 个赞

非常感谢!请问如果我重新开始,会覆盖我已经导入的内容吗?例如用户、分类等。
祝好!
G。

通常不会。导入脚本足够智能,会记住您上次中断的位置!

1 个赞

@tradenet 现在应该已经在这里修复了:

对此表示歉意!

一旦所有检查完成,它将在 tests-passed 中提供。

3 个赞

感谢您的关注。
G.

2 个赞

将 SMF 转换为 Discourse 后,旧的 SMF 链接会失效吗?

并非如此。导入器将创建与旧 URL 匹配的重定向永久链接,将其指向新路径。