将 phpBB3 论坛迁移到 Discourse

我也遇到过同样的错误。我认为这通常是因为 shared/standalone/import/mysql/imported 文件过期导致的。删除该文件即可解决此错误。

2 个赞

密码迁移似乎对我没有起作用。

我在从 phpBB 3.0 数据导入之前,已在 shared/standalone/import/settings.yml 中设置了 passwords: true。我在 containers/app.yml 中包含以下内容:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discoursehosting/discourse-migratepassword.git

导入后我运行了 ./launcher rebuild app。导入过程似乎完全成功,只是我无法使用来自 phpBB 的密码登录。我在导入过程中没有发现任何相关的错误信息,而且密码长度为 20 个字符,应该满足最小长度限制。

我应该关注哪些方面来排查问题?

补充一些信息:我在数据库的 user_custom_fields 表中看到了 import_pass 条目,它们与 phpBB 数据库中的密码哈希匹配,所以这部分似乎工作正常?

编辑:哦,我明白是怎么回事了。我完全忘了我们之前已经将 phpBB 切换到了 LDAP 认证……我导入的密码本身完全没问题,只是已经 15 年没用了!所以现在我需要想办法从 LDAP 中提取密码哈希……:slight_smile:

1 个赞

大家好,

最近有人成功导入了带附件的内容吗?

用户和帖子都正常,但附件没有添加到帖子中。

我的一些帖子中仍然保留着 BBCode:

奇怪的是,files 文件夹的内容确实被转移到了 Discourse 的 uploads 文件夹中:

起初,我以为是因为 phpBB 3.0.12 版本太旧,于是我升级了 phpBB 到 3.0.14,清理了 Discourse 和 uploads 文件夹,并再次尝试导入,但依然没有成功。

随后,我在测试服务器上升级了 phpBB 到 3.2.0(在运行其支持工具清理了数据库中的插件之后),但仍然没有成功。

在进一步检查我的数据库之前,我想确认一下这个脚本对其他人是否有效。

我不认为我的配置文件有误,但也许重新审视一下会有所帮助。

# 这是 phpBB3 导入器的示例配置文件。

database:
  type: MySQL # 目前仅支持 MySQL
  host: localhost
  port: 3306
  username: root
  password:
  schema: phpbb
  table_prefix: phpbb_ # 如果您的论坛使用了不同的前缀,请修改此项。通常所有表名都以 phpbb_ 开头
  batch_size: 1000 # 除非您清楚自己在做什么,否则请勿修改此项。默认值(1000)通常可以正常工作。

