迁移phpBB3论坛到Discourse (中文翻译)

本指南将向您展示如何使用 phpBB3 导入脚本 从 phpBB 3.0 导入到 Discourse 3.3

可以导入哪些数据?

  • 用户
  • 头像 (可选)
  • 匿名用户(作为用户“系统”或已暂停用户)
  • 密码哈希,可与 migratepassword 插件 一起使用 (可选)
  • 用户个人资料数据(出生日期、网站、位置、自定义字段等)
  • 群组
  • 类别和论坛
  • 主题和帖子
  • 民意调查和投票 (可选)
  • 表情符号
  • BBCodes
  • 主题和帖子的内部链接
  • 置顶主题和(全局)公告
  • 私人消息 (可选)
  • 附件 (可选)
  • 书签 (可选)
  • 导入类别、主题和帖子的 [永久链接][永久链接] (可选)

1. 使用 Docker 容器导入

这是将内容从 phpBB3 论坛导入 Discourse 的推荐方法。

1.1.安装 Discourse

按照 官方安装指南 安装 Discourse。
之后,最好转到管理部分并配置一些设置:

  • 如果导入的主题不应向公众显示,请启用 login_required
  • 如果用户个人资料不应向公众显示,请启用 hide_user_profiles_from_public
  • 如果您不希望 Discourse 下载帖子中嵌入的图像,请禁用 download_remote_images_to_local
  • 如果您启用了 download_remote_images_to_local 并且不希望您的用户收到大量有关系统用户编辑的帖子的通知,请启用 disable_edit_notifications
  • 如果大多数主题标题使用不应映射到 ASCII 的字符(例如阿拉伯语),请更改 slug_generation_method 的值。有关更多信息,请参阅 此帖子

:bangbang: 以下步骤假设您已在 Ubuntu 上安装了 Discourse,并且您已通过 SSH 连接到计算机或可以直接访问计算机的终端。

1.2. 准备 Docker 容器

将容器配置文件 app.yml 复制到 import.yml,并使用您喜欢的编辑器对其进行编辑。

cd /var/discourse
cp containers/app.yml containers/import.yml
nano containers/import.yml

-“templates/import/phpbb3.template.yml” 添加到模板列表中。之后它应该看起来像这样:

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/phpbb3.template.yml”

就是这样。您可以保存文件,关闭编辑器并构建容器。

/var/discourse/launcher stop app
/var/discourse/launcher rebuild import

构建容器会在容器的共享目录中创建一个 import 目录。它看起来像这样:

/var/discourse/shared/standalone/import
│── data
│── mysql
└── settings.yml

1.3. 配置导入器

您可以通过编辑已复制到 import 目录中的示例 settings.yml 文件来配置导入器。

nano /var/discourse/shared/standalone/import/settings.yml

settings 文件 有详尽的文档,并带有合理的默认值,但无论如何,这里有几个提示:

1.3.1. 连接到远程数据库

如果您想连接到远程数据库,请更改数据库 hostportusernamepasswordschema。确保您的 MySQL 服务器允许远程连接

1.3.2.连接到内部数据库

Docker 容器附带与 MySQL 兼容的 MariaDB 服务器。如果您要使用它,则无需更改任何数据库设置。您所需要的只是一个可以通过多种方式创建的数据库转储。以下是其中两种:

  • 在 phpBB 的管理控制面板中创建数据库备份

  • 连接到数据库主机并创建数据库转储:
# 将最后一个参数“phpbb”替换为数据库架构名称
mysqldump --user root --password --result-file phpbb_mysql.sql phpbb

将数据库转储复制到 /var/discourse/shared/standalone/import/data/ 目录中。如果您创建了 gzipbzip2 压缩备份,则需要提取文件并确保文件名为 phpbb_mysql.sql

1.3.3. 其他设置

  • 如果您的 phpBB 论坛未使用数据库表的默认命名,请更改 table_prefix

  • 确保 phpbb_base_dir 指向 /shared/import/data

1.4. 复制附件和图片

如果您不想导入附件、头像或表情,可以跳过此步骤。

使用 FTP 或 SCP 连接到您的 phpBB3 主机,并将以下目录下载到 /var/discourse/shared/standalone/import/data 目录中:

  • 附件通常存储在 files 目录中。您可以通过检查管理控制面板中的路径来确认。

  • 头像通常存储在 images/avatars 目录中。您可以通过检查管理控制面板中的路径来确认。

  • 表情存储在 images/smilies 目录中。

如果您下载了所有这些目录,则 import 目录应如下所示:

/var/discourse/shared/standalone/import
├── data
│   ├── files
│   ├── images
│   │   ├── avatars
│   │   │   ├── gallery
│   │   │   └── upload
│   │   └── smilies
├── mysql
└── settings.yml

1.5. 执行导入脚本

:bulb: 提示:最好在 tmuxscreen 会话中启动导入,这样在 SSH 连接丢失的情况下,您可以重新连接到会话。

让我们通过进入 Docker 容器并在 Docker 容器内启动导入脚本来开始导入。

/var/discourse/launcher enter import
import_phpbb3.sh # 在 Docker 容器内

根据论坛的大小,现在是喝杯咖啡或睡觉的时间了:
导入脚本完成后会显示一条消息,如下所示:完成(00h 26min 52sec)

在等待导入完成时,您可以**查看常见问题解答**。

:bulb: 提示:您可以随时通过按 Ctrl+C 中止导入
重新启动导入时,它将从中断处继续。

