本文档现已由另一篇 SMF2 指南取代:Migrate an SMF2 forum to Discourse
我们非常希望将我们熟悉的老牌 SMF2 论坛迁移到 Discourse。我们拥有 1000 多名成员,约 20,000 篇帖子,分布在约 2,000 个主题中。
在 SMF2 上,我们没有使用投票或附件——实际上,甚至不是每个人都有头像。不过,有些帖子严重依赖“高级”BBCode。
以下是我们完成迁移的方法。
先决条件
只需按常规方式安装 Discourse。
我还添加了 Discourse BBCode 插件,以便开箱即用地处理列表、大小、颜色等。
如果您无法远程连接到 SMF2 的 MySQL 数据库,则必须将数据从转储文件导入到一个临时的 Docker 容器中。
如果您的数据库接受远程连接,或者运行在同一主机上,您可以跳过此步骤。
临时的 Docker MySQL 容器
转储您的数据库:
cd /tmp/
mysqldump –u[用户名] –p[密码] [数据库名] > sqldump.sql
创建临时的 Docker MySQL 容器:
cd /tmp/
docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v "$PWD":/backup --name=mysql mysql
然后进入该容器:
docker exec -it mysql bash
导入您的数据库转储文件:
mysql -uuser -ppass db < /backup/sqldump.sql
如果出现以下错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
只需等待一分钟,让容器完全启动。
为了数据库兼容性,我不得不更改临时数据库的身份验证插件,但您的情况可能有所不同:
mysql -uuser -ppass db
使用以下查询:
ALTER USER user
IDENTIFIED WITH mysql_native_password
BY 'pass';
然后退出并检查您的 MySQL 实例 IP 地址:
exit
docker inspect mysql | grep IPAddress
现在您就有了 SMF2 数据库的可运行副本。
临时的 Discourse 导入容器
让我们基于默认的 app.yml 容器创建一个名为"import"的新容器:
cd /var/discourse
cp containers/app.yml containers/import.yml
nano containers/import.yml
将 mysql-dep 模板添加到您的新导入容器中:
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## 如果您想添加 Lets Encrypt (https),请取消注释这两行
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
- "templates/import/mysql-dep.template.yml"
然后只需执行:
/var/discourse/launcher stop app
/var/discourse/launcher rebuild import
导入到 Discourse
一旦导入容器重建完成,我们就必须进入它进行我们的最新调整:
/var/discourse/launcher enter import
cd /var/www/discourse/ # 脚本必须从该确切目录启动,但您应该已经到达那里了
su discourse -c "bundle exec ruby script/import_scripts/smf2.rb -h 172.17.0.3 -u user -p pass -d db -f smf_ -t Europe/Paris"
- -h: 您的 SMF2 MySQL 数据库主机名(此处为 Docker 容器的 IP);
- -u: SMF2 MySQL 用户;
- -p: SMF2 MySQL 密码;
- -d: SMF2 MySQL 数据库;
- -f: SMF2 表前缀;
- -t: SMF2 时区。
清理
如果您创建了它,请停止并删除临时的 MySQL Docker 容器:
docker stop mysql
docker rmi mysql
停止 Discourse "import"容器,并使用 launcher 进行清理:
/var/discourse/launcher destroy import
/var/discourse/launcher cleanup
我实际上成功销毁了我的主容器
没什么大不了的:
/var/discourse/launcher rebuild app
导入后的 Discourse 设置
一些默认设置可能会导致导入的帖子和权限出现问题。请根据您的需求从 Discourse 设置面板中更改这些设置:
- 最小主题标题长度:我将其改为 3——标题太短的主题很难处理(无法移动等);
- 标题美化:我不得不将其关闭——标题不以大写字母开头的主题很难处理(无法移动等)。
参考文献
- 如何使用 bbpress 导入脚本 - 或任何其他带有 mysql 依赖的导入脚本 (lead4good, 2017 年 5 月);
- “无法加载身份验证插件 ‘caching_sha2_password’” (meow, 2018 年 4 月)。