在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,有详细的错误提示.
五、最终验证
- 内网访问:
http://10.1.1.2:8303→ 正常加载 Rocket.Chat 页面 - 公网访问:
https://im.oiai.net→ 自动跳转 HTTPS,可注册账号、发送实时消息 - 功能测试:发送消息、上传文件、查看在线状态,均正常即为部署成功
六、总结
Unraid 部署 Rocket.Chat 的核心难点在于 MongoDB 副本集配置 和 Nginx WebSocket 反代:
- MongoDB 必须开启副本集并初始化,否则实时功能失效
MONGO_OPLOG_URL是 Rocket.Chat 实时性的关键,不能省略- 公网访问必须配置 WebSocket 相关 Header,否则聊天功能异常
- 密码复杂度要符合要求,避免特殊字符在 URL 中解析问题
Comments ()