GNU/Linux >> Tutoriales Linux >  >> Linux

Guía para actualizar a MongoDB 5.0 y Rocket.Chat 4.0 en Docker

Rocket.Chat 4.0.0 ha sido lanzado recientemente. El proceso de actualización de la versión anterior no es tan simple para ser honesto.

Aunque puede hacer la transición desde una versión anterior 3.x.y de Rocket.Chat, las versiones anteriores de MongoDB, a saber, 3.6 y 4.0, han quedado obsoletas para su uso con el popular servidor de chat desde la nueva versión. También se ha eliminado la compatibilidad con MongoDB 3.4. Estos cambios se confirmaron por primera vez en la solicitud de extracción n.º 22907 fusionada dos semanas antes.

En este tutorial, he documentado un proceso completo paso a paso para realizar una actualización exitosa a Rocket.Chat, incluida la actualización de la versión de su base de datos MongoDB a la versión 5.0 más reciente.

Además, también es obligatorio cambiar el motor de almacenamiento de la base de datos de MMAPv1 (también en desuso) a WiredTiger . Solo entonces podrá continuar actualizándose a versiones más nuevas de Rocket.Chat. Ese procedimiento también ha sido cuidadosamente cubierto en detalle dentro de esta guía completa.

Cómo actualizar Rocket.Chat 3.x.y al nuevo 4.0.0

Veamos qué necesita para actualizar Rocket.Chat a la versión más reciente con Docker en un servidor Linux.

Requisitos

Dado que este documento se centra especialmente en simplificar el proceso de migración y actualización, supondré una configuración existente de Rocket.Chat (con mmap motor de almacenamiento en MongoDB) basado en la siguiente guía de implementación:

Todos los requisitos necesarios se han detallado en la guía anterior. Aparte de la familiaridad con los comandos de Linux, aquí será útil conocer los conceptos básicos de Docker Compose. Pero los requisitos esenciales relevantes para esta guía son:

  • Una implementación de Docker basada en Rocket.Chat 3.x.y que se ejecuta en vivo con al menos una base de datos MongoDB 3.4.
  • Configuración de proxy inverso de Nginx utilizada para autohospedar el servidor Rocket.Chat anterior.

Paso 0:Copia de seguridad de un volcado de base de datos de su MongoDB existente

Para la seguridad de sus datos, es mejor crear y guardar primero su base de datos MongoDB existente:

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

También te sugiero que tengas una copia de seguridad completa de tu instancia de Rocket.Chat.

Ahora aprenderá las siguientes tres cosas:

  • Cómo cambiar el motor de almacenamiento de base de datos obsoleto mmap a tigre cableado
  • Actualice su instancia de MongoDB
  • Actualice su instancia de Rocket.Chat

Paso 1:detenga su sistema Rocket.Chat existente, incluidos todos sus servicios

Este paso es particularmente importante porque no desea que se dañen los datos en su base de datos - MongoDB . Solo para estar seguro, es mejor evitar realizar una migración y actualización en una instancia de base de datos en ejecución, incluso a través del escalado.

 docker-compose stop

A diferencia de docker-compose down , el comando anterior solo detendrá sus contenedores sin eliminarlos, lo que reducirá al máximo el tiempo de inactividad.

Paso 2:Descargue el repositorio "MongoDB mmap to wiredTiger Migration"

Usando git, obtenga el repositorio de migración oficial en una ubicación separada en su servidor. Piense en esto como un conjunto de herramientas de migración proporcionado para su comodidad por los desarrolladores de Rocket.Chat.

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

Paso 3:Copie el directorio "docker" del repositorio descargado

Este directorio contiene el Dockerfile de la imagen del migrador personalizado. Para el archivo Docker Compose recién revisado, necesita esto en su carpeta de composición existente:

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

Paso 4:Haga una copia de seguridad de su archivo Docker Compose existente

