这篇文章分享如何在 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 生效。


✅ 最终验证

  1. 浏览器中强制刷新页面 Ctrl + F5
  2. 检查客户端是否能加载历史图片
  3. 在管理界面查看系统 URL 设置是否已更新为新域名

🧠 附:排查遗留的旧域名记录(可选)

如果你想进一步清除 rocketchat_settings 或其他集合中的旧链接:

jsCopyEditdb.rocketchat_settings.find({
  value: { $regex: "旧域名" }
}).forEach(doc => print(doc._id, doc.value))

📦 小结

更换 Rocket.Chat 的域名并不只是修改反向代理或 DNS,还涉及:

  • ✅ MongoDB 中 uploads 数据更新
  • Site_Url 配置更新
  • ✅ 容器重启和缓存清除
  • ✅ 客户端测试验证

Leave a Reply

Your email address will not be published. Required fields are marked *