GNU/Linux >> Znalost Linux >  >> Linux

Průvodce upgradem na MongoDB 5.0 a Rocket.Chat 4.0 na Dockeru

Nedávno byla vydána verze Rocket.Chat 4.0.0. Proces upgradu z předchozí verze není úplně jednoduchý, abych byl upřímný.

I když můžete provést přechod ze staré verze 3.x.y Rocket.Chat, dřívější verze MongoDB, jmenovitě 3.6 a 4.0, byly od nové verze zastaralé pro použití s ​​populárním chatovacím serverem. Podpora MongoDB 3.4 byla také odstraněna. Tyto změny byly poprvé potvrzeny na žádost o stažení #22907 sloučené před dvěma týdny.

V tomto tutoriálu jsem zdokumentoval kompletní postup krok za krokem k úspěšnému upgradu na Rocket.Chat včetně aktualizace verze databáze MongoDB na nejnovější 5.0.

Kromě toho je také povinná změna databázového úložiště z MMAPv1 (také zastaralé) na WiredTiger . Teprve poté můžete pokračovat v upgradu na novější verze Rocket.Chat. Tento postup byl také pečlivě podrobně popsán v této komplexní příručce.

Jak upgradovat Rocket.Chat 3.x.y na zcela novou verzi 4.0.0

Podívejme se, co potřebujete k upgradu Rocket.Chat na nejnovější verzi pomocí Dockeru na linuxovém serveru.

Předpoklady

Protože se tento dokument zaměřuje zejména na zjednodušení procesu migrace a upgradu, budu předpokládat existující konfiguraci Rocket.Chat (s mmap storage engine na MongoDB) na základě následujícího průvodce nasazením:

Všechny potřebné požadavky byly podrobně popsány ve výše uvedené příručce. Kromě znalosti příkazů Linuxu zde bude užitečná znalost základů Docker Compose. Ale základní požadavky relevantní pro tuto příručku jsou:

  • Nasazení Dockeru založené na Rocket.Chat 3.x.y běžící živě s databází minimálně MongoDB 3.4.
  • Nastavení reverzního proxy serveru Nginx používané k vlastnímu hostování výše uvedeného serveru Rocket.Chat.

Krok 0:Zálohujte výpis databáze vaší stávající MongoDB

Pro bezpečnost vašich dat je lepší nejprve vytvořit a uložit stávající databázi MongoDB:

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

Také bych vám doporučil mít kompletní zálohu vaší instance Rocket.Chat.

Nyní se naučíte následující tři věci:

  • Jak změnit zastaralý databázový úložný stroj mmap na wiredTiger
  • Upgradujte svou instanci MongoDB
  • Upgradujte svou instanci Rocket.Chat

Krok 1:Zastavte svůj stávající systém Rocket.Chat včetně všech jeho služeb

Tento krok je zvláště důležitý, protože nechcete, aby došlo k poškození dat ve vaší databázi - MongoDB . Pro jistotu je lepší se vyhnout provádění migrace a upgradu na běžící instanci databáze, a to i prostřednictvím škálování.

 docker-compose stop

Na rozdíl od docker-compose down  výše uvedený příkaz pouze zastaví vaše kontejnery, aniž by je odstranil, čímž se prostoje udrží na co nejnižší úrovni.

Krok 2:Stáhněte si úložiště „MongoDB mmap to wiredTiger migrace“

Pomocí git načtěte oficiální úložiště migrace do samostatného umístění na vašem serveru. Berte to jako sadu nástrojů pro migraci, kterou vám pro vaše pohodlí poskytli vývojáři Rocket.Chat.

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

Krok 3:Zkopírujte adresář "docker" ze staženého úložiště

Tento adresář obsahuje soubor Dockerfile vlastního obrazu migrace. Pro nově revidovaný soubor Docker Compose potřebujete toto ve vaší stávající složce pro psaní:

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

Krok 4:Zálohujte svůj stávající soubor Docker Compose

