GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Leitfaden für das Upgrade auf MongoDB 5.0 und Rocket.Chat 4.0 auf Docker

Rocket.Chat 4.0.0 wurde kürzlich veröffentlicht. Der Upgrade-Prozess von der vorherigen Version ist ehrlich gesagt nicht ganz einfach.

Auch wenn Sie den Übergang von einer alten 3.x.y-Version von Rocket.Chat vornehmen können, sind frühere Versionen von MongoDB, nämlich 3.6 und 4.0, seit der neuen Version für die Verwendung mit dem beliebten Chat-Server veraltet. Die Unterstützung für MongoDB 3.4 wurde ebenfalls entfernt. Diese Änderungen wurden erstmals auf Pull Request Nr. 22907 bestätigt, der zwei Wochen zuvor zusammengeführt wurde.

In diesem Tutorial habe ich einen vollständigen Schritt-für-Schritt-Prozess dokumentiert, um ein erfolgreiches Upgrade auf Rocket.Chat durchzuführen, einschließlich des Upgrades Ihrer MongoDB-Datenbankversion auf die neueste Version 5.0.

Darüber hinaus besteht auch die zwingende Notwendigkeit, die Datenbankspeicher-Engine von MMAPv1 zu ändern (ebenfalls veraltet) zu WiredTiger . Erst dann können Sie mit dem Upgrade auf neuere Versionen von Rocket.Chat fortfahren. Auch dieses Verfahren wurde in diesem umfassenden Leitfaden ausführlich behandelt.

So aktualisieren Sie Rocket.Chat 3.x.y auf die brandneue Version 4.0.0

Mal sehen, was Sie brauchen, um Rocket.Chat mit Docker auf einem Linux-Server auf die neueste Version zu aktualisieren.

Voraussetzungen

Da sich dieses Dokument besonders auf die Vereinfachung des Migrations- und Upgrade-Prozesses konzentriert, gehe ich von einer vorhandenen Rocket.Chat-Konfiguration aus (mit mmap Speicher-Engine auf MongoDB) basierend auf dem folgenden Bereitstellungsleitfaden:

Alle notwendigen Anforderungen wurden in der obigen Anleitung detailliert beschrieben. Abgesehen von der Vertrautheit mit Linux-Befehlen ist die Kenntnis der Grundlagen von Docker Compose hier hilfreich. Aber die wesentlichen Anforderungen, die für diesen Leitfaden relevant sind, sind:

  • Eine auf Rocket.Chat 3.x.y basierende Docker-Bereitstellung, die live mit mindestens einer MongoDB 3.4-Datenbank ausgeführt wird.
  • Nginx-Reverse-Proxy-Setup zum Selbsthosten des obigen Rocket.Chat-Servers.

Schritt 0:Sichern Sie einen Datenbank-Dump Ihrer bestehenden MongoDB

Für Ihre Datensicherheit ist es besser, zuerst Ihre vorhandene MongoDB-Datenbank zu erstellen und zu speichern:

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

Ich würde auch vorschlagen, dass Sie auch ein vollständiges Backup Ihrer Rocket.Chat-Instanz haben.

Sie werden jetzt die folgenden drei Dinge lernen:

  • So ändern Sie die veraltete Datenbankspeicher-Engine mmap zu wiredTiger
  • Aktualisieren Sie Ihre MongoDB-Instanz
  • Aktualisieren Sie Ihre Rocket.Chat-Instanz

Schritt 1:Stoppen Sie Ihr bestehendes Rocket.Chat-System einschließlich aller seiner Dienste

Dieser Schritt ist besonders wichtig, da Sie keine Datenbeschädigung in Ihrer Datenbank – MongoDB – wünschen . Nur um sicherzugehen, sollten Sie eine Migration und ein Upgrade auf einer laufenden Datenbankinstanz besser vermeiden, sogar durch Skalierung.

docker-compose stop

Im Gegensatz zu docker-compose down ,  stoppt der obige Befehl nur Ihre Container, ohne sie zu entfernen, wodurch die Ausfallzeit so gering wie möglich gehalten wird.

Schritt 2:Laden Sie das Repository „MongoDB mmap to wiredTiger migration“ herunter

Rufen Sie mit git das offizielle Migrationsrepo an einem separaten Ort auf Ihrem Server ab. Betrachten Sie dies als ein Migrations-Toolkit, das Ihnen von den Rocket.Chat-Entwicklern zur Verfügung gestellt wird.

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

Schritt 3:Kopieren Sie das "docker"-Verzeichnis aus dem heruntergeladenen Repo

Dieses Verzeichnis enthält die Docker-Datei des benutzerdefinierten Migrator-Images. Für die neu überarbeitete Docker Compose-Datei benötigen Sie diese in Ihrem bestehenden Compose-Ordner:

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

Schritt 4:Sichern Sie Ihre vorhandene Docker Compose-Datei

