大型Drupal 7论坛的迁移前评估

大家好,我拥有并管理着一个我认为是互联网上最大的 Drupal 论坛之一,帖子数量接近 200 万。Drupal 7 正在走向衰落,而 Drupal 8/9 正逐渐变成一个供网络程序员使用的框架,而不是一个开箱即用的内容管理系统。新的 Drupal 版本根本无法提供我论坛继续运行所需的基本功能的第三方模块,而且由于 PHP 和 Drupal 的许多其他怪癖,升级将和迁移到完全不同的平台一样痛苦。所以,我将不得不硬着头皮迁移到其他平台。我几乎可以肯定,由于我的论坛社区风格的一个独特方面,我将不得不选择 Discourse:我是唯一的版主,而且这不是我的全职工作。因此,多年来,我一直使用灵活的 Rules 和 Flag 框架在 Drupal 中创建了一个零散的社区审核系统,用于处理垃圾邮件和冒犯性帖子,根据用户的新旧程度、被标记的数量,以及标记者的用户新旧程度和近期标记活动,在达到特定阈值时自动删除帖子和/或关闭用户帐户。换句话说,这几乎与 Discourse 的实现方式完全相同。我很高兴看到 Discourse 认识到社区审核的价值,并开箱即用地实现了如此全面且深思熟虑的系统。Drupal 7 是,并且仍然是唯一一个足够灵活的 CMS,可以在不成为经验丰富的开发人员(我不是)的情况下实现这种自定义功能。所以,看起来我将迁移到 Discourse。但是,我确实有一些担忧。

  1. **社区审核系统:**我们的论坛目前正在评估 Discourse 的一个试用版安装。我对整个系统的全面性和深思熟虑感到印象深刻。但社区注意到了一些怪癖:
    • 我非常不喜欢它将自动删除的帖子隐藏在“查看已忽略的内容”后面。如果一个帖子足够糟糕而被社区删除,那么它要么是高度冒犯性的,要么是纯粹的垃圾邮件,我不想让访问者或用户甚至有机会查看它。这在垃圾邮件或带有冒犯性标题的主题的情况下尤其成问题。搜索引擎爬虫会不会看到隐藏的垃圾邮件内容?是否有可能配置在自动隐藏的垃圾邮件帖子在公众视野中被完全删除之前,用户干预的时间量?对于被社区标记为不当的主题和帖子又如何呢?
    • 我在这里 (https://meta.discourse.org/t/flag-a-post-for-moderator-attention/32783) 阅读到,“注意:以上所有值均为默认设置。管理员可以在站点设置中更改它们”,关于导致帖子删除和/或用户禁言的阈值,但在我的 Discourse 测试实例中找不到这些精细的设置。我只找到“隐藏帖子敏感度”和“禁言新用户敏感度”,但我无法理解这些敏感度在具体 terms 中指的是什么。
    • 我想删除“离题”这个标记帖子的原因。我们的论坛社区在这方面非常随和,并且有一种论坛文化,即离题帖子非常普遍且被广泛接受。更新: 看起来这个可能会起作用。
  2. **私信迁移:**目前的论坛有近一百万条私信线程,使用了 Drupal 7 的 privatemsg 模块,而 Drupal → Discourse 迁移脚本无法处理它。这似乎是一个重大的疏漏,因为尽管它是一个第三方模块(典型的 Drupal 风格),但它基本上是 Drupal 7 管理员使用的事实上的私信功能。
  3. **帖子格式转换:**不幸的是,目前的论坛混合使用了纯 HTML 和 Textile 格式的帖子。我理解迁移脚本可以处理纯 HTML(如果我错了请纠正我),但不能处理 Textile。如果可能,我想将 Textile 帖子转换为 HTML 或 Markdown,哪个更容易。有人告诉我 Pandoc 可以集成到迁移脚本中,但这也会大大增加迁移时间。我寻找过 Drupal 模块来转换现有帖子的格式,但只找到了这个,它不支持批量处理大量帖子,也不支持 Drupal 的“评论”范式,而这构成了需要转换的“帖子”的绝大多数。所以我考虑过在数据库转储文件上使用 sed 进行某种离线查找/替换,类似于这里的描述。欢迎提出建议或解决方案。我是一名经验丰富的 Linux 用户,并且断断续续地使用过正则表达式,但我仍然不擅长。编辑: 这个是将原始数据找到/替换后导入 Discourse 的一个有趣选项。
  4. **广告:**我很高兴看到 Discourse 的广告插件在我上次查看它之后似乎已经成熟了很多。我理解内部广告允许我在特定位置放置带有目标链接的图片横幅,并且如果多个广告分配到同一位置,它们将随机选择,对吗?但是,我不知道如何处理移动端。在我目前的论坛上,我有一个顶部横幅和左侧边栏中的三个垂直横幅,这些在 Discourse 的响应式界面中对于移动用户来说都不太可行。编辑: 可能需要修改广告插件以满足我的需求,这里有付费选项。
  5. **永久链接:**Drupal 的 URL 方案有两个主要组成部分:/node/XXXXXXX,以及指向这些节点内特定评论的链接 /comment/YYYYYYY#comment-YYYYYYYYYYYYYY 在两者中都相同)。Drupal 7 → Discourse 迁移脚本会自动维护这些链接,以便帖子中指向其他线程或帖子的链接仍然有效并保持 SEO 吗?搜索引擎的 sitemap.xml 文件呢?
  6. **批量处理:**迁移期间会分批运行吗?如果遇到错误会怎样,修复后会继续进行还是需要从头开始?
  7. **旧 Apple 设备用户:**我当然明白使用过时浏览器的危险。对于 Windows 和旧的 Android 设备,几乎总有一种方法可以安装与 Discourse 兼容的现代浏览器。但我担心我的一位用户声称拥有一台 2015 年的 Mac,它不接收任何更新,并且除了旧版 Safari 之外无法安装任何东西,而旧版 Safari 向他显示 Discourse 的弃用通知。我对 Apple 设备除了它们更封闭之外,了解得很少。在它们上安装其他现代浏览器真的那么难吗?
  8. **图片/上传存储:**我的用户和我喜欢 Discourse 中上传图片的便捷性,但我有点担心存储空间和成本。长远来看,最好的选择可能是根据需要将网络存储卷挂载到 VPS。如果我最初使用默认的上传位置设置 Discourse,以后将其移动到不同的卷是否会引起问题?
  9. 备份:
    • 我希望有一个增量备份系统,或者最好是重复数据删除备份。我目前为我的 Drupal 论坛使用带有 Amazon S3 的 Duplicity,成本低得令人难以置信,并且有很长的修订历史。有人能立刻告诉我 S3 存档创建后多久规则可以将其转换为 Glacier 吗?
    • Discourse 的备份界面允许删除 Amazon S3 中的存档吗?我知道这有点极端,但我希望禁用该功能,因为我设置的 S3 存储桶只有 PUT、GET 和 LIST 权限,以防止受损系统上的黑客删除我的远程备份。然后,S3 生命周期规则会在一段时间后生效,并在服务器端删除较旧的存档。
  10. **Stop Forum Spam 插件:**我不想使用 Akismet,但我一直从 StopForumSpam.com 获得良好的效果,以防止大量垃圾邮件注册。有人知道 Discourse 的插件是否有可配置的阈值,用于确定用户名、IP 或电子邮件地址在数据库中需要有多少次命中才能被拒绝? 编辑: 没有。在此处请求了这里。而且不幸的是,它不像在 Drupal 中那样,即使命中次数足够多,也不会实际阻止帐户创建。

抱歉发了这么长的帖子。提前感谢大家的见解,也衷心感谢整个 Discourse 项目提供的这款优秀产品。

我刚发现了这个:

应用一系列基于正则表达式的转换,例如将 BBCode 标签替换为 Markdown

它最后一次更新是在 2016 年,不确定它是否仍然是一个相关的选项。


这仍然相关吗?在 Drupal 导入器脚本中,我看到类似的代码:

create_posts(results, total: total_count, offset: offset) do |row|
        topic_mapping = topic_lookup_from_imported_post_id("nid:#{row['nid']}")
      end
 def create_permalinks
    puts '', 'creating permalinks...'

    Topic.listable_topics.find_each do |topic|
      begin
        tcf = topic.custom_fields
        if tcf && tcf['import_id']
          node_id = tcf['import_id'][/nid:(\d+)/, 1]
          slug = "/topic/#{node_id}"
          Permalink.create(url: slug, topic_id: topic.id)
        end
1 个赞

该脚本通常一次提取 1000 条帖子。

它会跟踪已处理的内容,因此后续运行可以跳过已运行过的数据。在我接触过的脚本中,我还包含了一个 import_after 设置,通过仅加载最近的数据来进一步加快后续运行的速度(这对于仅使用一小部分数据进行测试也很有用)。

我需要更仔细地查看帖子是否包含在永久链接中。它们通常不包含,但可以做到。

您需要将所有上传内容放在 S3 上,因此您的备份将仅包含数据库转储。您无法对此进行任何优化。您可以让 discourse 保留一定数量的备份,或者告诉它不要保留(或者只是将备份数量设置为一个很大的数字),然后让您的规则来处理它。

1 个赞

哦,这确实是个很好的观点。现在仔细想想,无论上传是直接(且仅)到S3,还是包含在Discourse备份的多个tarball中,我都要为S3上的上传存储付费。

另外,对于Discourse备份,是否可以使用没有删除权限的存储桶?

但如果它们在 S3 上,你就只有一个副本。

我怀疑如果 discourse 没有删除权限,它会起作用,但我不知道。

是的,而且 S3 具有极高的数据冗余度,这通常被认为是存储上传文件的负责任方式吗?我最近没有仔细研究过 S3 的选项,但我认为它们也有生命周期规则,可以在一段时间内恢复已删除的文件?我想象的是,如果上传文件因 Discourse 的错误调用而被删除,无论是(不太可能且大规模的)编码错误还是用户错误。或者黑客事件,回到我最初对存储桶删除权限的担忧。

是的,您可以启用版本控制,这样在标记为删除时文件就不会被删除。如果您不关心您支付的空间大小,您可以这样做。当 Discourse 因文件不再使用而删除文件时,它会先将其移至墓碑文件夹一段时间,然后再将其删除。我建议您信任 Discourse 来管理文件。我不知道禁止删除访问是否会破坏任何东西。

如果您愿意,可以将备份放在具有不同权限(但凭据相同)的单独存储桶上。

1 个赞

请问 @pfaffman 或任何将上传内容放在 S3 上的人——我知道这取决于无数因素,但你们是否至少有关于中大型论坛在 S3 上进行上传的带宽和 S3 请求费用的经验性信息?非常感谢!

1 个赞

这里有一个小更新:所以我想我会把我的上传保存在本地;我现在应该有足够的本地存储,如果需要,可以通过额外的存储卷来扩展它。我只是不想处理 CDN 的复杂性和成本,以及对象存储不可预测的费用,最重要的是用于实时网站图像服务的传输成本。然后,我将进行自动 S3 备份到 Backblaze B2,包括上传和 s3 disable cleanup 选项。Backblaze 的定价非常便宜,即使有冗余上传,保留几周的每日备份应该也不是问题。事实证明,Backblaze B2 的存储桶有两个非常简单的选项,正是我需要的:1) 自动生命周期规则,在 X 天后删除文件,以及 2) 防止文件被删除或修改 N 天(以防止服务器被黑客入侵,黑客使用存储的凭据删除我的远程备份的可能性很小)。我测试了一下,似乎效果很好;我试图从 Discourse GUI 删除一个被 Backblaze 禁止删除的备份存档,但它什么也没做。

只是为了让我和他人澄清:如果启用了 backup with uploads 选项(默认),是否可以自动将本地存储上的上传内容备份到 S3?

1 个赞

是的。默认情况下,本地上传文件将包含在备份文件中。

1 个赞