Zde jsem to pojmenoval docker-compose.old.yml . Můžete jej použít jako referenci při použití nové konfigurace (probráno v dalším kroku):

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

Krok 5:Použijte nový soubor Docker Compose založený na migraci

Nově stažené úložiště migrace také obsahuje nový soubor Docker Compose, abyste mohli proces snadno zahájit. V našem případě jsem však musel postupovat podle níže uvedené konfigurace, protože je založena na reverzním nastavení proxy:

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

Neberte prosím výše uvedené jako konečnou konfiguraci. Zbývá mnoho dalších kroků a změn. Výše uvedenou konfiguraci potřebujete pouze pro tento krok. O dalších změnách budu diskutovat později.

migrator služba se spustí pouze jednou, když najde mmapu skladovací motor. Změnilo by to na wiredTiger . Jinak by to samo vystoupilo. mongo služba by se také chovala stejným způsobem. Pokračujme dalším krokem, abychom viděli, jak na to.

Krok 6:Vytvořte obraz migrujícího nástroje pro zahájení migrace

Následující příkaz vytvoří obraz migrátoru a zahájí proces migrace. Také znovu spustí kontejnery. Rocket.Chat počká na dokončení inicializace databáze, než se konečně spustí.

docker-compose up --build -d

Chcete-li celý proces sledovat, můžete pomocí příkazu Docker Compose logs sledovat celý postup:

docker-compose logs -f migrator

Počkejte na dokončení výše uvedeného příkazu, dokud nepřejde na výzvu terminálu s kódem ukončení 0 po wiredTiger instance provede elegantní vypnutí:

rocketchat_migrator_1 exited with code 0

Nyní sledujte databázi:

docker-compose logs -f mongo

Dejte mu čas na inicializaci a nakonec zkontrolujte instanci Rocket.Chat:

docker-compose logs -f rocketchat

Počkejte, až si všimnete zprávy „SERVER RUNNING“. Bylo by to něco takového:

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

Jak můžete vidět výše, MongoDB Engine: wiredTiger označuje, že vaše instance Rocket.Chat nyní používá WiredTiger úložný modul a již ne zastaralý MMAPv1 . To znamená, že je nyní připraven na budoucí aktualizace aplikací. Ale počkejte, MongoDB Version: 4.0.18 je také zastaralá. Toho si můžete všimnout, pokud upgradujete na Rocket.Chat 4.0.0 bez upgradu MongoDB alespoň na verzi 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         | +----------------------------------------------------------------------+

V případě, že používáte MongoDB 3.4, také si znovu uvědomte, že Rocket.Chat 4.0.0 jej NEpodporuje. Je také lepší upgradovat na nejnovější verzi MongoDB a předejít budoucím škytavkám.

Krok 7:Upgrade MongoDB a Rocket.Chat

Předpokládejme, že používáte MongoDB verze 3.4 a Rocket.Chat 3.18.2. Chcete-li upgradovat na verzi 5.0, upřednostňovanou metodou je provádět upgrade v krocích. Postupně byste tedy upgradovali na 3.6, 4.0, 4.2 a 4.4 (předběžná verze). Nakonec můžete upgradovat na verzi 5.0. Podívejme se, jak:

Krok 7a:Nejprve zastavte instance

docker-compose stop

Krok 7b:Aktualizujte soubor Docker Compose

Uvnitř mongo a mongo-init-replica definice služeb ve vašem souboru Docker Compose, upravte verzi obrazu na druhou další přírůstkovou verzi, jak je popsáno výše. Pokud tedy používáte MongoDB 3.4, změňte jej na verzi 3.6. Jakmile ji uložíte, znovu nasaďte aktualizovanou konfiguraci, aby se změny projevily:

docker-compose up -d

Kontejner MongoDB bude nyní znovu vytvořen na základě verze 3.6.

Krok 7c:Povolte funkce, které uchovávají data nekompatibilní s dřívějšími verzemi MongoDB

Tento krok není volitelný. Abyste mohli upgradovat na další verzi (>3.6), musíte na svém kontejneru MongoDB použít také následující příkaz:

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