import:
  # 如果您将多个 phpBB 论坛导入到同一个 Discourse 论坛中,请设置此项。
  #
  # 例如,在导入多个站点时,为所有导入的 ID 添加前缀 'first' 以避免冲突。
  # 后续导入运行必须使用不同的 'site_name'。
  #
  # site_name: first
  #
  site_name:

  # 创建新分类
  #
  # 例如,创建一个父分类和一个子分类。
  #
  # new_categories:
  # - forum_id: foo
  #   name: Foo 分类
  # - forum_id: bar
  #   name: Bar 分类
  #   parent_id: foo
  #
  new_categories: []

  # 分类映射
  #
  # 例如,来自 phpBB 分类 1 和 2 的主题将被导入到新的 "Foo 分类" 中,
  # 来自 phpBB 分类 3 的主题将被导入到子分类 "Bar 分类" 中,
  # 来自 phpBB 分类 4 的主题将合并到分类 5,而分类 6 将被跳过。
  #
  # category_mappings:
  #   1: foo
  #   2: foo
  #   3: bar
  #   4: 5
  #   6: SKIP
  #
  category_mappings: {}

  # 标签映射
  #
  # 例如,来自 phpBB 分类 1 的导入主题将被标记为 'first-category',等等。
  #
  # tag_mappings:
  #   1:
  #   - first-category
  #   2:
  #   - second-category
  #   3:
  #   - third-category
  #
  tag_mappings:

  # 等级到信任等级的映射
  #
  # 将 phpBB 3.x 的等级映射到信任等级
  # 等级至少为 3000 的用户将获得 TL3,依此类推。
  #
  # rank_mapping:
  #   trust_level_1: 200
  #   trust_level_2: 1000
  #   trust_level_3: 3000
  #
  rank_mapping:

  # 警告:除非您清楚自己在做什么,否则请勿启用此选项。
  # 它可能会破坏 BBCode 到 Markdown 的转换,并减慢导入速度。
  use_bbcode_to_md: false

  # 这是您当前 phpBB 安装(或其副本)的根目录路径。
  # 导入器期望在基础目录中找到 /files 和 /images 目录。
  # 如果您未使用基于 Docker 的导入器,则需要将此路径更改为类似 /var/www/phpbb 的路径。
  # 只有当您希望导入头像、附件或自定义表情符号时才需要此项。
  phpbb_base_dir: /shared/import/data

  site_prefix:
    # 此项用于重写帖子中的内部链接
    original: ***.com   # 不包含 http(s)://
    new: https://****.org       # 包含 http:// 或 https://

  # 如果您希望将旧论坛链接重定向到新位置,请启用此项。
  permalinks:
    categories: true  # 重定向 /viewforum.php?f=1 到 /c/category-name
    topics: true      # 重定向 /viewtopic.php?f=6&t=43 到 /t/topic-name/81
    posts: false      # 重定向 /viewtopic.php?p=2455#p2455 到 /t/topic-name/81/4
    # 为每种类型的链接添加前缀,例如 'forum',以便将 /forum/viewtopic.php?f=6&t=43 重定向到 /t/topic-name/81
    # 如果您的论坛不是安装在子文件夹中,请留空此项。
    prefix:

  avatars:
    uploaded: true  # 导入上传的头像
    gallery: false   # 导入 phpBB 提供的预定义头像
    remote: false   # 警告:这可能会显著减慢导入速度。它将尝试下载远程头像。

  # 当为 true 时:匿名用户将被导入为暂停用户。他们无法登录且没有电子邮件地址。
  # 当为 false 时:系统将使用系统用户代表所有匿名用户。
  anonymous_users: true

  # 如果您希望导入密码哈希以便使用 "migratepassword" 插件,请启用此项。
  # 这将允许用户使用其当前密码登录。
  # 该插件可在以下地址获取:https://github.com/discoursehosting/discourse-migratepassword
  passwords: false

  # 默认情况下,以下所有内容都会被导入。您可以通过将其设置为 false 来禁用它们。
  bookmarks: true
  attachments: true
  private_messages: false
  polls: false

  # 当为 true 时:每个导入的用户将使用来自 phpBB 的原始用户名作为其名称
  # 当为 false 时:每个导入的用户的名称将为空,除非在导入过程中修改了用户名
  username_as_name: false

  # 将表情符号映射到 phpBB 中使用的表情符号。大多数默认表情符号已有映射,但如果您不喜欢某些映射,可以在此处覆盖。
  # 映射语法为:emoji_name: 'smiley_in_phpbb'
  # 或者将多个表情符号映射到一个表情符号:emoji_name: ['smiley1', 'smiley2']
  emojis:
    # 以下是两个示例映射...
    smiley: [':D', ':-D', ':grin:']
    heart: ':love:'
1 个赞

如果 import_phpbb3.sh 未在正确路径下找到 phpbb_mysql.sql 文件,就会发生此特定问题。

1 个赞

我推测这也适用于 phpBB,因为我正在尝试导入从 v3.2.x 到 v3.3.3 的备份数据,但缺失的父级帖子多达数千个。即使进行了多次运行并使用了多个连续版本的备份,问题依然存在。为了便于调试,脚本可以输出消息 ID 对应的旧论坛 URL 以供参考检查(… viewtopic.php?p=57912)。

1 个赞

既然到了这一步,不如将所有失败的导入行及其错误信息记录到一个转储文件中,以便共享分析……只是个人想法……

至少有一次情况是:存在一个主题链接 viewtopic.php?f=3&t=1472,但其首帖 viewtopic.php?p=145185 已被删除或移除,现在该主题的首帖变成了 viewtopic.php?p=145186,而这实际上是一条回复。

或许为了更清晰,应明确说明父主题是在转储文件中根本不存在,还是尚未被导入到重建过程中。

1 个赞

我仍希望能收到一些反馈,以确认大家最近是否都能成功完成带附件的完整导入。我无法使这项工作正常进行。

目前,我还不清楚问题出在脚本上,还是来自 phpBB 论坛的数据库::folded_hands:

1 个赞

你下载了图片并将其放在了正确的位置吗?

我最近没有这样做,但如果它不起作用,我会感到惊讶。

1 个赞

是的,我再次检查了文件夹和设置文件,奇怪的是,它们被导入到了默认/原始文件夹中,但并未集成到帖子中。

