rocketchat聊天室迁移小记: 从snap到docker

分享和讨论Linux相关的资讯与内容
回复
头像
BobMaster
锋芒初露
锋芒初露
帖子: 1317
注册时间: 2020年 12月 7日 08:05
来自: 神秘的东方
我的状态: 🎯
为圈友点赞: 404 次
被圈友点赞: 262 次
联系:

rocketchat聊天室迁移小记: 从snap到docker

帖子 BobMaster »

文章是多年前编写的,内容可能存在过时,迁移的大体思路主要是用户上传的内容,以及数据库的备份迁移

前言

contabo的服务器一年期快满,我又不想续费了,这就得着手准备各种程序的备份迁移。
而聊天室rocketchat最开始使用的是snap搭建,我觉得更新太慢,且使用的引擎也较旧,故琢磨着迁移至docker部署。
官方文档过于简陋,且使用的数据库和引擎版本相对较低,然后就有了这篇文章《rocketchat聊天室迁移小记: 从snap到docker》

迁移过程

迁移过程主要就是备份数据库、还原数据库。

1. 先使用snap备份数据

代码: 全选

sudo snap stop rocketchat-server.rocketchat-server
sudo snap run rocketchat-server.backupdb
将得到的压缩包拷贝至新服务器上

2. 在新服务器上还原数据库并部署rocketchat
假定你的PWD路径是: /opt/rocketchat
这里分两步走,第一次只创建mongo的服务,然后用命令行将数据库还原至这个新创建的mongodb容器中

代码: 全选

version: '2'

services:
  mongo:
    image: mongo:latest
    restart: unless-stopped
    volumes:
     - ./data/db:/data/db
     - ./data/dump:/dump
    command: mongod  --oplogSize 128 --replSet rs0 --storageEngine=wiredTiger
然后docker-compose up 起来,接下来就是迁移数据库。
将前面的压缩包解压,你会得到一个dump/parties的文件夹,将parties目录移动至/opt/rocketchat/data/dump目录下
使用下面的命令迁移数据库
### sudo docker exec {container 名称,可以通过docker ps获取} sh -c 'exec mongorestore --db parties --noIndexRestore --drop /dump'

代码: 全选

sudo docker exec mongo sh -c 'exec mongorestore --db parties --drop /dump'
数据库还原之后,docker-compose down下来,下面创建完整的rocketchat服务。
PS: 记得将root_url换成你自己的域名

代码: 全选

version: '2'

services:
  rocketchat:
    image: registry.rocket.chat/rocketchat/rocket.chat:latest
    command: >
      bash -c
        "for i in `seq 1 30`; do
          node main.js &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"
    restart: unless-stopped
    volumes:
      - ./uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=https://your_domain_
      - MONGO_URL=mongodb://mongo:27017/parties
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
#       - MAIL_URL=smtp://smtp.email
#       - HTTP_PROXY=http://proxy.domain.com
#       - HTTPS_PROXY=http://proxy.domain.com
    depends_on:
      - mongo
    ports:
      - 3000:3000

  mongo:
    image: mongo:latest
    restart: unless-stopped
    volumes:
     - ./data/db:/data/db
     - ./data/dump:/dump
    command: mongod  --oplogSize 128 --replSet rs0 --storageEngine=wiredTiger

  # this container's job is just run the command to initialize the replica set.
  # it will run the command and remove himself (it will not stay running)
  mongo-init-replica:
    image: mongo:latest
    command: >
      bash -c
        "for i in `seq 1 30`; do
          mongosh mongodb/parties --eval \"
            rs.initiate({
              _id: 'rs0',
              members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 secs...\";
          sleep 5;
        done; (exit $$s)"
    depends_on:
      - mongo
然后docker-compose up起来,如果没问题就成功啦!

遇到的坑

  1. 直接使用官方文档给的docker-compose.yml,我up起来数据库报连接错误,运行不了。
  2. mongo的--smallfiles参数在新版不存在了
  3. --storageEngine=mmapv1引擎在未来会被放弃,rocketchat文档为咋这么古老~

这篇文章仅作为记录,方便未来查看,nginx反代、SSL等的配置我就不说了。

备份脚本

既然用上了docker,经常性的备份肯定是必要的,下面贴出我自用的备份脚本

代码: 全选

#!/usr/bin/env bash
NAMEDATE=`date +%F_%H-%M_%s`_`whoami` && echo $NAMEDATE
/usr/bin/docker exec rocketchat-mongodb sh -c "mkdir /dump/$NAMEDATE"
/usr/bin/docker exec rocketchat-mongodb sh -c "mongodump -d parties --gzip -o /dump/$NAMEDATE" && echo "Database Dumped"
mkdir -p /tmp/backup/rocketchat/$NAMEDATE
mv /home/bobmaster/projects/rocketchat/data/dump/$NAMEDATE /tmp/backup/rocketchat/$NAMEDATE && echo "Database moved"
tar -C /tmp/backup/rocketchat/$NAMEDATE -czf /tmp/backup/rocketchat/$NAMEDATE/db-collections.tar.gz $NAMEDATE && echo "create tar.gz"
chmod -R 0644 /tmp/backup/rocketchat/$NAMEDATE/* && echo "Directory Permission Restored"
/usr/bin/rclone move /tmp/backup/rocketchat/$NAMEDATE/db-collections.tar.gz "your_backup_point:bobmaster-backup/rocketchat/$NAMEDATE"
rm -r /tmp/backup/rocketchat/$NAMEDATE
exit 0

恢复备份

1. 将打包的压缩文件,解压

代码: 全选

tar -zxf db-collections.tar.gz
2. 将解压后的文件夹移动至mongodb dump的挂载目录下

代码: 全选

mv parties /opt/rocketchat/data/dump
3. 还原备份

代码: 全选

docker exec -it rocketchat-mongo bash
echo -e "replication:\n  replSetName: \"rs0\"" | tee -a /etc/mongod.conf
# 使用mongosh进入交互界面,初始化replica set
rs.initiate()
exit
# 恢复数据库
mongorestore --gzip --drop /dump
4. 重启容器即可

PS: 如果遇到权限问题,permission denied mkdir /home/chat
可以用root用户进入容器,手动创建并授权

代码: 全选

docker exec -it -u root rocketchat bash
cd /home
mkdir chat
chown rocketchat:rocketchat chat
参考文献:
https://docs.rocket.chat/quick-start/in ... er-compose
https://forums.rocket.chat/t/how-to-doc ... ongo/11155
https://docs.mongodb.com/database-tools/mongorestore
https://discuss.flarum.org/d/25238-backup-flarum
https://github.com/RocketChat/rocketcha ... storedb.sh
人生如音乐,欢乐且自由
回复

在线用户

正浏览此版面之用户: Google [Bot] 和 8 访客