将 MyBB 论坛迁移到 Discourse

在本教程中,我们将学习如何使用官方 MyBB 导入脚本 将 MyBB 论坛迁移到 :discourse: 平台。

可迁移的内容

  • 分类
    • 根分类 => 根分类
    • 子分类 => 子分类
    • 根论坛 => 子分类
    • 子论坛 => 子分类
  • 主题和回复 => 主题和帖子
  • 用户
    • 用户名
    • 邮箱
    • 权限状态
    • 加入状态
  • 重定向

我们的计划非常简单:

  • 搭建本地开发环境。
  • 导出生产数据库。
  • 将生产数据库导入 Discourse。
  • 运行 MyBB 导入脚本。

让我们开始吧 :slightly_smiling_face:

搭建本地开发环境

首先,您需要按照以下指南之一安装 Discourse 平台本身。如果遇到问题,请参阅 本指南

安装 MySQL 数据库服务器;

MacOS

$ brew install mysql@5.7
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

检查服务状态:

$ brew services list

您应该看到类似以下内容:

mysql@5.7         started

如果没有,请运行以下命令并重试:

$ brew services start mysql@5.7

Ubuntu 18.04

$ sudo apt update
$ sudo apt install mysql-server -y

完成 MySQL 安装后,检查其状态:

$ systemctl status mysql.service

如果未运行,请运行以下命令:

$ sudo systemctl start mysql

对于 Windows,您可以遵循官方 安装指南

我们将此环境称为:Discourse 服务器

导出生产数据库

通过运行以下命令导出/备份生产数据库(来自 MyBB 生产服务器):

$ mysqldump -u USER_NAME -p DATABASE_NAME > mybb_dump.sql
  • 将此数据库转储文件复制到 Discourse 服务器

:bulb: 您可以使用 scprsync 来复制数据库。

将生产数据库导入 Discourse

Discourse 服务器 上,创建一个数据库:

$ mysql -u root

:bulb: 如果您的数据库用户有密码,则应使用:mysql -u root -p,然后输入您的密码。

mysql> CREATE DATABASE mybb;

通过运行以下命令确保数据库已成功创建:

mysql> SHOW DATABASES;

您应该看到类似以下内容:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| mybb               |
| sys                |
+--------------------+

此时 mybb 数据库是空的。我们的下一步是将生产数据库导入其中。

$ mysql -u root mybb < mybb_dump.sql

稍后我们将需要表前缀。因此,趁现在在这里,让我们获取它。

$ mysql -u root
mysql> USE mybb;
mysql> SHOW TABLES;

您将看到类似以下内容:

+--------------------------+
| Tables_in_mybb           |
+--------------------------+
| mybb_adminlog            |
| mybb_adminoptions        |
| mybb_adminsessions       |
| mybb_adminviews          |
| mybb_announcements       |
| mybb_attachments         |
| mybb_attachtypes         |
| ...其余表...|
+--------------------------+

如输出所示,我们的表前缀是 mybb_

运行 MyBB 导入脚本

  • 首先安装导入器的依赖项。在 Discourse 服务器 上:
$ cd ~/discourse
$ echo "gem 'mysql2', require: false" >> Gemfile
$ bundle install

接下来,您应该配置脚本以使其正常运行。将以下内容复制并粘贴到您的 shell 中(如有需要请更改值):

export DB_HOST="localhost"
export DB_NAME="mybb"
export DB_PW=""
export DB_USER="root"
export TABLE_PREFIX="mybb_"

您还有另一种配置脚本的方法。使用您选择的任何编辑器打开 script/import_scripts/mybb.rb,并更改双引号内的值以适应您的需求:

  DB_HOST ||= ENV['DB_HOST'] || "localhost"
  DB_NAME ||= ENV['DB_NAME'] || "mybb"
  DB_PW ||= ENV['DB_PW'] || ""
  DB_USER ||= ENV['DB_USER'] || "root"
  TABLE_PREFIX ||= ENV['TABLE_PREFIX'] || "mybb_"

使用干净的 Discourse 实例运行导入器:

$ bundle exec rails db:drop
$ bundle exec rails db:create
$ bundle exec rails db:migrate
$ bundle exec ruby script/import_scripts/mybb.rb

导入器将连接到 MySQL 服务器,并将您的 MyBB 数据库迁移到 Discourse 数据库。

导入器完成后,通过运行以下命令启动 Discourse 实例:

$ bundle exec rails server

接下来,启动 Sidekiq(后台作业处理器)以处理迁移的数据:

$ bundle exec sidekiq

:bulb: 您可以在 http://localhost:3000/sidekiq/queues 监控 Sidekiq 进度。

按照本 教程 设置您的 Discourse 生产服务器。

按照本 教程 对 Discourse 平台(本地 Discourse 服务器)进行备份,并将其上传到您的 Discourse 生产服务器。

:tada:

如果您对该过程有任何疑问,我很乐意提供帮助。

祝迁移顺利 :grinning:

9 个赞