导入完成后,您可以退出并停止 Docker 容器。

exit # 在 Docker 容器内
/var/discourse/launcher stop import

1.6. 启动 Discourse

让我们启动应用程序容器并查看导入的数据。

/var/discourse/launcher start app

Discourse 将启动,Sidekiq 将开始对所有导入的帖子进行后处理。这可能需要相当长的时间。您可以通过以管理员身份登录并访问 http://discourse.example.com/sidekiq 来查看进度

1.7.清理

那么,您对导入的结果感到满意,并想释放一些磁盘空间?以下命令将删除用于导入的 Docker 容器以及导入期间使用的所有文件。

/var/discourse/launcher destroy import
rm /var/discourse/containers/import.yml
rm -R /var/discourse/shared/standalone/import

1.8. 结束

现在是时候庆祝和享受您的新 Discourse 实例了!:tada:


2. 使用开发环境导入

以下说明适用于想要使用开发环境导入的用户。

  1. 按照 UbuntuMac OS X 的指南设置您的开发环境。

以下说明假设您使用的是 Ubuntu。

  1. 确保 Discourse 和 Sidekiq 均未运行。

  2. 安装一些依赖项:

sudo apt-get update
sudo apt-get install libmysqlclient-dev
cd ~/discourse
IMPORT=1 bundle install
git checkout Gemfile Gemfile.lock
  1. 配置您的导入。 ~/discourse/script/import_scripts/phpbb3/settings.yml 处有一个 示例设置文件

  2. 开始导入(如果您将自定义设置放在其他位置,请更改设置文件的路径):

cd ~/discourse/script/import_scripts
IMPORT=1 bundle exec ruby​​ phpbb3.rb phpbb3/settings.yml
  1. 等待导入完成。如果速度慢得像爬行一样,您可以重新启动它。

  2. 启动您的 Discourse 实例:

cd ~/discourse
bundle exec rails server
bin/ember-cli
  1. 启动 Sidekiq 并让其工作:bundle exec sidekiq
    根据您的论坛大小,这可能需要很长时间。您可以在 http://localhost:3000/sidekiq 监控进度

3. 路线图

以下是导入器仍缺少的内容列表(无特定顺序):

  • 添加对 cakeday plugin 的支持
  • 导入的看起来像 Markdown 的文本应该被转义
  • 关闭 phpBB3 中已关闭的主题
  • 将未批准的帖子导入为隐藏帖子
  • 导入每个帖子和私人消息的阅读状态
  • 改进 BBCode 到 Markdown 转换器 (ruby-bbcode-to-md)
  • 支持自定义模式以用于主题和帖子的内部链接(SEO 优化 URL)
  • 添加对更多数据库源的支持:MS SQL Server、Oracle、PostgreSQL

请随意启动您最喜欢的 Ruby IDE 并帮助使导入器变得更好。:wink:


4. 常见问题

4.1. 我有一个经过大量修改的论坛。导入脚本还能用吗?

也许。这取决于这些修改对数据库做了哪些更改。你必须试一试。

4.2. 为什么导入过程这么慢?

导入受 CPU 限制。如果你很着急,应该使用单核速度快的 CPU。在典型的 DigitalOcean 服务器上,导入速度约为每分钟 400-600 篇帖子。裸机服务器(可能还有你的台式电脑)通常要快两倍左右。

4.3. 我有一个大型论坛,里面有很多用户和帖子。如何最大限度地减少导入期间的停机时间?

你可以进行增量导入以缩短停机时间。
但请注意:进行增量导入时,可能会有数据丢失的风险,因为增量导入期间不会更新现有帖子和用户。您将丢失导入期间发生的帖子编辑以及对用户个人资料所做的更改。

4.4. 我可以在我的台式计算机或暂存服务器上运行基于 Docker 的导入吗?

当然。导入完成后,您可以将 Discourse 实例移动到其他服务器。查看 此操作方法 了解说明。

4.5. 脚本在导入期间会发送任何电子邮件吗?

导入期间禁用电子邮件发送,Discourse 会在一段时间内向导入的用户发送摘要电子邮件。这可以通过站点设置 default_email_digest_frequency 进行配置,默认为 7 天。

4.6. 我应该使用哪个版本的 Discourse 进行导入?

建议始终使用 Discourse 的 tests-passedbeta 频道进行导入,因为导入脚本正在不断改进。因此,请确保在 app.ymlimport.yml 配置文件中相应地设置了 version 的值。如果您遵循 官方安装指南,一切都应该没问题。

4.7。我启用了密码导入。为什么我的用户无法使用旧密码登录?

确保您按照 安装插件的方法app.yml 中启用了 migratepassword 插件。此外,如果旧密码被认为不安全,用户将无法使用旧密码登录。默认情况下,Discourse 要求密码长度至少为 10 个字符(对于管理员为 15 个),并且密码不能在 常用密码列表 中。但用户始终可以通过单击登录对话框中的“我忘记了密码”链接或直接访问 https://discourse.example.com/password-reset 来重置密码

4.8. 导入成功,但用户列表为空。出了什么问题?

用户列表不会立即显示。它是由 Sidekiq 执行的后台任务生成的。您可能需要等到导入数据的所有后期处理完成。

4.9. 我的论坛中有自定义表情。它们被导入了吗?

是的。您可以在设置文件中将它们映射到表情符号,否则它们将作为图像导入。所有默认表情(除了 )均已具有表情符号映射。

把上面文档转换成wiki模式,方便众人共同完善它。