这是一个非常古老的 phpBB 版本,带有一些插件。我进行了一些清理,并成功从 phpBB 3.0.12 升级到最新的 3.1 或 3.2 版本,分别测试了每个版本的导入功能,但均未成功。这可能是数据库的问题。因此,如果您下次能够成功完成完整导入,希望能告知我们。如果是 phpBB 数据库的问题,我将在一些帮助下进行深入排查;如果是脚本的问题,我可以等待。感谢您的留言!

1 个赞

我不记得上次进行 phpBB3 导入是什么时候了,我怀疑(但无法确认)是因为脚本运行得非常顺利。

由于它们正在被上传到 Discourse,问题很可能出在 phpBB 帖子中如何引用它们。运行脚本时是否看到任何错误?这些错误可能会提供线索。或者,可能是插件更改了它们在帖子和/或数据库中的呈现方式。您可能需要进行一些深入排查。

2 个赞

我遇到了一些“文件缺失”和“帖子发布时间错误”的问题,这些在我之前的导入中也出现过,所以我认为这不是大问题。在首次运行时,我还遇到了大量“父帖子不存在”的提示,但之前在本帖中已有人提到过,再次运行脚本即可解决此问题。

除此之外,脚本运行得相当顺利,没有出现重大错误。

曾有一个插件(据我所知主要是.htaccess 文件,因为我并未运营该论坛)用于将文件按月份和年份整理到子文件夹中,但我将它们统一放在同一文件夹中,而在干净的 phpBB 版本上进行升级也顺利完成了。所有导入的文件在 phpBB 3.1 和 3.2 上都能正常运行。

我将进一步深入检查数据库,我可能有一个来自旧导入的 SQL 文件。我会在测试服务器上比较附件表和帖子表。也许我遗漏了某些细节。

4 个赞

您说得对,TextProcessor::process_attachments 中确实存在一个导致附件无法嵌入到帖子 Markdown 中的 bug。我已提交了一个 PR

5 个赞

做得很好,经过两次处理后,导入效果看起来很棒。谢谢!

4 个赞

你好,我刚导入了大约 35,000 篇帖子;在导入过程中,我注意到大量出现“父帖子 XXXXXX 不存在,已跳过”的提示。处理结束后,在 Discourse 论坛中,我拥有了所有(我认为)的“主题”,但没有任何回复。实际上,它只导入了主题本身,而没有导入帖子内容(除了第一个包含主题文本的帖子)。
此外,头像也未导入,尽管我已将它们放置在“import”文件夹下的正确目录树中。

原始论坛是 phpBB2,已定期导入并在 phpBB3 中正常显示,包含所有帖子;不过我之前删除了许多旧消息,但在 phpBB3 中一切似乎正常。

有什么建议吗?是否有我可以检查的导入脚本?

1 个赞

这种情况已经持续了几周/几个月,但请放心,重新运行 import_phpbb3.sh 命令后,导入将会完成。

3 个赞

非常感谢!这对帖子有效,但对头像无效。我继续寻找修复方法。

1 个赞

我多次阅读了该主题并进行了几次迁移,但每次都对这个插件感到困惑,并遇到了类似的错误。这是我的第三次迁移,它让我抓狂。我认为这个插件的工作方式可能会让进行迁移的用户感到困惑。

应该在某处明确指出,插件应该在迁移过程之后在 Discourse 上激活。如果信息已经写在某处,我可能错过了,也许应该强调这些信息。

如果我错了,请纠正我。 :slight_smile:

1 个赞

我正在报告一个针对从 phpBB 3.0.7 导入时的表情符号转换问题的修复程序。

  • 一些表情符号未正确转换为 Discourse:


    (但并非总是如此,原因不明;有时会显示一些相同的表情符号,有时则不会。起初看起来是随机的)

  • 此外,一些表情符号干脆消失了:
    phpBB
    image
    Discourse
    image

问题出在 replace_smilies(text) 中使用的正则表达式,位于

错误的正则表达式:

<!-- s(\S+) --><img src="{SMILIES_PATH}/.+?" alt=".*?" title=".*?" /><!-- s?:\S+ -->

请注意,正则表达式的开头没有假设 : 字符在后面:

<!-- s

但它确实假设在正则表达式的末尾有一个:

<!-- s?:

(另外我想知道为什么正则表达式的末尾有一个 ? 来匹配 s 字符 0 或 1 次,而正则表达式的开头没有)

我从正则表达式中删除了这个 :,我的两个表情符号问题似乎都完全解决了。

