这篇文章分享如何在 Docker 部署环境下,将 Rocket.Chat 的旧域名彻底替换为新域名,包括数据库更新、服务重启和客户端验证等全流程,适用于自己搭建的私有聊天系统。
🧱 部署架构概览
- 部署方式:Docker Compose
- 服务组件:
rocketchat:Rocket.Chat 主程序mongodb:使用 MongoDB 7.0.x,容器化部署
- 目标:将 Rocket.Chat 中原来的旧域名(多个)替换为新的统一域名
https://example.com:3000
🛡 本文中所有域名、容器名均为示例,实际请根据你的环境替换。
🔍 步骤一:查找并确认含旧域名的数据
进入 MongoDB 容器:
bashCopyEditdocker exec -it your-mongo-container-name mongosh
切换到 Rocket.Chat 数据库:
jsCopyEdituse rocketchat
检查上传记录中是否包含旧域名:
jsCopyEditdb.rocketchat_uploads.countDocuments({
url: { $regex: "localhost|旧域名1|旧域名2|..." }
})
🔄 步骤二:批量替换上传记录中的域名前缀
使用 MongoDB 7 的 $function 方式进行安全、批量替换:
jsCopyEditdb.rocketchat_uploads.updateMany(
{
url: {
$regex: "localhost|旧域名1|旧域名2|..."
}
},
[
{
$set: {
url: {
$function: {
body: function(url) {
return url.replace(
/^(http:\/\/localhost(:3000)?|https:\/\/(www\.)?旧域名1(:3000)?|https:\/\/(www\.)?旧域名2(:3000)?|...)/,
"https://example.com:3000"
);
},
args: ["$url"],
lang: "js"
}
}
}
}
]
)
验证替换是否成功:
jsCopyEditdb.rocketchat_uploads.countDocuments({
url: { $regex: "localhost|旧域名" }
})
应返回 0 或少数文件名包含旧域名的情况(可忽略)。
⚙️ 步骤三:修改 Rocket.Chat 设置中的 Site_Url
Rocket.Chat 启动后仍然显示旧的 Site URL,这是因为配置保存在数据库中:
查找当前设置:
jsCopyEditdb.rocketchat_settings.findOne({ _id: "Site_Url" })
执行更新:
jsCopyEditdb.rocketchat_settings.updateOne(
{ _id: "Site_Url" },
{ $set: { value: "https://example.com:3000" } }
)
🔁 步骤四:重启 Rocket.Chat 服务
bashCopyEditdocker restart your-rocketchat-container-name
✳️ 重启后,Rocket.Chat 会重新读取数据库配置,并清除缓存,确保 URL 生效。
✅ 最终验证
- 浏览器中强制刷新页面
Ctrl + F5 - 检查客户端是否能加载历史图片
- 在管理界面查看系统 URL 设置是否已更新为新域名
🧠 附:排查遗留的旧域名记录(可选)
如果你想进一步清除 rocketchat_settings 或其他集合中的旧链接:
jsCopyEditdb.rocketchat_settings.find({
value: { $regex: "旧域名" }
}).forEach(doc => print(doc._id, doc.value))
📦 小结
更换 Rocket.Chat 的域名并不只是修改反向代理或 DNS,还涉及:
- ✅ MongoDB 中
uploads数据更新 - ✅
Site_Url配置更新 - ✅ 容器重启和缓存清除
- ✅ 客户端测试验证