GNU/Linux >> Linux Esercitazione >  >> Linux

Guida per l'aggiornamento a MongoDB 5.0 e Rocket.Chat 4.0 su Docker

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 :)!


Linux
  1. Come configurare OpenCL per GPU su Linux e Docker [Guida completa]

  2. Guida completa all'auto-hosting di Rocket.Chat con Docker

  3. Come installare Rocket.Chat su Ubuntu 16.04

  4. Come installare Rocket.Chat su Ubuntu 18.04

  5. finestra mobile:PID diverso per `top` e `ps`

Docker per Mac:la guida all'installazione completa

Guida definitiva al backup e ripristino dei container Docker [Un approccio cloud + locale per server standalone]

Guida completa per la rimozione delle immagini Docker

Comandi Docker per la gestione del ciclo di vita dei container (Guida definitiva)

Guida per l'installazione e la disinstallazione di Anaconda in Linux

Come distribuire Rocket Chat con Nginx su Ubuntu 18.04