Discourse从安装到Discuz成功迁移,一步一步来的详细指南(面向新手,Discuz迁移到Discourse)

导入
discuz
迁移
转换

(freemangl) #1

在开始之前:

多年以前一直想把discuz迁移到Discourse,但遇到种种问题(主要还是懒)就一直搁置了,现在条件基本成熟,在迁移过程中不断尝试,终于摸索出一套相对简单易上手的迁移步奏。现在分享给大家。

迁移已经在无限星辰论坛测试环境成功运行:http://forums.infinity-game.com:8/ (部分图片无法显示是因为测试论坛加了端口号的原因)

测试中1万会员,8万帖子,导入耗时4小时左右。

感谢@zh99998和本站站长对导入脚本做出的贡献

感谢Twilight(一位大神)对我的帮助,在百忙之中帮我解决了新版本迁移脚本不能成功执行、以及解决了很多问题,以及在discuz中验证过email的用户不再发送验证邮件。

本导入脚本相对于之前的版本解决了以下的问题:

  • Discuz中验证过email的用户不再发送验证邮件
  • 导入各种卡住无法进行的问题
  • 导入阅读数
  • 导入discuz中的表格,以及表格中的内容
  • 解决discuz用户连接自动转换为discourse的用户连接
  • 解决了discuz用户相册中的图片引用到论坛自动转换为帖子附件
  • 解决了discuz帖子中的列表转换为dis中的列表
  • 解决了[方括号]转换后前方括号[消失的问题

已知问题:

  • 一些特殊的discuz插件不支持,比如楼中楼。
  • 中文用户名不能使用特殊字符(因为中文用户名插件不支持)
  • 不能转换投票中的投票记录数,因为实现起来比较复杂。
  • 如果discuz论坛有帖子的id中包括后面帖子的链接,则无法把后面帖子的链接转换为discourse链接格式(因为转换脚本只会判断当前帖子id之前的帖子链接是否存在)

不论如何,从功能性来说,此脚本已经算是市面上论坛转换器中最完美的之一了。

一、全新安装Discourse:

安装Discourse,强烈建议使用本地虚拟机安装Ubuntu 18.04,并在所有导入环境配置好,运行导入脚本前执行快照,这样可以在反复导入测试中节省大量时间。建议导入机器配置:4核CPU,8G内存,500G硬盘。

安装好Ubuntu后登陆到虚拟机命令行(ssh),执行以下命令把discourse的docker安装文件下载到本机:
注意:命令行后#以后内容为命令说明,不需要输入命令行。

wget -qO- https://get.docker.com/ | sh  #下载安装docker程序
sudo -s #切换到root用户,此处需要输入你安装ubuntu时设置的密码
mkdir /var/discourse #在/var文件夹下创建discourse文件夹
git clone https://github.com/discourse/discourse_docker.git /var/discourse #把discourse docker安装文件下载到/var/discourse目录中
cd /var/discourse
cp samples/standalone.yml containers/app.yml

现在我们需要编辑app.yml配置文件,加入国内的ruby源,使安装过程更顺利,截图高亮部分是你需要添加或修改的地方:
- "templates/web.china.template.yml"

添加以下插件:

- git clone https://github.com/zh99998/discourse-username-localization.git #支持中文用户名
- git clone https://github.com/zh99998/discourse-discuz-migrate.git #支持discuz的用户密码加密方式
- git clone https://github.com/fantasticfears/discourse-chinese-localization-pack.git #如果你需要本站站长提供的中文化插件包添加此行

如图所示:

下面我们将要下载discourse的docker镜像,整个下载内容大约在2G,在国内经常无法成功下载,所以我们需要配置国内的镜像加速服务,这里使用阿里云的镜像加速服务,强烈建议你申请自己的阿里容器镜像服务(免费)

输入以下命令配置阿里云的镜像加入服务:(这里使用了别人的镜像加速地址,不保证可用)

sudo mkdir -p /etc/docker 
sudo tee /etc/docker/daemon.json <<-'EOF' 
{
  "registry-mirrors": ["https://2h3po24q.mirror.aliyuncs.com "] 
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

完成以上配置后,现在执行安装:

cd /var/discourse
./discourse-setup

至此,discourse已经全部安装完成,下面执行迁移前的准备工作

二、开始迁移(导入)

以下操作在docker容器中(执行转换程序所必要的运行环境配置):

1.进入docker安装bbcode to md:

docker ps #显示当前运行的容器
docker exec -it app /bin/bash #进入名称为app的容器(discourse的容器名称)
cd /shared
git clone https://github.com/nlalonde/ruby-bbcode-to-md.git 
cd ruby-bbcode-to-md 
gem build ruby-bbcode-to-md.gemspec 
gem install ruby-bbcode-to-md-0.0.14.gem

2.安装转换所需要的依赖包:

apt-get install libmysqlclient-dev #安装mysql client,转换过程中需读取discuz的数据库需要

编辑/var/www/discourse/Gemfile文件,添加以下内容:(均为执行转换脚本所需的依赖包):

第一行把gems源替换为rubychina的:https://gems.ruby-china.com
gem 'ruby-bbcode-to-md', path:'/shared/ruby-bbcode-to-md'
gem 'mysql2'
gem 'php_serialize'
gem 'miro'

3.然后执行以下命令安装依赖包:

cd /var/www/discourse
bundle install --no-deployment

4.安装完成后,退出容器,重启discourse容器:

exit #退出容器
/var/discourse/launcher restart app #重启discourse容器

注意,以下配置严重依赖于你的文件存放路径,强烈建议新手不要改变本教程中的任何文件路径。

上传迁移所需要的所有文件(以下操作在主机中)

1.上传discuz_x.rb(在此)到主机/var/discourse/shared/standalone/目录中,你需要编辑所有#注释部分为你自己的环境。
2.把原安装的discuz程序整个目录上传到主机/var/discourse/shared/standalone/目录下,本案例为bbs目录
image

3.上传或修改附件中的tags.rb文件到主机/var/discourse/shared/standalone/ruby-bbcode-to-md/lib/tags/目录下覆盖原文件。此步奏是解决转换过程中以链接形式插入的图片不能正常转换为附件的问题。
修改方法:
(1).在@@tags = { 下添加:

:xattach => {
  :html_open => '[xattach]', :html_close => '[/xattach]'},

(2).在:url => { 下的
:only_allow => [],
修改为
:only_allow => [ :xattach ],
如图所示:

强烈建议此时执行虚拟机快照,以便快速恢复配置完成的状态,防止
转换过程中出现问题,或是需要反复导入测试,

4.执行转换程序:(以下操作在容器中)

docker exec -it app /bin/bash #进入discourse容器
su - discourse #切换到discourse用户下,否则因数据库权限而无法执行转换程序
cp /shared/discuz_x.rb /var/www/discourse/script/import_scripts/ #拷贝刚才上传到主机的转换脚本到容器的转换目录下
cd /var/www/discourse/
RAILS_ENV=production bundle exec ruby script/import_scripts/discuz_x.rb bbcode-to-md #执行转换程序

后记:

1.如果你在测试环境中运行转换脚本,只需在生产环境安装好discourse后把测试环境/var/discourse/shared/目录下所有文件复制到生产环境,再./launcher rebuild app即可。
2.如果你在生产环境中运行转换脚本,只需要./launcher rebuild app即可恢复discourse运行的纯净环境。

导入脚本在此:https://github.com/freemangl/discourse/blob/master/script/import_scripts/discuz_x.rb
tags.zip (1.4 KB)


迁移 Discuz 站点时导入脚本错误
(freemangl) #2

有任何疑问,请回复详细说明。如果上文有任何不明白的地方,请回帖指出,我会不断编辑完善。


(图戈戈) #3

能从discuz导入的话真好,不过现在的插件还是太少了


#4

大佬,又出问题了。

creating categories
   39 / 145 ( 26.9%)  [505550 items/min]  Traceback (most recent call last):
    12: from script/import_scripts/discuz_x.rb:1021:in `<main>'
    11: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
    10: from script/import_scripts/discuz_x.rb:58:in `execute'
     9: from script/import_scripts/discuz_x.rb:266:in `import_categories'
     8: from /var/www/discourse/script/import_scripts/base.rb:412:in `create_categories'
     7: from /var/www/discourse/script/import_scripts/base.rb:412:in `each'
     6: from /var/www/discourse/script/import_scripts/base.rb:431:in `block in create_categories'
     5: from /var/www/discourse/script/import_scripts/base.rb:470:in `create_category'
     4: from /usr/local/lib/ruby/gems/2.5.0/gems/activesupport-5.2.0/lib/active_support/core_ext/object/try.rb:8:in `try'
     3: from /usr/local/lib/ruby/gems/2.5.0/gems/activesupport-5.2.0/lib/active_support/core_ext/object/try.rb:19:in `try!'
     2: from /usr/local/lib/ruby/gems/2.5.0/gems/activesupport-5.2.0/lib/active_support/core_ext/object/try.rb:19:in `public_send'
     1: from script/import_scripts/discuz_x.rb:295:in `block (2 levels) in import_categories'
 /usr/local/lib/ruby/gems/2.5.0/gems/activemodel-5.2.0/lib/active_model/attribute_methods.rb:430:in 
 `method_missing': undefined method `logo_url=' for #<Category:0x000055a82da1c1f8> (NoMethodError)

您看怎么办?

还有一个就是,第 #109 行的 pre_common_member,并没有使用 DB_TABLE_PREFIX,从而导致使用非默认表前缀的出现问题,但我不知道在这如何改成让它使用 DB_TABLE_PREFIX 变量,您看能解决不。

559 行也有:


(freemangl) #5

看着像在导入create_categories(板块)的时候出错了。为何你之前用老脚本没有提示这个错误呢?

而你说的用户表前缀,建议先批量编辑dz的用户表前缀,再导入,之前好像通过变量的方式会报错。

来加我QQ 25248920,你的问题可能要单独调试代码。