Rocket.Chat 4.0.0 è stato recentemente rilasciato. A dire il vero, il processo di aggiornamento dalla versione precedente non è abbastanza semplice.
Anche se è possibile effettuare la transizione da una vecchia versione 3.x.y di Rocket.Chat, le versioni precedenti di MongoDB, vale a dire, 3.6 e 4.0, sono state ritirate per l'uso con il popolare server di chat dalla nuova versione. Anche il supporto per MongoDB 3.4 è stato rimosso. Queste modifiche sono state confermate per la prima volta su richiesta pull n. 22907 unita due settimane prima.
In questo tutorial, ho documentato un processo completo passo dopo passo per eseguire con successo un aggiornamento a Rocket.Chat, incluso l'aggiornamento della versione del database MongoDB alla più recente 5.0.
Inoltre, è anche necessario modificare il motore di archiviazione del database da MMAPv1 (anch'esso deprecato) a WiredTiger . Solo allora puoi continuare l'aggiornamento alle versioni più recenti di Rocket.Chat. Anche questa procedura è stata accuratamente trattata in dettaglio all'interno di questa guida completa.
Come aggiornare Rocket.Chat 3.x.y alla nuovissima 4.0.0
Vediamo di cosa hai bisogno per aggiornare Rocket.Chat alla versione più recente con Docker su un server Linux.
Prerequisiti
Poiché questo documento è particolarmente incentrato sulla semplificazione del processo di migrazione e aggiornamento, assumerò una configurazione Rocket.Chat esistente (con mmap motore di archiviazione su MongoDB) in base alla seguente guida alla distribuzione:
Tutti i requisiti necessari sono stati dettagliati nella guida di cui sopra. A parte la familiarità con i comandi Linux, qui sarà utile conoscere le basi di Docker Compose. Ma i requisiti essenziali rilevanti per questa guida sono:
- Una distribuzione Docker basata su Rocket.Chat 3.x.y in esecuzione live con almeno un database MongoDB 3.4.
- Configurazione del proxy inverso Nginx utilizzata per ospitare autonomamente il server Rocket.Chat di cui sopra.
Passaggio 0:esegui il backup di un dump del database del tuo MongoDB esistente
Per la sicurezza dei dati, è meglio creare e salvare prima il database MongoDB esistente:
mkdir ~/backup
cd ~/rocketchat
docker-compose exec mongo mongodump --archive=/dump/mmap --gzip
cp data/dump/mmap ~/backup/mongo-mmap-dump.gzip
Ti suggerirei anche di avere un backup completo della tua istanza Rocket.Chat.
Ora imparerai le seguenti tre cose:
- Come modificare il motore di archiviazione del database obsoleto mmap a wiredTiger
- Aggiorna la tua istanza MongoDB
- Aggiorna la tua istanza Rocket.Chat
Passaggio 1:interrompi il tuo sistema Rocket.Chat esistente, inclusi tutti i suoi servizi
Questo passaggio è particolarmente importante perché non desideri che i dati vengano danneggiati sul tuo database - MongoDB . Per sicurezza, è meglio evitare di eseguire una migrazione e un aggiornamento su un'istanza di database in esecuzione, anche attraverso il ridimensionamento.
docker-compose stop
Diversamente da docker-compose down
, il comando precedente arresterà solo i tuoi contenitori senza rimuoverli, riducendo così i tempi di inattività il più bassi possibile.
Passaggio 2:scarica il repository "MongoDB mmap to wiredTiger migration"
Usando git, recupera il repository di migrazione ufficiale in una posizione separata sul tuo server. Pensa a questo come a un toolkit di migrazione fornito per tua comodità dagli sviluppatori di Rocket.Chat.
git clone https://github.com/RocketChat/docker-mmap-to-wiredtiger-migration ~/rocketchat-migration
Passaggio 3:copia la directory "docker" dal repository scaricato
Questa directory contiene il Dockerfile dell'immagine del migratore personalizzato. Per il file Docker Compose appena rivisto, è necessario nella cartella di composizione esistente:
cp -r ~/rocketchat-migration/docker ~/rocketchat/docker
Passaggio 4:esegui il backup del file Docker Compose esistente
Qui l'ho chiamato docker-compose.old.yml
. Puoi usarlo come riferimento quando usi la nuova configurazione (discussa nel passaggio successivo):
mv ~/rocketchat/docker-compose.yml ~/rocketchat/docker-compose.old.yml
Passaggio 5:utilizza il nuovo file Docker Compose basato sulla migrazione
Il repository di migrazione appena scaricato include anche un nuovo file Docker Compose per iniziare facilmente il processo. Tuttavia, nel nostro caso, ho dovuto seguire la configurazione seguente poiché si basa su una configurazione del proxy inverso:
version: "3.7"
services:
rocketchat:
image: rocketchat/rocket.chat:3.18.2
command: >
bash -c
"for (( ; ; )); do
node main.js &&
s=$$? && break || s=$$?;
echo \"Could not start Rocket.Chat. Waiting 5 secs...\";
sleep 5;
done; (exit $$s)"
restart: on-failure
volumes:
- ./uploads:/app/uploads
environment:
- PORT=3000
- ROOT_URL=https://chat.domain.com
- LETSENCRYPT_HOST=chat.domain.com
- VIRTUAL_HOST=chat.domain.com
- MONGO_URL=mongodb://mongo:27017/rocketchat
- MONGO_OPLOG_URL=mongodb://mongo:27017/local
- Accounts_UseDNSDomainCheck=false
depends_on:
- mongo
networks:
- net
- rocket
mongo:
image: mongo:4.0
restart: on-failure
volumes:
- ./data/db:/data/db
- ./data/dump:/dump
command: >
bash -c
"while [ ! -f /data/db/WiredTiger ]; do
echo \"wiredTiger migration hasn't started yet. Waiting 30 secs...\";
sleep 30;
done;
docker-entrypoint.sh mongod --oplogSize 128 --replSet rs0 --storageEngine=wiredTiger;"
depends_on:
- migrator
networks:
- rocket
migrator:
build: ./docker/
volumes:
- ./data/db:/data/db
networks:
- rocket
mongo-init-replica:
image: mongo:4.0
command: >
bash -c
"for (( ; ; )); do
mongo mongo/rocketchat --eval \"
rs.initiate({
_id: 'rs0',
members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
s=$$? && break || s=$$?;
echo \"Could not reach MongoDB. Waiting 5 secs ...\";
sleep 5;
done; (exit $$s)"
depends_on:
- mongo
networks:
- rocket
networks:
net:
external: true
rocket:
internal: true
Si prega di non prendere quanto sopra come configurazione finale. Rimangono molti altri passaggi e modifiche. È necessaria la configurazione sopra solo per questo passaggio. Discuterò le ulteriori modifiche in seguito.
Il migrator
il servizio verrà eseguito solo una volta quando trova una mmap motore di archiviazione. Lo cambierebbe in wiredTiger . Altrimenti, uscirebbe da solo. Il mongo
anche il servizio si comporterebbe allo stesso modo. Procediamo con il passaggio successivo per vedere come.
Passaggio 6:crea l'immagine del migratore per avviare la migrazione
Il comando seguente creerà l'immagine del migratore e avvierà il processo di migrazione. Riavvierà anche i contenitori. Rocket.Chat attenderà che il database termini l'inizializzazione prima di avviarsi definitivamente.
docker-compose up --build -d
Per tenere sotto controllo l'intero processo, puoi utilizzare il comando Docker Compose logs per monitorare l'intera procedura:
docker-compose logs -f migrator
Attendi il completamento del comando precedente fino a quando non viene visualizzato il prompt del terminale con un codice di uscita 0 dopo wiredTiger l'istanza esegue uno spegnimento regolare:
rocketchat_migrator_1 exited with code 0
Ora monitora il database:
docker-compose logs -f mongo
Concediti un po' di tempo per inizializzare e infine controllare la tua istanza Rocket.Chat:
docker-compose logs -f rocketchat
Attendi finché non noti il messaggio "SERVER IN ESECUZIONE". Sarebbe qualcosa del genere:
rocketchat_1 | ➔ +--------------------------------------------------+
rocketchat_1 | ➔ | SERVER RUNNING |
rocketchat_1 | ➔ +--------------------------------------------------+
rocketchat_1 | ➔ | |
rocketchat_1 | ➔ | Rocket.Chat Version: 3.18.2 |
rocketchat_1 | ➔ | NodeJS Version: 12.22.1 - x64 |
rocketchat_1 | ➔ | MongoDB Version: 4.0.18 |
rocketchat_1 | ➔ | MongoDB Engine: wiredTiger |
rocketchat_1 | ➔ | Platform: linux |
rocketchat_1 | ➔ | Process Port: 3000 |
rocketchat_1 | ➔ | Site URL: https://chat.domain.com |
rocketchat_1 | ➔ | ReplicaSet OpLog: Enabled |
rocketchat_1 | ➔ | Commit Hash: 2ffdd13795 |
rocketchat_1 | ➔ | Commit Branch: HEAD |
rocketchat_1 | ➔ | |
rocketchat_1 | ➔ +--------------------------------------------------+
Come puoi vedere sopra, MongoDB Engine: wiredTiger
indica che la tua istanza Rocket.Chat sta ora utilizzando WiredTiger motore di archiviazione e non più il deprecato MMAPv1 . Ciò significa che ora è pronto per il futuro per eventuali aggiornamenti imminenti dell'applicazione. Ma aspetta, MongoDB Version: 4.0.18
è anche deprecato. Questo può essere notato se esegui l'aggiornamento a Rocket.Chat 4.0.0 senza aggiornare MongoDB almeno alla versione 4.2:
rocketchat_1 | +--------------------------------------------------+
rocketchat_1 | | SERVER RUNNING |
rocketchat_1 | +--------------------------------------------------+
rocketchat_1 | | |
rocketchat_1 | | Rocket.Chat Version: 4.0.0 |
rocketchat_1 | | NodeJS Version: 12.22.1 - x64 |
rocketchat_1 | | MongoDB Version: 4.0.18 |
rocketchat_1 | | MongoDB Engine: wiredTiger |
rocketchat_1 | | Platform: linux |
rocketchat_1 | | Process Port: 3000 |
rocketchat_1 | | Site URL: https://chat.domain.com |
rocketchat_1 | | ReplicaSet OpLog: Enabled |
rocketchat_1 | | Commit Hash: 2ffdd13795 |
rocketchat_1 | | Commit Branch: HEAD |
rocketchat_1 | | |
rocketchat_1 | +--------------------------------------------------+
rocketchat_1 | +----------------------------------------------------------------------+
rocketchat_1 | | DEPRECATION |
rocketchat_1 | +----------------------------------------------------------------------+
rocketchat_1 | | |
rocketchat_1 | | YOUR CURRENT MONGODB VERSION (4.0.18) IS DEPRECATED. |
rocketchat_1 | | IT WILL NOT BE SUPPORTED ON ROCKET.CHAT VERSION 5.0.0 AND GREATER, |
rocketchat_1 | | PLEASE UPGRADE MONGODB TO VERSION 4.2 OR GREATER |
rocketchat_1 | | |
rocketchat_1 | +----------------------------------------------------------------------+
Nel caso in cui utilizzi MongoDB 3.4, ricorda anche che Rocket.Chat 4.0.0 NON lo supporta. È meglio aggiornare anche all'ultima versione di MongoDB e prevenire futuri singhiozzi.
Passaggio 7:aggiorna MongoDB e Rocket.Chat
Supponiamo che tu stia utilizzando MongoDB versione 3.4 e Rocket.Chat 3.18.2. Per eseguire l'aggiornamento alla versione 5.0, il metodo preferito consiste nell'eseguire l'aggiornamento in incrementi. Quindi, in sequenza, aggiorneresti a 3.6, 4.0, 4.2 e 4.4 (prefinale). Infine, puoi eseguire l'aggiornamento alla versione 5.0. Vediamo come:
Passaggio 7a:arresta prima le istanze
docker-compose stop
Passaggio 7b:aggiorna il file Docker Compose
Dentro il mongo
e mongo-init-replica
definizioni del servizio all'interno del file Docker Compose, rivedere la versione dell'immagine alla seconda versione incrementale successiva come discusso in precedenza. Quindi, se stai utilizzando MongoDB 3.4, cambialo versione 3.6. Dopo averlo salvato, ridistribuisci la configurazione aggiornata per rendere effettive le modifiche:
docker-compose up -d
Il contenitore MongoDB verrà ora ricreato in base alla versione 3.6.
Passaggio 7c:abilita funzionalità che persistono dati incompatibili con le versioni precedenti di MongoDB
Questo passaggio non è facoltativo. Per poter eseguire l'aggiornamento alla versione successiva (>3.6) devi anche utilizzare il seguente comando sul tuo container MongoDB:
docker-compose exec mongo bash -c 'mongo --eval "db.adminCommand( { setFeatureCompatibilityVersion: \"3.6\" } )"'
Per confermare che il comando ha avuto successo, dovresti vedere un output come:
MongoDB shell version v3.6.23
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("fb1e57ff-d2ec-4ac0-8187-c1ae8a36418b") }
MongoDB server version: 3.6.23
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1633455129, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1633455129, 1)
}
Assicurati di vedere "ok" : 1,
. Conferma che hai abilitato l'impostazione. Ora torna al passaggio 7a e ripeti il processo fino a quando non avrai eseguito l'aggiornamento alla versione 4.2 e abilitato la compatibilità delle funzionalità.
Passaggio 7d:esegui l'upgrade a Rocket.Chat 4.0.0
Congratulazioni, ora sei completamente pronto per l'aggiornamento alla nuovissima versione 4.0.0 perché ora sei su MongoDB 4.2! Puoi utilizzare il ridimensionamento per avviare una nuova istanza Rocket.Chat e ridurre al minimo i tempi di inattività. Revisiona la versione dell'immagine alla 4.0.0 nel file Docker Compose e sei pronto:
docker-compose up -d --scale rocketchat=2 --no-recreate
sleep 20 && docker rm -f rocketchat_rocketchat_1
docker-compose up -d --scale rocketchat=1 --no-recreate
Puoi anche confermare dai log la nuova modifica:
rocketchat_2 | +--------------------------------------------------+
rocketchat_2 | | SERVER RUNNING |
rocketchat_2 | +--------------------------------------------------+
rocketchat_2 | | |
rocketchat_2 | | Rocket.Chat Version: 4.0.0 |
rocketchat_2 | | NodeJS Version: 12.22.1 - x64 |
rocketchat_2 | | MongoDB Version: 4.2.17 |
rocketchat_2 | | MongoDB Engine: wiredTiger |
rocketchat_2 | | Platform: linux |
rocketchat_2 | | Process Port: 3000 |
rocketchat_2 | | Site URL: https://chat.domain.com |
rocketchat_2 | | ReplicaSet OpLog: Enabled |
rocketchat_2 | | Commit Hash: 2ffdd13795 |
rocketchat_2 | | Commit Branch: HEAD |
rocketchat_2 | | |
rocketchat_2 | +--------------------------------------------------+
Fase 8:ora siamo alla fine del gioco!
A questo punto è consigliabile riprendere l'aggiornamento della versione del database, perché il nuovo Rocket.Chat ora supporta MongoDB 5.0. Quindi puoi tornare al passaggio 7a ancora una volta e ripetere lo stesso processo fino a 7c per MongoDB 5.0. In questo modo, come Rocket.Chat, anche la tua istanza Docker MongoDB è pronta per aggiornamenti futuri. Puoi confermare dai log la versione finale:
rocketchat_2 | +--------------------------------------------------+
rocketchat_2 | | SERVER RUNNING |
rocketchat_2 | +--------------------------------------------------+
rocketchat_2 | | |
rocketchat_2 | | Rocket.Chat Version: 4.0.0 |
rocketchat_2 | | NodeJS Version: 12.22.1 - x64 |
rocketchat_2 | | MongoDB Version: 5.0.3 |
rocketchat_2 | | MongoDB Engine: wiredTiger |
rocketchat_2 | | Platform: linux |
rocketchat_2 | | Process Port: 3000 |
rocketchat_2 | | Site URL: https://chat.chmod777.ltd |
rocketchat_2 | | ReplicaSet OpLog: Enabled |
rocketchat_2 | | Commit Hash: 2ffdd13795 |
rocketchat_2 | | Commit Branch: HEAD |
rocketchat_2 | | |
rocketchat_2 | +--------------------------------------------------+
Ecco fatto, allora sei a posto! Goditi il tuo server Rocket.Chat appena aggiornato!
Note bonus
Considerando che d'ora in poi solo Rocket.Chat sarebbe stato ridimensionato per gli aggiornamenti senza tempi di inattività, ho mantenuto il file Docker Compose così com'è e non ho rimosso il migrator
definizione del servizio o rivedere il mongo
definizione del servizio database in base all'impostazione originale.
Una volta che il wiredTiger
il motore di archiviazione è in carica, vengono ignorati e sembrano abbastanza a prova di futuro. Chissà, potrebbe rivelarsi utile in future implementazioni e aggiornamenti? Ecco il rapporto di registro per il migrator
servizio quando arresti e riavvii un WiredTiger già esistente configurazione del motore di archiviazione:
Attaching to rocketchat_migrator_1
migrator_1 | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
migrator_1 | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
migrator_1 | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
migrator_1 | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
migrator_1 | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
migrator_1 | Found /data/db/WiredTiger - assuming migration to WiredTiger already completed...
rocketchat_migrator_1 exited with code 0
Il mongo
anche la definizione del servizio si comporta allo stesso modo e salta la migrazione in base al migratore quando rileva che WiredTiger il motore di archiviazione è già attivo.
Inoltre, nel mio caso, ho aggiornato il database MongoDB dalla versione 4.0 in poi. Ma non ho dovuto eseguire in anticipo il comando di compatibilità delle funzionalità (step7c) per la versione 4.0. Forse era già abilitato per futuri aggiornamenti.
Riepilogo
In questo tutorial passo passo, hai imparato a modificare il motore di archiviazione del database deprecato MMAPv1 a WiredTiger per MongoDB, aggiorna il database MongoDB all'ultima versione e anche l'istanza Rocket.Chat stessa, il tutto su Docker.
Spero che questa guida ti aiuti ad aggiornare la tua istanza Docker RocketChat. Questo sarà utile anche se usi MongoDB per qualche altra applicazione su Docker. Se hai feedback, domande, commenti o suggerimenti, condividi con noi nella sezione commenti qui sotto. Buon self-hosting :)!