您好——这看起来是一份很棒的指南。不过,由于我使用的是 cPanel 而非直接操作 Linux,且正在从共享主机迁移,因此我没有原始主机的 root 权限或 SSH 访问权限,但我可以通过 cPanel 中的 phpMyAdmin 访问并导出 MyBB 数据库。这样可行吗?

是否需要任何特殊的导出设置?此外,该数据库应复制到 Digital Ocean 服务器的哪个目录?(我使用的是 FileZilla)

可以。

这并不重要,主目录完全没问题。

3 个赞

你好,我又来了。我能按照教程进行到这一步:

bundle install

但对我来说,这一步会报错:

'请勿以 root 用户身份运行 Bundler。Bundler 在需要时会提示使用 sudo,
以 root 用户身份安装 bundle 将导致此应用程序对该机器上的所有非 root 用户失效。
您的 Gemfile 中未包含任何 gem 源。如果您需要机器上尚未安装的 gem,
请在 Gemfile 中添加如下行:
source ‘https://rubygems.org
在您的 Gemfile 列出的任何 gem 源中均找不到 gem ‘mysql2’。

有什么建议吗?

不幸的是,我对 Ruby、Linux 或 Gemfile 一无所知,只是完全按照教程的指示,通过 PuTTY 复制粘贴各种 Discourse CLI 设置任务中的命令,而没有任何理解。

我运行的是 Ubuntu 系统,并在 DigitalOcean 的 Droplet 上部署 Discourse,这有帮助吗?

另外,我看到后续有关于将数据库导出命令粘贴到“shell”中的说明。从实际操作角度来看,我当前的 PuTTY 服务器连接是否就等于“shell”?还是涉及其他某种界面或控制台?

好的,针对我刚才的问题,我在论坛上随意搜索了一下,发现:

$ sudo apt-get install libmysqlclient-dev

这条命令之后,mysql2 gem 就能安装了(不管那是什么)——尽管有警告说不要用 root 权限执行。

绕过这个问题后,进入下一步,输入:

$ bundle exec rails db:drop

又报错了:

bundler: failed to load command: rails (/usr/local/bin/rails)
Gem::Exception: can’t find executable rails for gem railties. railties is not currently included in the bundle, perhaps you meant to add it to your Gemfile?

我检查了 /usr/local/bin/ 目录,确认确实有一个名为 ‘rails’ 的文件。

尝试输入 sudo gem、 gem install rails 或 $ sudo gem install rails 都无济于事(根据网上各种针对此错误的建议)。

甚至重新从头安装了 Ruby on Rails,以确保所有常规依赖项都已就位:https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-ubuntu-18-04,但情况并未改善——无论使用 2.51 还是 2.61 版本。

我真的有点摸不着头脑了……

我可以明确地说,按照本指南的原文操作,对于在 Windows 10 的 WSL2 环境下安装 Ubuntu-18.04 并遵循官方步骤设置本地开发环境的用户来说,是完全行不通的——几乎每一步都会出现缺少依赖、连接被拒绝或其他类似错误。

经过大量折腾和在线搜索,我终于执行到了以下命令:

$ bundle exec ruby script/import_scripts/mybb.rb

但系统返回了如下错误:

mysql2/client.rb:90:in `connect’: Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2) (Mysql2::Error::ConnectionError)

这成了一个死胡同——我在网上搜索到的任何内容似乎都没有提供可行的解决方案。

我该如何解决此问题并继续下一步?非常感谢您的帮助!

1 个赞

您好,我该如何将数据库上传到我的 DigitalOcean Droplet?我使用了 DigitalOcean 的一键安装功能来安装 Discourse(Ubuntu 系统)。
我的电脑运行的是 Windows 10 Home 18362 版本。

随后我安装了 MySQL,但不知道如何“物理”地将 MyBB 数据库上传到服务器。难道没有 phpMyAdmin 可以方便地导入数据库吗?:frowning:

1 个赞

您需要使用 scp 或类似工具上传文件。然后执行类似以下的命令:

  mysql -u user -p password database < filename..sql
3 个赞

我卡住了 :frowning:

1 个赞

本指南应进行更新,以支持在 Docker 安装环境中运行导入操作,而非在本地开发机器上进行。

5 个赞

非常期待指南能在基于 Docker 的环境中运行 :slight_smile:

2 个赞

最终我放弃了自己动手,而是请了一位开发人员来负责——我把论坛上所有很棒的建议都推荐给了他(这些建议确实帮了大忙!)。我相信他是在我的 Digital Ocean 实时 droplet 上直接完成的,而不是在独立的开发环境中进行的(这样我可以方便地在他工作时随时检查;由于论坛尚未正式上线,用户并未受到影响)。换句话说,我认为这是可行的。

经过几次迭代,现在的效果相当不错:所有 MyCode 和特殊字符问题都已解决,MyBB 帖子前缀已成功翻译为 Discourse 标签,自定义的多选用户个人资料字段也成功导入。

如果他愿意,我会请他分享对标准导入脚本的任何调整以及其他在此使用的技术。

4 个赞

如果这对大家有帮助的话,我聘请的开发者 @rahilqf 已完成该项目,包括将 MyBB 自定义用户字段翻译为 Discourse 自定义用户字段(这需要安装 multi-select-user-field 插件),将 MyBB 帖子前缀翻译为 Discourse 标签,并去除 MyBB 帖子文本中几乎所有冗余的 MyCode 标签。

他的定制版导入脚本已在此分享:Custom MyBB to Discourse Import Script

他还成功合并了 Yahoo Groups 的 Mbox 归档,使用的是标准的 Yahoo 导入脚本——不过在此过程中附件似乎未能正确转换。但就我而言,这并不是什么大问题。

3 个赞

我正在从 MyBB 数据库转换用户、帖子、主题等数据!

我遵循了这份指南:Install Discourse on Ubuntu or Debian for Development

http://localhost:3000/http://forum.omaggieconcorsi.com:3000/ 都无法访问。

不过,程序确实在进行转换,只是我不知道在哪里导出转换后的数据。
既然我无法通过 http://forum.omaggieconcorsi.com:3000/http://localhost:3000/ 访问 Discourse,那我该如何至少从旧的 MyBB 论坛导出包含帖子、用户等数据的数据库,然后将其导入到新的 Discourse 实例中呢?

谢谢!

你是在运行浏览器的同一台电脑上按照这些说明操作的吗?

1 个赞

是的,始终是同一台电脑

好的,我已在 Ubuntu 18.04 真实系统(安装在 PC 上)上按照该指南操作,localhost:3000 可以正常访问!

但现在遇到了 MySQL 数据库的问题 :frowning: 抱歉…

我输入了:

debby@debby-MS-7721: mysql -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

:frowning:

编辑:我已使用以下命令为 root 用户设置了密码:ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

并在 DB_PW 中填写了 root 用户的密码。

……现在它正在创建用户!!

为我祈祷吧,经过数周的测试,这是否终于到了成功的时候?

1 个赞

我试图将数据库从 MyBB 导入到 Discourse。和 @Paul_King 一样,我在 DigitalOcean 服务器上无法让它正常工作。按照这份指南操作时,我不断遇到各种错误。

我卡在执行以下命令这一步:

$ bundle exec rails db:drop
bundler: 未找到命令:rails
请使用 `bundle install` 安装缺失的 gem 可执行文件

bundle install 显示已完成:

$ bundle install
您的 Gemfile 中多次列出了 gem mysql2 (>= 0)。
您应该只保留其中一个。
虽然现在不是问题,但如果您稍后更改其中之一的版本,可能会导致错误。
正在使用 bundler 1.16.1
正在使用 mysql2 0.4.10
Bundle 完成!2 个 Gemfile 依赖项,现已安装 2 个 gems。
使用 `bundle info [gemname]` 查看捆绑的 gem 安装位置。

尝试手动安装 rails 时出现以下错误:

$ gem install rails
正在构建原生扩展。这可能需要一些时间...
错误:安装 rails 时出错:
        错误:构建 gem 原生扩展失败。

    当前目录:/var/lib/gems/2.5.0/gems/racc-1.5.2/ext/racc/cparse
/usr/bin/ruby2.5 -r ./siteconf20210110-8155-1ms05r3.rb extconf.rb
mkmf.rb 无法在 /usr/lib/ruby/include/ruby.h 找到 ruby 的头文件

extconf 失败,退出代码 1

Gem 文件将保留在 /var/lib/gems/2.5.0/gems/racc-1.5.2 中以便检查。
结果已记录到 /var/lib/gems/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/gem_make.out

这令人极度沮丧。


我让这篇帖子保持开放状态,并成功安装了 rails。随后又遇到了一堆其他错误,并设法逐一修复。错误。在。每。一。个。步。骤。上。

我从未对软件产生过如此纯粹的憎恨。Ruby 为什么会这样?这简直是一场噩梦。现在我卡在这个错误上:

$ bundle exec rails db:drop
回溯(最近一次调用最后):
        1: 来自 /usr/local/bin/bundle:23:in `\u003cmain\u003e'
/usr/local/bin/bundle:23:in `load': 无法加载文件 -- /usr/share/rubygems-integration/all/gems/bundler-1.16.1/exe/bundle (LoadError)

有人能帮忙吗?

1 个赞

没什么用,但我在本地开发环境(用于生成 Discourse 数据库文件/备份)和直接在 Digital Ocean Droplet 上部署时,也遇到了同样的难题。最终,在浪费了数十个小时后,我觉得人生苦短,便从 Fiverr 雇了一位开发者(他花了几周时间才搞定,但总算成功了)。
我怀疑,目前并没有足够的动力让任何人去简化这个过程。

祝你好运——如果你最终解决了问题,希望能在这里留下一些线索,供后来者参考!

1 个赞

你是如何安装 Rails 的?是否参考了某个开发指南?(例如 在 Ubuntu 上安装 Discourse 进行开发的初学者指南

关于在生产容器内运行安装脚本,有一些 操作指南文档(我通常这样做),你可以参考其中一份作为指南。