在我的 phpbb 论坛上,许多表情符号确实以 : 开头,例如 :mrgreen::evil:,但有些则不是,例如 8-);)
旧的正则表达式导致了错误的表情符号捕获。例如,多个表情符号并排会被捕获为一个。


修复后的正则表达式:

<!-- s(\S+) --><img src="{SMILIES_PATH}/.+?" alt=".*?" title=".*?" /><!-- s?\S+ -->

我没有直接在 Discourse 仓库中修复代码,因为我不习惯使用 git,而且我不确定这是否会影响从其他 phpBB 版本导入。我不想搞砸任何东西。


总之,如果有人遇到和我一样的问题,这就是解决方案。

4 个赞

另一个已修复的问题可能有助于我在迁移 phpBB 3.0.7 时遇到类似情况的人。

出于某种原因,我的 phpBB 论坛帖子内容有时会在行首出现多个空格。我怀疑有些用户在写消息时“喜欢”不加注意地疯狂按空格键,这无关紧要,因为渲染的页面会忽略这些多余的空格:

原始 phpBB 文本内容:

Salut tous  :)😊
  
     Alors voilà, le combi n'a pas roulé beaucoup ces derniers temps cause CT pas OK  😈
mais il a fait ces 2000 kms sans broncher 😉
Maintenant le CT est OK . Merci L'Atelier Du Raz 8-')

    Je dois donc changer le joint-spi au bout de 40 000 kms en 10 ans 🙄
C'est un silicone et j'ai vu qu'il y avait des "doubles lèvres " !?
What's About ?

             Je trouve ça un peu limte 😈
Merci tous, fred

浏览器中渲染的页面:


但在导入 phpBB → Discourse 时,这些现有的空格被转换成了代码块:

应该显示如下:


我通过添加一个正则表达式来修复它,该正则表达式会删除每行开头的空格

 text.gsub!(/^[^\\S\\r\\n]+/, "\n")

我将其添加在此文件 process_smilies(text) 之前:discourse/script/import_scripts/phpbb3/support/text_processor.rb at 973c9bdcd3b61abc13a2353240e6389ab691c248 · discourse/discourse · GitHub


我遇到的另一个问题。
在此代码中(仍在 text_processor.rb):

    def clean_bbcodes(text)
      # Many phpbb bbcode tags have a hash attached to them. Examples:
      #   [url=https://google.com:1qh1i7ky]click here[/url:1qh1i7ky]
      #   [quote="cybereality":b0wtlzex]Some text.[/quote:b0wtlzex]
      text.gsub!(/:(?:\\w{8})\\]/, ']')

在我的数据库中,这些哈希值的长度在 5 到 8 个字符之间,但正则表达式只删除长度正好为 8 个字符的哈希值。因此,我的导入保留了较短的哈希值而不是删除它们。
我通过将正则表达式更改为以下内容来修复此问题:

text.gsub!(/:(?:\\w{5,8})\\]/, ']')

我还有一个小问题,仍然在同一个文件中。删除 [color] BBCode 标签的正则表达式期望一个以 # 为前缀的十六进制值。但是 [color] 也接受字符串,如“red”、“blue”等作为值。所以我修改了原始的正则表达式:

      # remove color tags
      text.gsub!(/\\[\\/?color(=#[a-z0-9]*)?\\]/i, "")

通过在 # 之后添加一个 ? 使 # 可选。
修复后的代码:

      # remove color tags
      text.gsub!(/\\[\\/?color(=#?[a-z0-9]*)?\\]/i, "")

我不知道我的问题在 phpBB 导入中是否常见,或者它们是否非常特定于我的情况。如果是后者,我希望我在这里的解释不会不受欢迎或多余。如果确实如此,请告诉我,以免尴尬。: grinning_face_with_smiling_eyes:


编辑:迁移后,是否可以将所有现有主题设置为对每个现有用户“已读”?

目的是防止迁移后,现有用户点击现有(有时是旧的)主题时,会跳转到他们迁移前已阅读过的这些主题的第一条消息。

理想情况下,现有用户点击现有主题时,打开的不是第一条消息,而是最后一条消息(当然是自迁移结束以来)。

不过,这是一个小小的生活质量问题(并且随着用户使用论坛和阅读主题,它会在几周内自然消失),但有人向我提出了这个建议。

7 个赞

感谢您分享这些修复!

我过去在迁移中也对正则表达式进行了类似的调整,因此这些将有助于将来的 phpbb 导入。

此主题可能有所帮助:How to mark imported posts as read - #2 by stuwest

3 个赞