GNU/Linux >> Tutoriels Linux >  >> Linux

Guide de mise à niveau vers MongoDB 5.0 et Rocket.Chat 4.0 sur Docker

Rocket.Chat 4.0.0 a récemment été publié. Le processus de mise à niveau depuis la version précédente n'est pas assez simple pour être très honnête.

Même si vous pouvez effectuer la transition à partir d'une ancienne version 3.x.y de Rocket.Chat, les versions antérieures de MongoDB, à savoir 3.6 et 4.0, ont été obsolètes pour une utilisation avec le serveur de chat populaire depuis la nouvelle version. La prise en charge de MongoDB 3.4 a également été supprimée. Ces changements ont d'abord été confirmés sur la demande d'extraction #22907 fusionnée deux semaines plus tôt.

Dans ce didacticiel, j'ai documenté un processus complet étape par étape pour effectuer une mise à niveau réussie vers Rocket.Chat, y compris la mise à niveau de votre version de base de données MongoDB vers la version 5.0 la plus récente.

De plus, il est également obligatoire de changer le moteur de stockage de la base de données de MMAPv1 (également obsolète) à WiredTiger . Ce n'est qu'alors que vous pourrez continuer à mettre à niveau vers les nouvelles versions de Rocket.Chat. Cette procédure a également été soigneusement couverte en détail dans ce guide complet.

Comment mettre à jour Rocket.Chat 3.x.y vers le tout nouveau 4.0.0

Voyons ce dont vous avez besoin pour mettre à niveau Rocket.Chat vers la version la plus récente avec Docker sur un serveur Linux.

Prérequis

Étant donné que ce document est particulièrement axé sur la simplification du processus de migration et de mise à niveau, je supposerai une configuration Rocket.Chat existante (avec mmap moteur de stockage sur MongoDB) basé sur le guide de déploiement suivant :

Toutes les exigences nécessaires ont été détaillées dans le guide ci-dessus. Outre la familiarité avec les commandes Linux, connaître les bases de Docker Compose sera utile ici. Mais les exigences essentielles pertinentes pour ce guide sont :

  • Un déploiement Docker basé sur Rocket.Chat 3.x.y fonctionnant en direct avec au moins la base de données MongoDB 3.4.
  • Configuration du proxy inverse Nginx utilisée pour auto-héberger le serveur Rocket.Chat ci-dessus.

Étape 0 :Sauvegardez un vidage de base de données de votre MongoDB existante

Pour la sécurité de vos données, il est préférable de créer et d'enregistrer d'abord votre base de données MongoDB existante :

mkdir ~/backup
cd ~/rocketchat
docker-compose exec mongo mongodump --archive=/dump/mmap --gzip
cp data/dump/mmap ~/backup/mongo-mmap-dump.gzip

Je vous suggère également d'avoir une sauvegarde complète de votre instance Rocket.Chat.

Vous allez maintenant apprendre les trois choses suivantes :

  • Comment changer le moteur de stockage de base de données obsolète mmap à wiredTiger
  • Mettre à niveau votre instance MongoDB
  • Mettre à niveau votre instance Rocket.Chat

Étape 1 :Arrêtez votre système Rocket.Chat existant, y compris tous ses services

Cette étape est particulièrement importante car vous ne voulez aucune corruption de données sur votre base de données - MongoDB . Juste pour être sûr, il vaut mieux éviter d'effectuer une migration et une mise à niveau sur une instance de base de données en cours d'exécution, même par mise à l'échelle.

 docker-compose stop

Contrairement à docker-compose down , la commande ci-dessus arrêtera uniquement vos conteneurs sans les supprimer, réduisant ainsi les temps d'arrêt le plus possible.

Étape 2 :Téléchargez le référentiel "MongoDB mmap to wiredTiger migration"

À l'aide de git, récupérez le référentiel de migration officiel dans un emplacement séparé sur votre serveur. Considérez cela comme une boîte à outils de migration fournie pour votre commodité par les développeurs de Rocket.Chat.

git clone https://github.com/RocketChat/docker-mmap-to-wiredtiger-migration ~/rocketchat-migration

Étape 3 :Copiez le répertoire "docker" à partir du référentiel téléchargé

Ce répertoire contient le Dockerfile de l'image du migrateur personnalisé. Pour le fichier Docker Compose nouvellement révisé, vous en avez besoin dans votre dossier de composition existant :

cp -r ~/rocketchat-migration/docker ~/rocketchat/docker

Étape 4 :Sauvegardez votre fichier Docker Compose existant