Aquí, lo he llamado docker-compose.old.yml . Puede usarlo como referencia cuando use la nueva configuración (discutida en el siguiente paso):

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

Paso 5:Utilice el nuevo archivo Docker Compose basado en migración

El repositorio de migración recién descargado también incluye un nuevo archivo Docker Compose para que pueda comenzar el proceso fácilmente. Sin embargo, en nuestro caso, tuve que seguir la siguiente configuración ya que se basa en una configuración de 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

No tome lo anterior como la configuración final. Quedan muchos más pasos y cambios. Necesita la configuración anterior solo para este paso. Discutiré los cambios adicionales más adelante.

El migrator el servicio solo se ejecutará una vez cuando encuentre un mmap motor de almacenamiento Lo cambiaría a wiredTiger . De lo contrario, saldría solo. El mongo el servicio también se comportaría de la misma manera. Sigamos con el próximo paso para ver cómo.

Paso 6:compilar la imagen del migrador para iniciar la migración

El siguiente comando creará la imagen del migrador y comenzará el proceso de migración. También pondrá en marcha los contenedores de nuevo. Rocket.Chat esperará a que la base de datos termine de inicializarse antes de iniciarse finalmente.

docker-compose up --build -d

Para vigilar todo el proceso, puede usar el comando de registros de Docker Compose para monitorear el procedimiento completo:

docker-compose logs -f migrator

Espere a que se complete el comando anterior hasta que llegue al indicador de terminal con un código de salida 0 después de wiredTiger la instancia realiza un apagado correcto:

rocketchat_migrator_1 exited with code 0

Ahora, monitorea la base de datos:

docker-compose logs -f mongo

Dale algo de tiempo para inicializar y finalmente revisa tu instancia de Rocket.Chat:

docker-compose logs -f rocketchat

Espere hasta que vea el mensaje "SERVIDOR EN FUNCIONAMIENTO". Sería algo como esto:

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

Como puede ver arriba, MongoDB Engine: wiredTiger indica que su instancia de Rocket.Chat ahora está usando WiredTiger motor de almacenamiento y ya no es el obsoleto MMAPv1 . Esto significa que ahora está preparado para futuras actualizaciones de aplicaciones. Pero espera, MongoDB Version: 4.0.18 también está en desuso. Esto se puede notar si actualiza a Rocket.Chat 4.0.0 sin actualizar MongoDB al menos a la versión 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         | +----------------------------------------------------------------------+

En caso de que esté utilizando MongoDB 3.4, también tenga en cuenta que Rocket.Chat 4.0.0 NO es compatible. Es mejor actualizar también a la última versión de MongoDB y evitar contratiempos futuros.

Paso 7:actualice MongoDB y Rocket.Chat

Supongamos que está ejecutando MongoDB versión 3.4 y Rocket.Chat 3.18.2. Para actualizar a la versión 5.0, el método preferido es realizar la actualización en incrementos. Entonces, secuencialmente, actualizaría a 3.6, 4.0, 4.2 y 4.4 (prefinal). Finalmente, puede actualizar a la versión 5.0. Veamos cómo:

Paso 7a:detener las instancias primero

docker-compose stop

Paso 7b:actualice el archivo de Docker Compose

Dentro del mongo y mongo-init-replica definiciones de servicio dentro de su archivo Docker Compose, revise la versión de la imagen a la segunda versión incremental siguiente como se mencionó anteriormente. Entonces, si está ejecutando MongoDB 3.4, cámbielo a la versión 3.6. Una vez que lo haya guardado, vuelva a implementar la configuración actualizada para que los cambios surtan efecto:

docker-compose up -d

El contenedor de MongoDB ahora se recreará según la versión 3.6.

Paso 7c:habilitar funciones que persisten datos incompatibles con versiones anteriores de MongoDB

Este paso no es opcional. Para poder actualizar a la siguiente versión (>3.6), también debe usar el siguiente comando en su contenedor MongoDB:

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

