在Unraid上部署Rocket.Chat完整教程

最近在Unraid上搭了一套Rocket.Chat内网聊天服务,踩了不少坑,从MongoDB副本集到Nginx反代都走了一遍,整理成这篇保姆级教程,帮你少走弯路。


一、前置准备

  • Unraid 服务器
  • 公网服务器 + 域名(用于外网访问,本文域名:im.oiai.net
  • 基础 Docker 使用知识

二、步骤1:部署 MongoDB(核心坑点最多)

1. 安装 MongoDB 容器

在 Unraid「Apps」商店搜索 MongoDB,选择官方镜像安装:

  • 端口映射:8017:27017(宿主机端口自定义,本文用 8017)
  • 数据持久化:/mnt/user/appdata/mongodb/:/data/db
  • 关键配置:在「Post Arguments」中填写 --replSet rs0(开启单节点副本集,Rocket.Chat 要求)

2. 初始化 MongoDB 副本集

启动容器后,必须手动初始化副本集(否则 Rocket.Chat 实时功能失效):

# 进入 MongoDB 容器并初始化副本集(带账号密码场景)
docker exec -it MongoDB mongosh -u 你的用户名 -p "你的密码" --authenticationDatabase admin --eval "rs.initiate({_id: 'rs0', members: [{_id: 0, host: '10.1.1.2:8017'}]})"
  • 如果提示「already initialized」,用重配置命令修改节点地址:
    docker exec -it MongoDB mongosh -u 你的用户名 -p "你的密码" --authenticationDatabase admin --eval "cfg = rs.conf(); cfg.members[0].host = '10.1.1.2:8017'; rs.reconfig(cfg, {force: true})"
    
  • 验证:rs.status() 看到 stateStr: "PRIMARY" 即为成功。

3. 踩坑记录

  • ❌ 错误1:security.keyFile is required
    • 原因:副本集 + 账号认证同时开启时,MongoDB 要求密钥文件验证节点身份
    • 解决:内网环境可临时关闭认证(删除 MONGO_INITDB_ROOT_USERNAME/MONGO_INITDB_ROOT_PASSWORD 环境变量),或生成 keyFile 配置
  • ❌ 错误2:The $changeStream stage is only supported on replica sets
    • 原因:未开启副本集,Rocket.Chat 无法监听数据变更实现实时推送
    • 解决:必须添加 --replSet rs0 并完成初始化
  • ❌ 错误3:getaddrinfo ENOTFOUND 容器ID
    • 原因:副本集默认用容器ID作为节点地址,Rocket.Chat 无法解析
    • 解决:初始化时指定宿主机IP+端口,如 host: "10.1.1.2:8017"

三、步骤2:部署 Rocket.Chat 容器

1. 编写 docker-compose.yml

在 Unraid 终端或通过 docker-compose 插件创建配置文件:

services:
  rocketchat:
    image: rocket.chat:latest
    container_name: rocketchat
    restart: unless-stopped
    ports:
      - 8303:3000  # 宿主机端口:容器端口
    volumes:
      - /mnt/user/appdata/rocketchat/uploads:/app/uploads  # 持久化上传文件
    environment:
      - MONGO_URL=mongodb://era:你的复杂密码@10.1.1.2:8017/rocketchat?authSource=admin&replicaSet=rs0
      - MONGO_OPLOG_URL=mongodb://era:你的复杂密码@10.1.1.2:8017/local?authSource=admin&replicaSet=rs0
      - ROOT_URL=https://im.oiai.net  # 公网访问域名
  • 关键说明
    • MONGO_URL:业务数据连接,必须包含账号密码、副本集参数
    • MONGO_OPLOG_URL:实时监听连接,必须指向 local 库,参数与 MONGO_URL 一致
    • ROOT_URL:必须填公网域名,否则 WebSocket 等功能异常

2. 启动容器

docker-compose up -d
  • 验证:查看日志 docker logs rocketchat,出现 SERVER RUNNING 即为启动成功
  • 内网访问:http://10.1.1.2:8303 测试页面是否正常加载

3. 踩坑记录

  • ❌ 错误1:Server selection timed out after 30000 ms
    • 原因:MongoDB 未启动/副本集未初始化/连接参数错误
    • 解决:先确认 MongoDB 正常运行,再检查 MONGO_URL 中账号密码、副本集参数是否完整
  • ❌ 错误2:实时消息延迟/不推送
    • 原因:MONGO_OPLOG_URL 配置错误或副本集未初始化
    • 解决:确保 MONGO_OPLOG_URL 指向 local 库,且副本集状态为 PRIMARY

四、步骤3:公网 Nginx 反代配置

1. Nginx 完整配置

在公网服务器(本文为阿里云)上配置 Nginx,实现 https://im.oiai.net 反代到内网 Rocket.Chat:


server {
    listen 443 ssl;
    server_name im.oiai.net;

    # SSL 证书配置(保持不变)
    ssl_certificate /etc/letsencrypt/live/im.oiai.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/im.oiai.net/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # 👇 必须放在 location / 之前或内部
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    location / {
        proxy_pass http://10.1.1.2:8303;
        proxy_http_version 1.1;  # 必须指定 1.1 以支持 WebSocket
    }
}

2. 生效配置

# 检查配置语法
nginx -t
# 重载配置
systemctl reload nginx

3. 踩坑记录

  • ❌ 错误1:公网访问超时
    • 原因:Nginx配置原因,
    • 解决:参考我的Nginx配置
  • ❌ 错误2:安卓端,服务器URL,无效的URL
    • 原因:Nginx配置原因
    • 解决:参考我的Nginx配置
  • ✅如果是客户端的其他错误,将客户端版本回退到4.57,有详细的错误提示.

五、最终验证

  1. 内网访问:http://10.1.1.2:8303 → 正常加载 Rocket.Chat 页面
  2. 公网访问:https://im.oiai.net → 自动跳转 HTTPS,可注册账号、发送实时消息
  3. 功能测试:发送消息、上传文件、查看在线状态,均正常即为部署成功

六、总结

Unraid 部署 Rocket.Chat 的核心难点在于 MongoDB 副本集配置Nginx WebSocket 反代

  • MongoDB 必须开启副本集并初始化,否则实时功能失效
  • MONGO_OPLOG_URL 是 Rocket.Chat 实时性的关键,不能省略
  • 公网访问必须配置 WebSocket 相关 Header,否则聊天功能异常
  • 密码复杂度要符合要求,避免特殊字符在 URL 中解析问题