Chcete-li potvrdit, že příkaz byl úspěšný, měli byste vidět výstup jako:

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

Ujistěte se, že vidíte "ok" : 1, . Potvrzuje, že jste nastavení povolili. Nyní se vraťte ke kroku 7a a opakujte proces, dokud neupgradujete na verzi 4.2 a nepovolíte kompatibilitu funkcí.

Krok 7d:Upgrade na Rocket.Chat 4.0.0

Gratulujeme, nyní jste plně připraveni na upgrade na zcela novou verzi 4.0.0, protože nyní používáte MongoDB 4.2! Pomocí škálování můžete spustit novou instanci Rocket.Chat a minimalizovat prostoje. Upravte verzi obrázku na 4.0.0 v souboru Docker Compose a máte hotovo:

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

Můžete také potvrdit z protokolů o nové změně:

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

Krok 8:Nyní jsme na konci hry!

V této fázi je vhodné obnovit upgrade verze databáze, protože nový Rocket.Chat nyní podporuje MongoDB 5.0. Takže se můžete ještě jednou vrátit ke kroku 7a a opakovat stejný proces až do 7c pro MongoDB 5.0. Tímto způsobem, stejně jako Rocket.Chat, je vaše instance MongoDB Docker také připravena na budoucí upgrady. Finální verzi můžete potvrdit z protokolů:

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

To je vše, vše je připraveno! Užijte si svůj nově vylepšený server Rocket.Chat!

Bonusové poznámky

Vzhledem k tomu, že pouze Rocket.Chat by se od nynějška obvykle zvětšoval pro aktualizace bez prostojů, ponechal jsem soubor Docker Compose tak, jak je, a neodstranil jsem migrator definici služby nebo revidovat mongo definice databázové služby na základě původního nastavení.

Jakmile je wiredTiger Úložný motor má na starosti, jsou ignorovány a zdají se být připraveny na budoucnost. Kdo ví, může se ukázat jako užitečné při budoucích nasazeních a upgradech? Zde je protokol protokolu pro migrator službu, když zastavíte a restartujete již existující WiredTiger konfigurace úložiště:

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 definice služby se také chová stejným způsobem a přeskočí migraci na základě migrátoru, když zjistí, že WiredTiger úložný modul je již na svém místě.

V mém případě jsem také upgradoval databázi MongoDB od verze 4.0 výše. Ale nemusel jsem předem spouštět příkaz pro kompatibilitu funkcí (krok 7c) pro verzi 4.0. Možná již byla povolena pro budoucí upgrady.

Shrnutí

V tomto podrobném tutoriálu jste se naučili, jak změnit zastaralý databázový úložný stroj MMAPv1 na WiredTiger pro MongoDB upgradujte databázi MongoDB na nejnovější verzi a také samotnou instanci Rocket.Chat – vše na Dockeru.

Doufám, že vám tato příručka pomůže při upgradu vaší instance RocketChat Docker. To bude také užitečné, pokud používáte MongoDB pro nějakou jinou aplikaci na Dockeru. Pokud máte nějakou zpětnou vazbu, dotazy, komentáře nebo návrhy, podělte se s námi v sekci komentářů níže. Šťastné vlastní hostování :) !


Linux
  1. Bash pro průvodce smyčkou a příklady

  2. Jak nastavit OpenCL pro GPU na Linuxu a Dockeru [Kompletní průvodce]

  3. Kompletní průvodce k samohostování Rocket.Chat s Dockerem

  1. Jak nainstalovat MongoDB na Ubuntu 18.04 – Průvodce pro začátečníky

  2. Spuštění PostgreSQL v Dockeru, Rychlý a praktický průvodce

  3. Jak nainstalovat Rocket.Chat na Ubuntu 16.04

  1. Jak nainstalovat Rocket.Chat na Ubuntu 18.04

  2. Upgrade Dockeru na Amazon Linux AMI

  3. docker:různé PID pro `top` a `ps`