文章是多年前编写的,内容可能存在过时,迁移的大体思路主要是用户上传的内容,以及数据库的备份迁移
前言
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
将前面的压缩包解压,你会得到一个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'
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.yml,我up起来数据库报连接错误,运行不了。
- mongo的--smallfiles参数在新版不存在了
- --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
代码: 全选
mv parties /opt/rocketchat/data/dump
代码: 全选
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
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