使用 Kubuntu 在虚拟机中将 myBB 论坛迁移到 Discourse

花了太多时间,我以为我快成功了,但然后……

$ bundle exec ruby script/import_scripts/mybb.rb
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...

creating users
script/import_scripts/mybb.rb:96:in `block (3 levels) in import_users': undefined method `exists?' for File:Class (NoMethodError)

                  @uploader.create_avatar(newuser, filename) if File.exists?(filename)
                                                                    ^^^^^^^
Did you mean?  exist?

还是不行 :frowning:

1 个赞

如果我理解正确的话,该方法已被弃用,然后从当前版本的 Ruby 中移除:

导入脚本应更新以反映此更改。


也许可以尝试将 exists 替换为 exist(去掉末尾的“s”):

:slight_smile:

Ruby 文档:https://ruby-doc.org/3.2.2/File.html#method-c-exist-3F

1 个赞

是的——在此之前它已经被弃用了很久。我会尝试找出相关的出现并更改它们,但我需要休息一下,从这个漫长且迄今为止回报不高的练习中抽身 :wink:

嗯……

$ bundle exec ruby script/import_scripts/mybb.rb
正在加载现有组……
正在加载现有用户……
正在加载现有类别……
正在加载现有帖子……
正在加载现有主题……
/home/silverdr/sources/discourse/lib/site_setting_extension.rb:444:in `get': 不存在名为 'email_domains_blacklist' 的设置 (Discourse::InvalidParameters)

您可以在网站设置中找到新名称。我认为它是 email_domains_blocklist

谢谢。

$ grep -R email_domains_blocklist ./\n```
没有任何返回。

$ grep -R email_domains_blacklist ./\n./script/import_scripts/base.rb: email_domains_blacklist: ‘’,\n./app/models/site_setting.rb: email_domains_blacklist: "blocked_email_domains",\n```
返回如上。这意味着它很可能是 blocked_email_domains。另一方面,我注意到在之前的尝试中,我用 @Paul_King 链接的 gist 脚本替换了原始的 script/import_scripts/base.rb

我恢复了原始脚本,这次似乎成功了。好得令人难以置信。我/它一定遗漏了什么 :wink: 马上就去弄清楚。

2 个赞

总结一下(比这篇帖子长得多 :wink: 的旅程:

注意:我在此过程中使用了虚拟机中运行的 Kubuntu 发行版,因此请注意,在不同的操作系统甚至不同的发行版上可能不尽相同。

0. 安装 Discourse 开发环境

按照这篇帖子并运行帖子中链接的这个脚本,使用

`bash <(wget -qO- https://raw.githubusercontent.com/discourse/install-rails/master/linux)`

如那里所述,再加上克隆源代码

git clone https://github.com/discourse/discourse.git ~/discourse

1. 准备 MySQL 数据库

按照线程顶部的说明获取原始 mybb 数据库的转储:

$ mysqldump -u USER_NAME -p DATABASE_NAME > mybb_dump.sql

并将其复制/移动到新设置的开发环境中。

安装 MySQL 服务器

$ sudo apt-get install mysql-server

MySQL 的身份验证在较新版本中已更改。如今,如果您想成为 MySQL 的 root 用户,则必须是主机的 root 用户,因此

$ sudo mysql

而不是

$mysql -u root

当然,您必须首先是“sudoer”(管理员)

$ sudo mysql
mysql> CREATE DATABASE mybb;
mysql> SHOW DATABASES;
mysql> CREATE USER 'nonrootuser'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON mybb.* TO 'nonrootuser'@'localhost';
mysql> quit
$ mysql -unonrootuser -ppassword mybb < mybb_dump.sql

<在此处您会收到有关在命令行提供密码不妥的警告>

$ sudo mysql
mysql> USE mybb;
mysql> SHOW TABLES;

<在此处验证所有表是否都存在 - 请参阅原始帖子>

mysql> quit

2. 安装 Ruby gems

检查当前源代码中的 Gemfile 会发现

$ echo "gem 'mysql2', require: false" >> Gemfile

并非真正需要。只需将环境变量 IMPORT 设置为 1 即可。
但需要的是 MySQL 客户端的开发文件,这正是下面第一行所说的

$ sudo apt-get install libmysqlclient-dev
$ cd ~/discourse
$ IMPORT=1 bundle install

2. 准备 Discourse(PostgreSQL 数据库)

$ bundle exec rails db:drop
$ bundle exec rails db:create
$ bundle exec rails db:migrate
$ export DB_PW="password"
$ export DB_USER="nonrootuser"

3. 执行实际导入

下一行修复了 mybb.rb 导入脚本中一个长期弃用且目前已删除的方法调用,该脚本在撰写本文时仍然存在,如果已修复则不会有任何改变

$ sed -i.original 's/File.exists?/File.exist?/' script/import_scripts/mybb.rb

现在检查 Redis 是否仍在运行。Rails 安装脚本会启动它,但不会将其启用为永久服务,因此它不会在重启、崩溃等情况下保留。

$ ps -aux |grep redis
silverdr    2808  0.3  0.3  89972 14512 ?        Ssl  05:25   2:04 redis-server *:6379
[… ]

如果看不到类似上面的行,请运行

$ redis-server --daemonize yes

这与上面 Rails 安装脚本第一次安装时使用的命令相同。

最后 :pray:

$ IMPORT=1 bundle exec ruby script/import_scripts/mybb.rb

如果此时脚本没有因 YAE(又一个错误)而停止,那么就是时候打开那瓶酒了 :champagne:

剩下的一些事情

  • 好的 - 显而易见缺失的部分是用户的密码。显然,即使两个应用程序都存储了哈希和盐,但从这些哈希的长度来看,“mybb”使用了较旧的哈希算法。因此,这是可以理解的,也不是一个阻碍。每个人第一次都应该能够重置她的密码。
  • 一些 bbcode 内容未被转换。例如,我在处理代码块时遇到了问题,这些代码块周围有一些标签设置了等宽的 Courier 字体和其他东西。我没有精力再尝试自动化这个东西了。如果您设法对此做些什么,请告知我们!:man_bowing:
2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.