Недавно вышел Rocket.Chat 4.0.0, и, честно говоря, перейти на новую версию с предыдущей не так-то просто.

Хотя возможность перехода на новую версию Rocket.Chat с более старых (3.x.y.) предусмотрена, некоторые ранние версии MongoDB, а именно 3.6 и 4.0, уже не рекомендуются к использованию с популярным чат-сервером с момента выхода новой. Кроме того, для версии MongoDB 3.4 уже не предоставляется поддержка. Эти новшества впервые подтвердили в запросе на включение изменений #22907, составленном две недели назад (прим. переводчика: дата составления — 21.09.21).

В этом руководстве я отразил полный пошаговый процесс перехода на новый Rocket.Chat с обновлением базы данных MongoDB до последней версии — 5.0.

Кроме того, есть насущная необходимость перейти с движка хранения базы данных MMAPv1 (он тоже устарел) на WiredTiger, ведь это обязательное условие обновления Rocket.Chat. Эта процедура тоже подробно раскрыта в нашей детальной инструкции.

Как перейти с Rocket.Chat 3.x.y на последнюю версию — 4.0.0


Давайте разберём, что вам потребуется для обновления Rocket.Chat до последней версии с помощью Docker на сервере Linux.

Необходимые условия


Поскольку в этом материале акцент сделан на упрощении процесса миграции и обновления, будем исходить из конфигурации Rocket.Chat (с движком хранения mmap в MongoDB), описанной в одном из наших руководств по развёртыванию.

В этом руководстве также перечислены все необходимые условия. Помимо знания команд Linux, вам пригодится владение основами работы с Docker Compose. Но самые важные требования в контексте данного руководства такие:

  • Развёрнутый в Docker Rocket.Chat версии 3.0.0 и выше с базой данных MongoDB версии не старее 3.4.
  • Обратный прокси Nginx, настроенный для виртуального хостинга сервера Rocket.Chat.

Шаг 0: Создайте резервную копию дампа имеющейся базы данных MongoDB


Чтобы защититься от потери данных, лучше начать с сохранения имеющейся базы MongoDB:

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

Также рекомендую сохранить полную резервную копию текущего экземпляра Rocket.Chat.

А сейчас разберём, как выполнить три задачи:

  • Сменить устаревший движок хранения mmap на WiredTiger
  • Обновить экземпляр MongoDB
  • Обновить экземпляр Rocket.Chat

Шаг 1: Остановите текущую систему Rocket.Chat со всеми службами


Этот шаг особенно важен, поскольку позволяет избежать повреждений данных в MongoDB. В качестве предосторожности не рекомендуется проводить миграцию и обновление активного экземпляра базы данных — даже через масштабирование.

docker-compose stop

В отличие от docker-compose down эта команда только остановит ваши контейнеры, не удаляя их, что сократит время простоя до минимума.

Шаг 2: Загрузите репозиторий «MongoDB mmap to wiredTiger migration»


С помощью git поместите официальный репозиторий для миграции в отдельное место на своём сервере. Рассматривайте его как набор средств для миграции от разработчиков Rocket.Chat.

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

Шаг 3: Скопируйте из загруженного репозитория папку «docker»


В этой папке находится Dockerfile кастомного образа средства миграции. Для изменённой версии файла Docker Compose в существующей папке compose должно быть вот что:

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

Шаг 4: Создайте резервную копию текущего файла Docker Compose


Здесь я назвал её docker-compose.old.yml. Можете использовать её как отправную точку при работе с новой конфигурацией (о которой в следующем шаге):

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

Шаг 5: Используйте новый, основанный на миграции файл Docker Compose


В только что скачанном репозитории миграции также есть новый файл Docker Compose, обеспечивающий лёгкое начало процесса. Однако в нашем случае мне пришлось следовать конфигурации, которая учитывает наличие обратного прокси-сервера:

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

Будьте внимательны: это не окончательная конфигурация. Впереди еще много шагов и изменений. Всё, что выше, вам понадобится только для этого шага. Про дальнейшие изменения расскажу чуть позже.

Служба migrator не запустится, пока не найдет движок хранения mmap. После этого она выполнит одну задачу — заменит его на wiredTiger. В отсутствие движка mmap служба прекратит работу. Служба mongo работает по такому же принципу. Подробнее о ней — в следующем шаге.

Шаг 6: Создайте образ средства миграции для запуска миграции


Сейчас изучим команду, с помощью которой создаётся образ средства миграции и запускается сам процесс. Эта же команда затем запустит контейнеры. Rocket.Chat подождёт, пока база данных завершит инициализацию, и только потом запустится.

docker-compose up --build -d

Для общего контроля над процессом можете отслеживать его ход с помощью команды Docker Compose Logs.

docker-compose logs -f migrator

Подождите окончания выполнения команды: она выдаст заключительную подсказку с кодом завершения 0, когда экземпляр wiredTiger корректно прекратит работу:

rocketchat_migrator_1 exited with code 0

Теперь следите за базой данных:

docker-compose logs -f mongo

Дайте ей немного времени на инициализацию, а потом проверьте экземпляр Rocket.Chat:

docker-compose logs -f rocketchat

Подождите, пока не появится сообщение «SERVER RUNNING». Общий вид будет примерно такой:

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

Как понятно выше из строки MongoDB Engine: wiredTiger, экземпляр Rocket.Chat теперь использует движок хранения wiredTiger вместо устаревшего MMAPv1. Значит, он готов к установке любых дальнейших обновлений? Как бы не так! MongoDB версии 4.0.18 тоже объявлена нежелательной. Это всплывёт, если перейти на Rocket.Chat 4.0.0, не обновив MongoDB хотя бы до версии 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     	| +----------------------------------------------------------------------+

Если у вас MongoDB 3.4, имейте в виду, что Rocket.Chat 4.0.0 эту версию НЕ поддерживает. Лучше тоже обновиться до новейшей версии MongoDB во избежание дальнейших неурядиц.

Шаг 7: Обновите MongoDB и Rocket.Chat


Предположим, что у вас MongoDB версии 3.4 и Rocket.Chat 3.18.2. Чтобы обновиться до версии 5.0, рекомендуется действовать поэтапно, то есть сначала до 3.6, потом 4.0, 4.2 и 4.4 (предпоследней), и только потом до версии 5.0. Разберём, как это сделать.

Шаг 7а: Сначала остановите экземпляры


docker-compose stop

Шаг 7b: Обновите файл Docker Compose


В определениях служб mongo и mongo-init-replica в файле Docker Compose измените версию образа на вторую последующую версию, как указано выше. То есть, если у вас MongoDB 3.4, замените её версией 3.6. Сохранив изменения, разверните обновлённую конфигурацию, чтобы применить их:

docker-compose up -d

Теперь контейнер MongoDB будет воссоздан на основе версии 3.6.

Шаг 7c: Включите функции управления данными, не совместимыми с более ранними версиями MongoDB


Пропустить этот шаг нельзя. Чтобы обновиться до следующей версии (выше 3.6), необходимо выполнить в контейнере MongoDB вот такую команду:

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

В случае успешного выполнения вы увидите примерно такой результат:

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

Главное, на что обратить внимание — "ok" : 1,. Это подтверждение, что настройка активна. Теперь вернитесь к шагу 7a и повторяйте его, пока не обновитесь до версии 4.2 и не активируете совместимость функций.

Шаг 7d: Обновитесь до Rocket.Chat 4.0.0


Мои поздравления: как счастливый обладатель MongoDB 4.2, вы полностью готовы к переходу на новейшую версию Rocket.Chat — 4.0.0. Можно прибегнуть к масштабированию, чтобы запустить новенький экземпляр Rocket.Chat и минимизировать простой. Измените версию образа в файле Docker Compose на 4.0.0, и можно начинать:

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

Можно также проверить внесённое изменение в журнале:

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


Шаг 8: Мы почти у цели!


На данном этапе рекомендуется возобновить обновление версии базы данных, поскольку новый Rocket.Chat теперь поддерживает MongoDB 5.0. Так что можно опять вернуться к шагу 7a и повторить действия вплоть до шага 7c уже для MongoDB 5.0. Так ваш экземпляр MongoDB в Docker, как и Rocket.Chat, будет готов к дальнейшим обновлениям. Проверить окончательную версию тоже можно в журнале:

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

Вот и всё, задача выполнена. Приятной работы с обновлённым сервером Rocket.Chat!

В качестве бонуса


Учитывая, что в дальнейшем обновление без простоя через масштабирование будет доступно только для Rocket.Chat, я сохранил файл Docker Compose без изменений, не удаляя определение службы migrator и не редактируя определение службы базы данных mongo, основанные на первоначальных настройках.

Как только запустится движок хранения wiredTiger — они не будут влиять на процесс и, похоже, не потеряют актуальности. Кто знает, может быть, пригодятся для других развёртываний и обновлений. Вот отчёт о работе службы migrator, когда вы останавливаете и вновь запускаете уже имеющуюся конфигурацию движка хранения wiredTiger:

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

Определение службы mongo ведёт себя аналогичным образом и пропускает этап миграции с помощью средства миграции, когда выясняет, что движок хранения wiredTiger уже установлен.

Кроме того, в моем случае я обновлял базу данных MongoDB с версии 4.0 до более поздней, но мне не понадобилось выполнять команду совместимости функций (шаг 7c) для версии 4.0 заранее. Возможно, эта настройка уже была активна для последующих обновлений.

Заключение


Вы ознакомились с пошаговым руководством по замене устаревшего движка хранения базы данных MongoDB MMAPv1 на wiredTiger, а также обновлению самой MongoDB и экземпляра Rocket.Chat до последней версии — и всё это в Docker.

Надеюсь, руководство окажется полезным тем, кому пришло время обновить свой Rocket.Chat на этой платформе. Также оно может пригодиться, если вы используете MongoDB для других приложений в Docker.


НЛО прилетело и оставило здесь промокоды для читателей нашего блога:

15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

20% на выделенные серверы AMD Ryzen и Intel Core HABRFIRSTDEDIC.

Доступно до 31 декабря 2021 г.

Комментарии (0)