太好了!很高兴你解决了。诀窍是什么?
我不得不反复运行 import_phpbb3.sh 直到所有类别都导入完毕。脚本运行了一夜,但网络中断导致了我这边出现了一些错误。我重新启动了脚本,我认为它现在正在运行。如果还有更多问题,我将不得不进入 MySQL 表进行清理。
大家好!论坛基本已上线并运行……看起来很棒。我正在编写一个脚本来修改 [/quote] 标签。该论坛相当古老,可追溯到 2001 年,只需在结束标签的上方和下方添加一个空格即可解决很多问题。我确定可以在导入脚本中更新一个设置,但这是我第一次迁移,所以边做边学。
问题: 我正在修复 10 年的数据,并且有一个正在运行的实时 phpBB 论坛。这需要一些时间。我可以使用 import_phpbb3.sh 脚本从我的论坛导入最后 X 天的帖子吗?我认为脚本只是一个合并。我可以从 MySQL 导出最后 7 天的数据……但我不知道这是否可行。有什么想法?
我还没有验证脚本是否有效……我在小部分上进行了测试,但没有批量测试。我遇到的问题是结束标签的上方和下方有一个空格。现在我要去割草,晚点回来查看:
batch_size = 1000
total_processed = 0
# 以批次处理整个站点的帖子
Post.find_in_batches(batch_size: batch_size) do |batch|
updated_posts = []
batch.each do |post|
original_raw = post.raw
# 应用更正
new_raw = original_raw.gsub(/\n\\n\[\/quote\]\\n\\n\\n/, "\n\n[/quote]\n\n")
if original_raw != new_raw
post.update_column(:raw, new_raw) # 直接更新列以跳过回调
updated_posts << post
total_processed += 1
end
end
# 仅重新烘焙已更新的帖子以最小化负载
updated_posts.each(&:rebake!)
puts "已处理一批 #{batch.size} 条帖子。到目前为止总共处理了:#{total_processed} 条。"
end
puts "整个站点共处理了 #{total_processed} 条帖子。"
这在单个帖子中有效:
post = Post.find(344572) # 将 344572 替换为正确的 ID
post.raw = post.raw.gsub(/\n\\n\[\/quote\]\\n\n\n/, “\n\n[/quote]\n\n”)
我会在导入数据时修改脚本来执行此操作。我很惊讶它还没有这样做。值得仔细看看。
在我处理过的几个脚本中,我添加了一个 IMPORT_AFTER 环境变量,并修改了查询以包含 where some_timestamp > import_after_data。我认为这个脚本没有这样的选项,但我没有仔细注意。
但请注意,10 年前的数据很可能与最近 2 年的数据不同,因此仅测试最近的数据对于调试无处不在的问题非常有用,您也需要对整个数据库进行测试。
混合了各种各样的东西。导入已完成约 99%……我只需要回去再导入上周的帖子
一旦添加了换行符并修复了此 <LINK_TEXT text= 问题,一切都会好起来的 ![]()
我做了什么来清理我导入后的大量帖子。我让 AI 为从 PhpBB 过来的人提供解释。我一直忙到凌晨 5 点,试图让他的工作正常运转 ![]()
![]()
![]()
要在 Discourse 环境中运行 Ruby 脚本,该脚本会分批处理(每批 1000 个)论坛主题,并对这些主题中的每个帖子应用特定的转换,您将遵循一系列步骤来访问服务器、进入适当的环境并执行脚本。以下是包含脚本本身的详细指南:
步骤 1:安全连接到您的服务器
使用 PuTTY 等安全外壳 (SSH) 客户端(适用于 Windows),连接到托管 Discourse 论坛的服务器。您需要服务器的 IP 地址或域名,以及您的凭据(用户名和密码或 SSH 密钥)。
步骤 2:访问 Discourse Docker 容器
登录服务器后,导航到 Discourse 安装目录,通常是 /var/discourse。然后,使用以下命令进入运行 Discourse 的 Docker 容器:
bash
cd /var/discourse
./launcher enter app
步骤 3:打开 Rails 控制台
在 Docker 容器内,您可以通过 Rails 控制台与 Discourse 应用程序进行交互。这是一个 Ruby on Rails 环境,允许您直接针对 Discourse 数据库和应用程序逻辑运行 Ruby 代码。使用以下命令启动控制台:
bash
rails c
步骤 4:执行 Ruby 脚本
打开 Rails 控制台后,您就可以运行 Ruby 脚本了。脚本应提前准备好并复制到剪贴板。在 PuTTY 中,您可以通过右键单击或按 Shift + Insert 来粘贴脚本。
这是您将使用的完整脚本:
code
# 检索所有主题 ID 的数组
topic_ids = Topic.pluck(:id)
# 定义批次大小
batch_size = 1000
current_batch_start = 0
while current_batch_start < topic_ids.length
# 一次处理 1000 个主题的批次
topic_ids[current_batch_start, batch_size].each do |topic_id|
# 按 ID 获取主题
topic = Topic.find(topic_id)
# 如果主题为 nil,则跳过
next if topic.nil?
# 初始化此主题的转换后帖子计数
transformed_count = 0
# 遍历主题中的每个帖子
topic.posts.each do |post|
# 标志,用于跟踪是否已进行转换
transformed = false
# 应用转换
transformed |= post.raw.gsub!(/\<\\/?r\>/, '').present?
transformed |= post.raw.gsub!(/\<\\/?s\>/, '').present?
transformed |= post.raw.gsub!(/\<\\/?e\>/, '').present?
transformed |= post.raw.gsub!(/\<\\/?QUOTE[^\>]*\>/, '').present?
transformed |= post.raw.gsub!(/\[quote=““([^”]+)””\]/, '[quote=\"\\1\"]').present?
transformed |= post.raw.gsub!(/\\\\n/, "\\n").present?
transformed |= post.raw.gsub!(/\[quote=([^\\s]+)\\s+post_id=\\d+\\s+time=\\d+\\s+user_id=\\d+\]/, '[quote=\"\\1\"]').present?
transformed |= post.raw.gsub!(/\<URL url=\"([^\"]+)\"\>[^\<]*\<LINK_TEXT text=\"[^\"]+\"\>[^\<]*\<\\/LINK_TEXT\>[^\<]*\<\\/URL\>/, '\\1').present?
transformed |= post.raw.gsub!(/\[\\\/quote\]/, "\\n[/quote]\\n").present?
transformed |= post.raw.gsub!(/\\A\\n/, '').present?
# 如果进行了任何转换,则保存并重新烘焙帖子
if transformed
post.save!
post.rebake!
transformed_count += 1
end
end
# 输出当前主题的结果
if transformed_count > 0
puts "Transformed #{transformed_count} posts in topic #{topic_id}."
else
puts "No transformations were necessary for topic #{topic_id}."
end
end
# 更新下一批的起始索引
current_batch_start += batch_size
# 检查是否还有更多主题需要处理
if current_batch_start < topic_ids.length
puts "Completed a batch of #{batch_size} topics. Do you want to continue to the next batch? (yes/no)"
response = gets.strip.downcase
break unless response == 'yes'
end
end
理解脚本和批处理
- 批处理: 这种方法允许您将大量数据分成较小的、可管理的块。这对于减少服务器负载以及对于一次性完成可能需要很长时间的操作特别有用。在这里,它被应用于分批处理 Discourse 主题(每批 1000 个)。
这是它运行时应该的样子。
No transformations were necessary for topic 19556.
No transformations were necessary for topic 35766.
No transformations were necessary for topic 35783.
No transformations were necessary for topic 35778.
No transformations were necessary for topic 35774.
No transformations were necessary for topic 35770.
Transformed 292 posts in topic 20234.
No transformations were necessary for topic 35781.
No transformations were necessary for topic 35779.
Transformed 242 posts in topic 20218.
Transformed 22 posts in topic 19522.
No transformations were necessary for topic 35771.
No transformations were necessary for topic 35767.
Transformed 2 posts in topic 22560.
No transformations were necessary for topic 35797.
No transformations were necessary for topic 35789.
No transformations were necessary for topic 35785.
No transformations were necessary for topic 31889.
Transformed 1 posts in topic 31831.
No transformations were necessary for topic 31792.
No transformations were necessary for topic 35794.
No transformations were necessary for topic 35815.
- 脚本功能: 该脚本会遍历从 Discourse 数据库检索到的每个主题 ID,并对这些主题中的每个帖子应用指定的转换。
我在尝试更改用户的显示名称(非用户名)以包含特殊字符时收到此错误(迁移后,在正常运行的标准安装上)。我尝试时会收到一个“内部服务器错误”弹出窗口,日志显示与 @DDo 相同的错误。
值得注意的是,其他用户能够更改其显示名称以包含相同的字符(™)。相关的区别似乎是,迁移后登录过的用户可以使用 UTF-8 字符,而尚未登录过的用户只能使用 ASCII-8BIT。
我也假设删除 discourse-migratepassword 可以解决此错误,但尚未进行测试。
这是错误,还是使该插件正常工作的固有问题?如果是前者,最好在 Github 上创建一个问题来报告它吗?
我正在尝试(重新)构建一个导入容器,但它失败了:
FAILED
--------------------
Errno::ENOENT: No such file or directory @ rb_sysopen - /etc/service/unicorn/run
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/replace_command.rb:11:in `read'
replace failed with the params {"tag"=>"precompile", "filename"=>"/etc/service/unicorn/run", "from"=>"PRECOMPILE_ON_BOOT=1", "to"=>"PRECOMPILE_ON_BOOT=0"}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
我已经禁用了所有插件,但没有变化。
有人有什么想法吗?
所以这是第一个想法。
我没有找到任何显示/指向错误的线索……我会再找找……
hooks:
after_web_config:
- exec:
cd: /etc/service
cmd:
# - rm -R unicorn
- rm -R nginx
- rm -R cron
我在 templates/import/phpbb3.template.yml 中注释掉了 - rm -R unicorn 这一行,构建就成功了,没有报错。
这是怎么回事?phpbb3.template.yml 是两年前从 Github 上的版本。所以一定是在别的地方有改动了?!
他们可能是在从 Ubuntu 切换到 Debian 之前就有的。这些东西很可能要等到有人注意到它们不再工作时才会被更新。
我不认为 rm 是个问题,但如果没人付钱给我,我不会太在意这些。即使有人付钱,我也不记得我曾太在意过那个。 ![]()
我想,如果构建者抱怨缺少 /etc/service/unicorn/run,并且正好移除了它,我尝试注释掉这个移除命令。
奏效了。
也许有更了解一切的人想验证一下并在 GitHub 上更新脚本。我也可以做一个 PR——但由于我对一切都一无所知,我不想这样做。
但是从 Ubuntu 切换到 Debian 会改变很多东西,确实如此。
首先,我是一个 Docker 新手,很有可能是我搞砸了什么。
我在运行 Ubuntu 22.04 的 DigitalOcean Droplet 上有一个全新的 Discourse 安装,使用的是他们预构建的应用。论坛构建得很好,并且在标准配置下运行。
当我执行 /var/discourse/launcher rebuild import 时,我在构建结束时得到以下信息:
Errno::ENOENT: No such file or directory @ rb_sysopen - /etc/service/unicorn/run
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/replace_command.rb:11:in `read'
replace failed with the params {"tag"=>"precompile", "filename"=>"/etc/service/unicorn/run", "from"=>"PRECOMPILE_ON_BOOT=1", "to"=>"PRECOMPILE_ON_BOOT=0"}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
当我执行:/var/discourse/launcher enter import
我得到:
86_64 arch detected.
Error response from daemon: No such container: import
这是因为帖子顶部的错误(如果是,我该如何修复),还是我做错了什么?
你是否创建了 import.yml 并像说明中(我非常确定)说的那样引导了该容器?
说明显示将 app.yml 复制到 import.yml 并将“templates/import/phpbb3.template.yml”添加到 import.yml(我已经做了)。然后,您重建 import,这会产生我 OP 中的错误。我没看到有任何关于创建 bootstrap(?) 的说明。
说明很简单,这就是为什么我对哪里出错了感到困惑。
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81a2f335fd01 local_discourse/app “/sbin/boot” 14小时前 已启动 11小时 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp app
抱歉。Rebuild 会执行引导。如果完成,则导入容器正在运行。
哦。非常抱歉。我之前没注意到发生了什么。看起来 phpbb3 模板可能与 discourse_docker 的近期更改不兼容。但这是我能在手机上告诉你的全部内容。
我认为如果你删除 phpbb3 模板中删除 “/etc/service/unicorn/run” 的那一行,可能会使构建完成。
Jay,感谢您对这个问题的答复。构建现在可以正确完成了。
下一个问题:当我执行:import_phpbb3.sh 时,我收到:
phpBB3 导入正在开始...
/usr/local/lib/ruby/3.3.0/psych/parser.rb:62:in `_native_parse': (<未知>):在解析块映射时未找到预期的键,位于第 3 行第 1 列 (Psych::SyntaxError)
from /usr/local/lib/ruby/3.3.0/psych/parser.rb:62:in `parse'
from /usr/local/lib/ruby/3.3.0/psych.rb:455:in `parse_stream'
from /usr/local/lib/ruby/3.3.0/psych.rb:399:in `parse'
from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.4/lib/bootsnap/compile_cache/yaml.rb:129:in `strict_load'
from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.4/lib/bootsnap/compile_cache/yaml.rb:186:in `input_to_storage'
from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.4/lib/bootsnap/compile_cache/yaml.rb:232:in `fetch'
from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.4/lib/bootsnap/compile_cache/yaml.rb:232:in `load_file'
from /var/www/discourse/script/import_scripts/phpbb3/support/settings.rb:10:in `load'
from script/import_scripts/phpbb3.rb:20:in `<module:PhpBB3>'
from script/import_scripts/phpbb3.rb:16:in `<module:ImportScripts>'
from script/import_scripts/phpbb3.rb:15:in `<main>'
我猜它不喜欢我的 settings.yml 文件中的某些内容。我该如何告诉它它卡在哪里了?
database:
type: MySQL # 目前只支持 MySQL
host: localhost
port: 3306
username:
password:
schema: phpbb
table_prefix: phpbb_ # 如果您的论坛使用不同的前缀,请更改此项。通常所有表名都以 phpbb_ 开头
batch_size: 1000 # 除非您知道自己在做什么,否则不要更改此项。默认值 (1000) 应该效果很好。
import:
# 如果您将多个 phpBB 论坛导入到一个 Discourse 论坛中,请设置此项。
#
# 例如,在导入多个站点时,为所有导入的 ID 添加前缀
# 'first' 以避免冲突。后续的导入运行必须具有
# 不同的 'site_name'。
#
# site_name: first
#
site_name: Freedom Owners Forum
# 创建新分类
#
# 例如,创建一个父分类和一个子分类。
#
# new_categories:
# - forum_id: foo
# name: Foo Category
# - forum_id: bar
# name: Bar Category
# parent_id: foo
#
new_categories:
- forum_id: general
name: General
- forum_id: systems
name: Boat Systems
- forum_id: photos
name: Photos
- forum_id: docs
name: Manuals and Documentation
- forum_id: buy
name: Buy/Sell/Trade
- forum_id: site
name: Site Usage
- forum_id: archives
name: Archives
# 分类映射
#
# * "source_category_id" 是 phpBB3 中的论坛 ID
# * "target_category_id" 是 phpBB3 中的论坛 ID 或 "new_categories" 设置中的 "forum_id"
# (见上文)
# * "discourse_category_id" 是 Discourse 中的分类 ID
# * "skip" 允许您在导入期间忽略某个分类
#
# 如果您想合并分类,请使用 "target_category_id",如果您想将论坛导入到 Discourse 中现有的
# 分类中,请使用 "discourse_category_id"。
#
# category_mappings:
# - source_category_id: 1
# target_category_id: foo
# - source_category_id: 2
# discourse_category_id: 42
# - source_category_id: 6
# skip: true
#
category_mappings:
- source_category_id: 8
target_category_id: systems
- source_category_id: 7
target_category_id: systems
- source_category_id: 9
target_category_id: systems
- source_category_id: 10
target_category_id: buy
- source_category_id: 11
target_category_id: general
- source_category_id: 12
target_category_id: general
- source_category_id: 13
target_category_id: general
- source_category_id: 14
target_category_id: general
- source_category_id: 16
target_category_id: docs
- source_category_id: 17
target_category_id: docs
- source_category_id: 18
target_category_id: general
- source_category_id: 19
target_category_id: general
- source_category_id: 20
target_category_id: general
- source_category_id: 21
target_category_id: docs
- source_category_id: 22
target_category_id: general
- source_category_id: 23
target_category_id: site
- source_category_id: 24
target_category_id: general
- source_category_id: 25
target_category_id: site
- source_category_id: 42
target_category_id: systems
- source_category_id: 43
target_category_id: docs
- source_category_id: 44
target_category_id: general
- source_category_id: 45
target_category_id: general
- source_category_id: 46
target_category_id: site
- source_category_id: 48
target_category_id: general
- source_category_id: 56
target_category_id: general
- source_category_id: 58
target_category_id: systems
- source_category_id: 59
skip: true
- source_category_id: 60
target_category_id: archives
- source_category_id: 61
target_category_id: archives
- source_category_id: 62
target_category_id: archives
- source_category_id: 63
target_category_id: archives
- source_category_id: 64
target_category_id: general
- source_category_id: 65
target_category_id: site
# 标签映射
#
# 例如,从 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: freedomyachts.org # 不带 http(s)://
new: https://test.freedomyachts.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-na
me/81
# 如果您的论坛未安装在子文件夹中,请将其留空。
prefix:
avatars:
uploaded: true # 导入上传的头像
gallery: true # 导入 phpBB 提供的预定义头像
remote: false # 警告:这会显著减慢您的导入速度。它将尝试下载远程头像。
# 当为 true 时:匿名用户将被导入为已暂停用户。他们无法登录,也没有电子邮件地址。
# 当为 false 时:系统用户将用于所有匿名用户。
anonymous_users: true
# 如果您想导入密码哈希以便使用“migratepassword”插件,请启用此项。
# 这将允许用户使用其当前密码登录。
# 插件可在以下网址找到:https://github.com/discoursehosting/discourse-migratepassword
passwords: true
# 默认情况下,所有以下内容都会被导入。您可以将其设置为 false 来禁用它们。
bookmarks: true
attachments: true
private_messages: true
polls: true
# 从 phpBB 的“感谢帖子”扩展导入点赞
likes: 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:'
# 将 phpBB 的自定义配置文件字段映射到 Discourse 中的自定义用户字段(适用于 phpBB 3.1+)
#
# custom_fields:
# - phpbb_field_name: "company_name"
# discourse_field_name: "Company"
# - phpbb_field_name: "facebook"
# discourse_field_name: "Facebook"
custom_fields: []
我猜它不喜欢我的 settings.yml 文件中的某些内容。我该如何找出它卡在哪里了?
您缺少用户名和密码。