Hier habe ich es docker-compose.old.yml genannt . Sie können es als Referenz verwenden, wenn Sie die neue Konfiguration verwenden (wird im nächsten Schritt besprochen):

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

Schritt 5:Verwenden Sie die neue migrationsbasierte Docker Compose-Datei

Das neu heruntergeladene Migrationsrepo enthält auch eine neue Docker Compose-Datei, damit Sie den Prozess einfach beginnen können. In unserem Fall musste ich jedoch die folgende Konfiguration befolgen, da sie auf einem Reverse-Proxy-Setup basiert:

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

Bitte nehmen Sie das Obige nicht als endgültige Konfiguration. Es bleiben noch viele weitere Schritte und Änderungen. Sie benötigen die obige Konfiguration nur für diesen Schritt. Auf die weiteren Änderungen gehe ich später ein.

Der migrator Der Dienst wird nur einmal ausgeführt, wenn er eine mmap findet Speicher-Engine. Es würde es zu wiredTiger ändern . Andernfalls würde es sich selbst beenden. Der mongo Service würde sich auch in der gleichen Weise verhalten. Fahren wir mit dem nächsten Schritt fort, um zu sehen, wie.

Schritt 6:Erstellen Sie das Migrator-Image, um die Migration zu starten

Der folgende Befehl erstellt das Migrator-Image und startet den Migrationsprozess. Es wird auch die Container wieder hochfahren. Rocket.Chat wartet, bis die Datenbank die Initialisierung abgeschlossen hat, bevor sie endgültig gestartet wird.

docker-compose up --build -d

Um den gesamten Prozess im Auge zu behalten, können Sie den gesamten Vorgang mit dem Befehl Docker Compose logs überwachen:

docker-compose logs -f migrator

Warten Sie, bis der obige Befehl abgeschlossen ist, bis er mit einem Exit-Code 0 nach dem wiredTiger zur Terminal-Eingabeaufforderung wechselt Instanz führt ein ordnungsgemäßes Herunterfahren durch:

rocketchat_migrator_1 exited with code 0

Überwachen Sie jetzt die Datenbank:

docker-compose logs -f mongo

Geben Sie ihm etwas Zeit zum Initialisieren und überprüfen Sie schließlich Ihre Rocket.Chat-Instanz:

docker-compose logs -f rocketchat

Warten Sie, bis Sie die Meldung "SERVER RUNNING" bemerken. Es wäre etwa so:

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

Wie Sie oben sehen können, MongoDB Engine: wiredTiger gibt an, dass Ihre Rocket.Chat-Instanz jetzt den WiredTiger verwendet Speicher-Engine und nicht mehr das veraltete MMAPv1 . Das bedeutet, dass es jetzt für alle bevorstehenden Anwendungsupdates zukunftsfähig ist. Aber warten Sie, MongoDB Version: 4.0.18 wird ebenfalls abgelehnt. Dies kann festgestellt werden, wenn Sie auf Rocket.Chat 4.0.0 aktualisieren, ohne MongoDB mindestens auf Version 4.2 zu aktualisieren:

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

Falls Sie MongoDB 3.4 verwenden, beachten Sie auch noch einmal, dass Rocket.Chat 4.0.0 dies NICHT unterstützt. Es ist besser, auch auf die neueste Version von MongoDB zu aktualisieren und zukünftige Schluckaufe zu vermeiden.

Schritt 7:Aktualisieren Sie MongoDB und Rocket.Chat

Angenommen, Sie verwenden MongoDB Version 3.4 und Rocket.Chat 3.18.2. Um auf Version 5.0 zu aktualisieren, ist die bevorzugte Methode, das Upgrade in Inkrementen durchzuführen. Sie würden also nacheinander auf 3.6, 4.0, 4.2 und 4.4 (vorfinal) upgraden. Schließlich können Sie auf Version 5.0 aktualisieren. Lassen Sie uns sehen, wie:

Schritt 7a:Stoppen Sie zuerst die Instanzen

docker-compose stop

Schritt 7b:Aktualisieren Sie die Docker Compose-Datei

Im mongo und mongo-init-replica Service-Definitionen in Ihrer Docker Compose-Datei, überarbeiten Sie die Image-Version auf die zweitnächste inkrementelle Version, wie oben beschrieben. Wenn Sie also MongoDB 3.4 ausführen, ändern Sie es auf Version 3.6. Nachdem Sie sie gespeichert haben, stellen Sie die aktualisierte Konfiguration erneut bereit, damit die Änderungen wirksam werden:

docker-compose up -d

Der MongoDB-Container wird nun basierend auf Version 3.6 neu erstellt.

Schritt 7c:Aktivieren Sie Funktionen, die Daten beibehalten, die mit früheren Versionen von MongoDB nicht kompatibel sind

Dieser Schritt ist nicht optional. Um auf die nächste Version (>3.6) upgraden zu können, müssen Sie auch den folgenden Befehl auf Ihrem MongoDB-Container verwenden:

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

