本指南将向您展示如何使用 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
的值。有关更多信息,请参阅 此帖子。
以下步骤假设您已在 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. 连接到远程数据库
如果您想连接到远程数据库,请更改数据库 host
、port
、username
、password
和 schema
。确保您的 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/
目录中。如果您创建了 gzip 或 bzip2 压缩备份,则需要提取文件并确保文件名为 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. 执行导入脚本
让我们通过进入 Docker 容器并在 Docker 容器内启动导入脚本来开始导入。
/var/discourse/launcher enter import
import_phpbb3.sh # 在 Docker 容器内
根据论坛的大小,现在是喝杯咖啡或睡觉的时间了:
导入脚本完成后会显示一条消息,如下所示:完成(00h 26min 52sec)
在等待导入完成时,您可以**查看常见问题解答**。
提示:您可以随时通过按 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 实例了!
2. 使用开发环境导入
以下说明适用于想要使用开发环境导入的用户。
以下说明假设您使用的是 Ubuntu。
-
确保 Discourse 和 Sidekiq 均未运行。
-
安装一些依赖项:
sudo apt-get update
sudo apt-get install libmysqlclient-dev
cd ~/discourse
IMPORT=1 bundle install
git checkout Gemfile Gemfile.lock
-
配置您的导入。
~/discourse/script/import_scripts/phpbb3/settings.yml
处有一个 示例设置文件 -
开始导入(如果您将自定义设置放在其他位置,请更改设置文件的路径):
cd ~/discourse/script/import_scripts
IMPORT=1 bundle exec ruby phpbb3.rb phpbb3/settings.yml
-
等待导入完成。如果速度慢得像爬行一样,您可以重新启动它。
-
启动您的 Discourse 实例:
cd ~/discourse
bundle exec rails server
bin/ember-cli
- 启动 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 并帮助使导入器变得更好。
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-passed
或 beta
频道进行导入,因为导入脚本正在不断改进。因此,请确保在 app.yml
和 import.yml
配置文件中相应地设置了 version
的值。如果您遵循 官方安装指南,一切都应该没问题。
4.7。我启用了密码导入。为什么我的用户无法使用旧密码登录?
确保您按照 安装插件的方法 在 app.yml
中启用了 migratepassword 插件。此外,如果旧密码被认为不安全,用户将无法使用旧密码登录。默认情况下,Discourse 要求密码长度至少为 10 个字符(对于管理员为 15 个),并且密码不能在 常用密码列表 中。但用户始终可以通过单击登录对话框中的“我忘记了密码”链接或直接访问 https://discourse.example.com/password-reset
来重置密码
4.8. 导入成功,但用户列表为空。出了什么问题?
用户列表不会立即显示。它是由 Sidekiq 执行的后台任务生成的。您可能需要等到导入数据的所有后期处理完成。
4.9. 我的论坛中有自定义表情。它们被导入了吗?
是的。您可以在设置文件中将它们映射到表情符号,否则它们将作为图像导入。所有默认表情(除了 和
)均已具有表情符号映射。