Para confirmar que el comando fue exitoso, debería ver un resultado como:

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

Asegúrate de ver "ok" : 1, . Confirma que habilitó la configuración. Ahora regrese al paso 7a y repita el proceso hasta que haya actualizado a la versión 4.2 y habilitado la compatibilidad de funciones.

Paso 7d:actualice a Rocket.Chat 4.0.0

¡Felicitaciones, ahora está completamente listo para actualizar a la nueva versión 4.0.0 porque ahora está en MongoDB 4.2! Puede usar la escala para activar una nueva instancia de Rocket.Chat y minimizar el tiempo de inactividad. Revise la versión de la imagen a 4.0.0 en el archivo Docker Compose y ya está todo listo:

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

También puede confirmar desde los registros sobre el nuevo cambio:

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

Paso 8:¡Estamos en el final del juego ahora!

En esta etapa, es recomendable reanudar la actualización de la versión de la base de datos, porque el nuevo Rocket.Chat ahora es compatible con MongoDB 5.0. Entonces puede volver al paso 7a una vez más y repetir el mismo proceso hasta el 7c para MongoDB 5.0. De esa forma, al igual que Rocket.Chat, su instancia de MongoDB Docker también está lista para futuras actualizaciones. Puede confirmar desde los registros sobre la versión final:

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

Eso es todo entonces, ¡ya está todo listo! ¡Disfruta de tu servidor Rocket.Chat recién actualizado!

Notas de bonificación

Teniendo en cuenta que solo Rocket.Chat se ampliaría para actualizaciones sin tiempo de inactividad a partir de ahora, mantuve el archivo Docker Compose tal como está y no eliminé el migrator definición de servicio o revisar el mongo definición de servicio de base de datos basada en la configuración original.

Una vez que el wiredTiger el motor de almacenamiento está a cargo, se ignoran y parecen bastante preparados para el futuro. Quién sabe, podría resultar útil en futuras implementaciones y actualizaciones. Este es el informe de registro del migrator servicio cuando detiene y reinicia un WiredTiger ya existente configuración del motor de almacenamiento:

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

El mongo la definición del servicio también se comporta de la misma manera y omite realizar la migración en función del migrador cuando encuentra que WiredTiger el motor de almacenamiento ya está instalado.

Además, en mi caso actualicé la base de datos MongoDB desde la versión 4.0 en adelante. Pero no tuve que ejecutar el comando de compatibilidad de funciones (step7c) para la versión 4.0 de antemano. Quizás ya estaba habilitado para futuras actualizaciones.

Resumen

En este tutorial paso a paso, aprendió a cambiar el motor de almacenamiento de base de datos en desuso MMAPv1 a WiredTiger para MongoDB, actualice la base de datos de MongoDB a la última versión y también la instancia de Rocket.Chat, todo en Docker.

Espero que esta guía lo ayude a actualizar su instancia de RocketChat Docker. Esto también será útil si usa MongoDB para alguna otra aplicación en Docker. Si tiene algún comentario, consulta, comentario o sugerencia, compártalo con nosotros en la sección de comentarios a continuación. ¡Feliz alojamiento propio :)!


Linux
  1. Bash For Loop Guía y ejemplos

  2. Cómo configurar OpenCL para GPU en Linux y Docker [Guía completa]

  3. Guía completa para Rocket.Chat de alojamiento propio con Docker

  4. Cómo instalar Rocket.Chat en Ubuntu 18.04

  5. ventana acoplable:PID diferente para `top` y `ps`

Docker para Mac:la guía de instalación completa

Guía definitiva sobre copia de seguridad y restauración de contenedores Docker [Un enfoque en la nube + local para servidores independientes]

Guía completa para eliminar imágenes de Docker

Comandos de Docker para gestionar el ciclo de vida de los contenedores (guía definitiva)

Guía para instalar y desinstalar Anaconda en Linux

Cómo implementar Rocket Chat con Nginx en Ubuntu 18.04