Um zu bestätigen, dass der Befehl erfolgreich war, sollten Sie eine Ausgabe wie diese sehen:

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

Stellen Sie sicher, dass "ok" : 1, angezeigt wird . Es bestätigt, dass Sie die Einstellung aktiviert haben. Gehen Sie nun zurück zu Schritt 7a und wiederholen Sie den Vorgang, bis Sie auf Version 4.2 aktualisiert und die Funktionskompatibilität aktiviert haben.

Schritt 7d:Upgrade auf Rocket.Chat 4.0.0

Herzlichen Glückwunsch, Sie sind jetzt bereit für ein Upgrade auf die brandneue Version 4.0.0, da Sie sich jetzt auf MongoDB 4.2 befinden! Sie können Skalierung verwenden, um eine frische neue Rocket.Chat-Instanz hochzufahren und Ausfallzeiten zu minimieren. Überarbeiten Sie die Image-Version in der Docker-Compose-Datei auf 4.0.0, und schon sind Sie fertig:

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

Sie können die neue Änderung auch anhand der Protokolle bestätigen:

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

Schritt 8:Wir sind jetzt am Ende des Spiels!

In diesem Stadium ist es ratsam, das Upgrade der Datenbankversion fortzusetzen, da das neue Rocket.Chat jetzt MongoDB 5.0 unterstützt. Sie können also noch einmal zu Schritt 7a zurückkehren und den gleichen Vorgang bis 7c für MongoDB 5.0 wiederholen. So ist auch Ihre MongoDB-Docker-Instanz, wie Rocket.Chat, bereit für zukünftige Upgrades. Sie können anhand der Protokolle die endgültige Version bestätigen:

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

Das war's dann, du bist fertig! Viel Spaß mit Ihrem neu aktualisierten Rocket.Chat-Server!

Bonusnotizen

In Anbetracht der Tatsache, dass von nun an normalerweise nur noch Rocket.Chat für Updates ohne Ausfallzeiten hochskaliert würde, habe ich die Docker Compose-Datei so belassen, wie sie ist, und den migrator nicht entfernt Dienstdefinition oder überarbeiten Sie den mongo Datenbankdienstdefinition basierend auf der ursprünglichen Einstellung.

Einmal der wiredTiger Speicher-Engine verantwortlich ist, werden sie ignoriert und scheinen ziemlich zukunftssicher zu sein. Wer weiß, es könnte sich bei zukünftigen Bereitstellungen und Upgrades als nützlich erweisen? Hier ist der Protokollbericht für den migrator Dienst, wenn Sie einen bereits vorhandenen WiredTiger stoppen und neu starten Speicher-Engine-Konfiguration:

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

Der mongo Dienstdefinition verhält sich ebenfalls auf die gleiche Weise und überspringt die Migration basierend auf dem Migrator, wenn er feststellt, dass WiredTiger Speichermodul ist bereits vorhanden.

Außerdem habe ich in meinem Fall die MongoDB-Datenbank ab Version 4.0 aktualisiert. Aber ich musste den Feature-Kompatibilitätsbefehl (step7c) für Version 4.0 vorher nicht ausführen. Vielleicht war es bereits für zukünftige Upgrades aktiviert.

Zusammenfassung

In dieser Schritt-für-Schritt-Anleitung haben Sie gelernt, wie Sie die veraltete Datenbankspeicher-Engine MMAPv1 ändern zu WiredTiger Aktualisieren Sie für MongoDB die MongoDB-Datenbank auf die neueste Version und auch die Rocket.Chat-Instanz selbst – alles auf Docker.

Ich hoffe, diese Anleitung hilft Ihnen beim Upgrade Ihrer RocketChat Docker-Instanz. Dies ist auch nützlich, wenn Sie MongoDB für eine andere Anwendung auf Docker verwenden. Wenn Sie Feedback, Fragen, Kommentare oder Vorschläge haben, teilen Sie uns dies bitte im Kommentarbereich unten mit. Viel Spaß beim Selbsthosten :) !


Linux
  1. Bash For Loop Guide und Beispiele

  2. So installieren Sie MongoDB unter Ubuntu 18.04 – Leitfaden für Anfänger

  3. So installieren Sie Rocket.Chat unter Ubuntu 18.04

  4. Aktualisieren von Docker auf Amazon Linux AMI

  5. docker:unterschiedliche PID für `top` und `ps`

Docker für Mac:Die vollständige Installationsanleitung

Definitive Guide on Backup and Restore of Docker Containers [A Cloud + Local Approach for Standalone Servers]

Vollständige Anleitung zum Entfernen von Docker-Images

Docker-Befehle zum Verwalten des Containerlebenszyklus (Definitive Guide)

Anleitung zum Installieren und Deinstallieren von Anaconda unter Linux

So stellen Sie Rocket Chat mit Nginx unter Ubuntu 18.04 bereit