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