Have a Question?
Rocket.Chat – Migrando da versão 3.18 para a versão 4.0
Migrando MongoDB de MMAPv1 para WiredTiger
As instalações iniciais do Rocket.Chat via docker, traziam como padrão o mecanismo de armazenamento (Storage Engine) MMAPv1.
Este mecanismo, no entanto, foi descontinuado e, para podermos atualizar o Rocket.Chat das versões mais antigas como as 3.x para a versão 4.x, é necessário migrar o armazenamento do MongoDB para WiredTiger.
Este passo-a-passo foi testado na migração de um ambiente Rocket.Chat 3.18.x para 4.0 e é possível que sirva para outras versões.
Primeiramente, edite o arquivo docker-compose.yml, criando dois novos volumes no serviço ou no container do mongodb, conforme abaixo. Colocamos em vermelho o trecho adicionado:
version: '3.4'
services:
rocketchat:
image: rocketchat/rocket.chat:latest
command: "node main.js"
environment:
- PORT=3000
- ROOT_URL=http://localhost:3000
- MONGO_URL=mongodb://mongo:27017/rocketchat
- MONGO_OPLOG_URL=mongodb://mongo:27017/local
- ADMIN_USERNAME=admin
- ADMIN_PASS=admin
ports:
- 3000:3000
mongo:
image: mongo:4.0
restart: unless-stopped
volumes:
- mongo-data-rz:/data/db
- mongo-data-backup-volume:/data/backup
- mongo-data-dump:/data/dump
command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
mongo-init-replica:
image: mongo:4.0
command: >
bash -c
"for i in `seq 1 30`; do
mongo mongo/rocketchat --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)" labels:
- "traefik.enable=false"
depends_on:
- mongo
volumes:
mongo-data-rz:
driver: local
mongo-data-backup-volume:
driver: local
mongo-data-dump:
driver: local
Inicialize ou atualize o serviço ou o container do mongo com o seguinte comando:
docker-compose up -d mongo
Agora acesse o container do mongo:
docker-compose exec mongo bash
E execute os seguintes comandos para fazer um backup dos arquivos originais e também gerar um dump que permite importação no novo mecanismo de armazenamento:
cp /data/db /data/backup/ -r
mongodump --archive=/data/dump/mmap --gzip
Agora que já temos o backup e o dump, vamos apagar o banco-de-dados:
rm -rf /data/db/*
Agora precisamos fazer um novo ajuste no comando de inicialização do Mongo, para que utilize o mecanismo WiredTiger. Veja a linha que modificamos abaixo, em vermelho:
version: '3.4'
services:
rocketchat:
image: rocketchat/rocket.chat:latest
command: "node main.js"
environment:
- PORT=3000
- ROOT_URL=http://localhost:3000
- MONGO_URL=mongodb://mongo:27017/rocketchat
- MONGO_OPLOG_URL=mongodb://mongo:27017/local
- ADMIN_USERNAME=admin
- ADMIN_PASS=admin
ports:
- 3000:3000
mongo:
image: mongo:4.0
restart: unless-stopped
volumes:
- mongo-data-rz:/data/db
- mongo-data-backup-volume:/data/backup
- mongo-data-dump:/data/dump
command: mongod --oplogSize 128 --replSet rs0 --storageEngine=wiredTiger --bind_ip_all
mongo-init-replica:
image: mongo:4.0
command: >
bash -c
"for i in `seq 1 30`; do
mongo mongo/rocketchat --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)" labels:
- "traefik.enable=false"
depends_on:
- mongo
volumes:
mongo-data-rz:
driver: local
mongo-data-backup-volume:
driver: local
mongo-data-dump:
driver: local
Atualize a stack rodando o comando abaixo:
docker-compose up -d mongo
Acesse novamente o container do mongo:
docker-compose exec mongo bash
Agora vamos restaurar o banco do Rocket.Chat dentro do Mongo:
mongorestore --drop --archive=/data/dump/mmap --gzip --noIndexRestore
mongo --eval 'db.repairDatabase()'
Pronto! Agora é só atualizar a versão do Rocket.Chat e do MongoDB no docker-compose.yml:
version: '3.4'
services:
rocketchat:
image: rocketchat/rocket.chat:4.0.0
command: "node main.js"
environment:
- PORT=3000
- ROOT_URL=http://localhost:3000
- MONGO_URL=mongodb://mongo:27017/rocketchat
- MONGO_OPLOG_URL=mongodb://mongo:27017/local
- ADMIN_USERNAME=admin
- ADMIN_PASS=admin
ports:
- 3000:3000
mongo:
image: mongo:4.2
restart: unless-stopped
volumes:
- mongo-data-rz:/data/db
# Comentar ou remover:
# - mongo-data-backup-volume:/data/backup
# - mongo-data-dump:/data/dump
command: mongod --oplogSize 128 --replSet rs0 --storageEngine=wiredTiger --bind_ip_all
mongo-init-replica:
image: mongo:4.2
command: >
bash -c
"for i in `seq 1 30`; do
mongo mongo/rocketchat --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)" labels:
- "traefik.enable=false"
depends_on:
- mongo
volumes:
mongo-data-rz:
driver: local
# Comentar ou remover:
# mongo-data-backup-volume:
# driver: local
# mongo-data-dump:
# driver: local