Ici, je l'ai nommé docker-compose.old.yml . Vous pouvez l'utiliser comme référence lorsque vous utilisez la nouvelle configuration (abordée à l'étape suivante) :

mv ~/rocketchat/docker-compose.yml ~/rocketchat/docker-compose.old.yml

Étape 5 :Utiliser le nouveau fichier Docker Compose basé sur la migration

Le référentiel de migration récemment téléchargé comprend également un nouveau fichier Docker Compose pour vous permettre de commencer facilement le processus. Cependant, dans notre cas, j'ai dû suivre la configuration ci-dessous car elle est basée sur une configuration de proxy inverse :

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

Veuillez ne pas considérer ce qui précède comme la configuration finale. Il reste encore beaucoup d'étapes et de changements. Vous avez besoin de la configuration ci-dessus uniquement pour cette étape. Je discuterai des changements ultérieurs plus tard.

Le migrator le service ne s'exécutera qu'une seule fois lorsqu'il trouvera un mmap moteur de stockage. Cela le changerait en wiredTiger . Sinon, il sortirait de lui-même. Le mongo service se comporterait également de la même manière. Passons à l'étape suivante pour voir comment.

Étape 6 :Créez l'image du migrateur pour démarrer la migration

La commande suivante créera l'image du migrateur et commencera le processus de migration. Il redémarrera également les conteneurs. Rocket.Chat attendra la fin de l'initialisation de la base de données avant de démarrer enfin.

docker-compose up --build -d

Pour surveiller l'ensemble du processus, vous pouvez utiliser la commande Docker Compose logs pour surveiller l'intégralité de la procédure :

docker-compose logs -f migrator

Attendez que la commande ci-dessus se termine jusqu'à ce qu'elle tombe à l'invite du terminal avec un code de sortie 0 après le wiredTiger l'instance effectue un arrêt progressif :

rocketchat_migrator_1 exited with code 0

Maintenant, surveillez la base de données :

docker-compose logs -f mongo

Donnez-lui un peu de temps pour s'initialiser et enfin vérifier votre instance Rocket.Chat :

docker-compose logs -f rocketchat

Attendez jusqu'à ce que vous remarquiez le message "SERVER RUNNING". Ce serait quelque chose comme ça :

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         | ➔ +--------------------------------------------------+

Comme vous pouvez le voir ci-dessus, MongoDB Engine: wiredTiger indique que votre instance Rocket.Chat utilise maintenant le WiredTiger moteur de stockage et non plus le MMAPv1 obsolète . Cela signifie qu'il est désormais prêt pour toutes les mises à jour d'application à venir. Mais attendez, MongoDB Version: 4.0.18 est également obsolète. Cela peut être remarqué si vous mettez à niveau vers Rocket.Chat 4.0.0 sans mettre à niveau MongoDB vers au moins la version 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         | +----------------------------------------------------------------------+

Si vous utilisez MongoDB 3.4, notez également que Rocket.Chat 4.0.0 ne le prend PAS en charge. Il est préférable de mettre également à niveau vers la dernière version de MongoDB et d'éviter de futurs problèmes.

Étape 7 :Mettre à niveau MongoDB et Rocket.Chat

Supposons que vous utilisez MongoDB version 3.4 et Rocket.Chat 3.18.2. Pour effectuer une mise à niveau vers la version 5.0, la méthode préférée consiste à effectuer la mise à niveau par incréments. Ainsi, séquentiellement, vous passerez à 3.6, 4.0, 4.2 et 4.4 (préfinale). Enfin, vous pouvez passer à la version 5.0. Voyons comment :

Étape 7a :Arrêtez d'abord les instances

docker-compose stop

Étape 7b :Mettre à jour le fichier Docker Compose

À l'intérieur du mongo et mongo-init-replica définitions de service dans votre fichier Docker Compose, révisez la version de l'image à la deuxième version incrémentielle suivante, comme indiqué ci-dessus. Donc, si vous utilisez MongoDB 3.4, changez-le en version 3.6. Une fois que vous l'avez enregistré, redéployez la configuration mise à jour pour que les modifications prennent effet :

docker-compose up -d

Le conteneur MongoDB va maintenant être recréé sur la base de la version 3.6.

Étape 7c :Activer les fonctionnalités qui conservent les données incompatibles avec les versions antérieures de MongoDB

Cette étape n'est pas facultative. Pour pouvoir passer à la version suivante (>3.6), vous devez également utiliser la commande suivante sur votre conteneur MongoDB :

docker-compose exec mongo bash -c 'mongo --eval "db.adminCommand( { setFeatureCompatibilityVersion: \"3.6\" } )"'

Pour confirmer que la commande a réussi, vous devriez voir une sortie comme :

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)
}

Assurez-vous de voir "ok" : 1, . Il confirme que vous avez activé le paramètre. Revenez maintenant à l'étape 7a et répétez le processus jusqu'à ce que vous ayez mis à niveau vers la version 4.2 et activé la compatibilité des fonctionnalités.

Étape 7d :Mise à niveau vers Rocket.Chat 4.0.0

Félicitations, vous êtes maintenant entièrement prêt pour la mise à niveau vers la toute nouvelle version 4.0.0 car vous êtes maintenant sur MongoDB 4.2 ! Vous pouvez utiliser la mise à l'échelle pour lancer une nouvelle instance Rocket.Chat et minimiser les temps d'arrêt. Modifiez la version de l'image à 4.0.0 dans le fichier Docker Compose et vous êtes prêt :

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

Vous pouvez également confirmer à partir des journaux la nouvelle modification :

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          | +--------------------------------------------------+

Étape 8 :Nous sommes arrivés à la fin du jeu !

A ce stade, il est conseillé de reprendre la mise à jour de la version de la base de données, car le nouveau Rocket.Chat supporte désormais MongoDB 5.0. Vous pouvez donc revenir à l'étape 7a et répéter le même processus jusqu'à 7c pour MongoDB 5.0. De cette façon, comme Rocket.Chat, votre instance MongoDB Docker est également prête pour les futures mises à niveau. Vous pouvez confirmer à partir des journaux la version 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          | +--------------------------------------------------+

Ça y est alors, vous êtes fin prêt ! Profitez de votre serveur Rocket.Chat nouvellement mis à jour !

Notes bonus

Étant donné que seul Rocket.Chat serait mis à l'échelle pour les mises à jour sans temps d'arrêt à partir de maintenant, j'ai conservé le fichier Docker Compose tel quel et je n'ai pas supprimé le migrator définition de service ou réviser le mongo définition du service de base de données basée sur le paramètre d'origine.

Une fois le wiredTiger moteur de stockage est en charge, ils sont ignorés et semblent tout à fait à l'épreuve du temps. Qui sait, cela pourrait s'avérer utile dans les futurs déploiements et mises à niveau ? Voici le rapport de journal pour le migrator service lorsque vous arrêtez et redémarrez un WiredTiger déjà existant configuration du moteur de stockage :

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

Le mongo la définition de service se comporte également de la même manière et ignore la migration basée sur le migrateur lorsqu'elle constate que le WiredTiger le moteur de stockage est déjà en place.

De plus, dans mon cas, j'ai mis à jour la base de données MongoDB à partir de la version 4.0. Mais je n'ai pas eu à exécuter la commande de compatibilité des fonctionnalités (step7c) pour la version 4.0 au préalable. Peut-être était-il déjà activé pour les futures mises à niveau.

Résumé

Dans ce didacticiel pas à pas, vous avez appris à modifier le moteur de stockage de base de données obsolète MMAPv1 à WiredTiger pour MongoDB, mettez à niveau la base de données MongoDB vers la dernière version ainsi que l'instance Rocket.Chat elle-même - le tout sur Docker.

J'espère que ce guide vous aidera à mettre à niveau votre instance RocketChat Docker. Cela sera également utile si vous utilisez MongoDB pour une autre application sur Docker. Si vous avez des commentaires, des questions, des commentaires ou des suggestions, veuillez nous en faire part dans la section des commentaires ci-dessous. Bon auto-hébergement :) !


Linux
  1. Exécuter PostgreSQL dans Docker, un guide rapide et pratique

  2. Comment installer Rocket.Chat sur Ubuntu 16.04

  3. Comment installer Rocket.Chat sur Ubuntu 18.04

  4. Mise à niveau de Docker sur Amazon Linux AMI

  5. docker :PID différent pour `top` et `ps`

Docker pour Mac :le guide d'installation complet

Guide définitif sur la sauvegarde et la restauration des conteneurs Docker [Une approche cloud + locale pour les serveurs autonomes]

Guide complet pour supprimer les images Docker

Commandes Docker pour la gestion du cycle de vie des conteneurs (Guide définitif)

Guide d'installation et de désinstallation d'Anaconda sous Linux

Comment déployer Rocket Chat avec Nginx sur Ubuntu 18.04