RC v7.x to v8.0.1 needing to upgrade MongoDB to v8.2

I worked through this over the last 24 hours with a succesful upgrade from RC v7 and MongoDB v7 to RC v8.0.1 and MongoDB v8.2.3 for test docker environment.

Found here (RC develop compose.yml) line 133:

mongo:
image: mongodb/mongodb-community-server:8.2-ubi8

Upgrade notes:


## Take backup of existing database for restoration post MongoDB version upgrade ##


# Confirm correct DB name. Make backup of the correct database...
$ docker exec -it rocketchat-mongodb-1 mongosh --eval "show dbs"
admin       128.00 KiB
config      268.00 KiB
local         2.17 GiB
rocketchat    1.38 GiB


# Confirm stats match those shown in Rocketchat-GUI > admin > workspace
docker exec -it rocketchat-mongodb-1 mongosh rocketchat --eval "db.users.countDocuments()"              # number of users
docker exec -it rocketchat-mongodb-1 mongosh rocketchat --eval "db.rocketchat_room.countDocuments()"    # number of rooms
docker exec -it rocketchat-mongodb-1 mongosh rocketchat --eval "db.rocketchat_message.countDocuments()" # number of messages


# Take backup of DB
$ docker exec -it rocketchat-mongodb-1 mongodump \
  --db rocketchat \
  --archive \
  --verbose \
  > ~/backup/rocketchat-v7-$(date +%Y%m%d).raw


# Verify backup
$ docker cp ~/backup/rocketchat-v7-20260118.raw rocketchat-mongodb-1:/tmp/full.raw	# copy into container
$ docker exec rocketchat-mongodb-1 mongorestore --archive=/tmp/full.raw --dryRun --verbose | tail -20
...
2026-01-17T23:49:57.837+0000	dry run completed
2026-01-17T23:49:57.838+0000	0 document(s) restored successfully. 0 document(s) failed to restore.
# success, no unexpected end of file or other error
# if errors, try replacing the date expression from the backup file name creation with just the word "full" and take backup again


# Cleanup backup dump from the container
$ docker exec -u 0 -it rocketchat-mongodb-1 rm /tmp/full.raw  #	execute as user 0(root) within container (permissions req'd).


# Duplicate backup to remote server/file system
$ cp rocketchat-v7-20260118.raw <remote destination>/rocketchat-v7-20260118.raw


# Is the "local" DB to be backed up also? No — the "local" database is MongoDB's internal system database storing replica set oplog, config, and metadata. Backing it up will corrupt replication (rs0 state, elections), and restores do not merge properly across versions.​



## Upgrade container images and new requirements ##


# Alter Compose.yml and .env with changes from bitnami image to mongodb community server image.
# Note changed DB volume mapping (different container internal mount point). See also change of permissions for external (host) volume.

# v7 compose.yml

volumes:
  mongodb_data: { driver: local }

services:
  rocketchat:
    image: registry.rocket.chat/rocketchat/rocket.chat:${RELEASE}
    restart: unless-stopped
    environment:
      MONGO_URL: ${MONGO_URL}
      MONGO_OPLOG_URL: ${MONGO_OPLOG_URL}
      ROOT_URL: <your URL>
      PORT: ${PORT}
      DEPLOY_METHOD: docker
      DEPLOY_PLATFORM: ${DEPLOY_PLATFORM}
    depends_on:
      - mongodb
    expose:
      - ${PORT}
    ports:
      - "${BIND_IP}:${HOST_PORT}:${PORT}"

  mongodb:
    image: docker.io/bitnami/mongodb:${MONGODB_VERSION}
    restart: unless-stopped
    volumes:
      - /<host dir>/mongodb_data:/bitnami/mongodb
    environment:
      MONGODB_REPLICA_SET_MODE: primary
      MONGODB_REPLICA_SET_NAME: ${MONGODB_REPLICA_SET_NAME:-rs0}
      MONGODB_PORT_NUMBER: ${MONGODB_PORT_NUMBER:-27017}
      MONGODB_INITIAL_PRIMARY_HOST: ${MONGODB_INITIAL_PRIMARY_HOST:-mongodb}
      MONGODB_ENABLE_JOURNAL: ${MONGODB_ENABLE_JOURNAL:-true}
      ALLOW_EMPTY_PASSWORD: ${ALLOW_EMPTY_PASSWORD:-yes}


# v8 compose.yml

volumes:
  mongodb_data: { driver: local }

services:
  rocketchat:
    image: registry.rocket.chat/rocketchat/rocket.chat:${RELEASE}
    restart: unless-stopped
    environment:
      MONGO_URL: ${MONGO_URL}
      MONGO_OPLOG_URL: ${MONGO_OPLOG_URL}
      ROOT_URL: <your URL>
      PORT: ${PORT}
      DEPLOY_METHOD: docker
      DEPLOY_PLATFORM: ${DEPLOY_PLATFORM}
    depends_on:
      - mongodb
    expose:
      - ${PORT}
    ports:
      - "${BIND_IP}:${HOST_PORT}:${PORT}"

  mongodb:
    image: mongodb/mongodb-community-server:${MONGODB_VERSION}    # changed image source
    restart: unless-stopped
    user: "999:992"   # UID:GID defined as per mongodb community server requirement (normally 999:999, we have custom requirement)
    volumes:
      - /<host dir>/mongodb_data:/data/db     # changed container directory as per mongodb community server
  # chown -R 999:999 /<host dir>mongodb_data/
    command: mongod --replSet rs0 --bind_ip_all   # new requirement
    environment:
  #      MONGODB_INITDB_ROOT_USERNAME: root     # optoinal for community edition
  #      MONGODB_INITDB_ROOT_PASSWORD: secret   # optional
      MONGODB_REPLICA_SET_MODE: primary
      MONGODB_REPLICA_SET_NAME: ${MONGODB_REPLICA_SET_NAME:-rs0}
      MONGODB_PORT_NUMBER: ${MONGODB_PORT_NUMBER:-27017}
      MONGODB_INITIAL_PRIMARY_HOST: ${MONGODB_INITIAL_PRIMARY_HOST:-mongodb}
      MONGODB_ENABLE_JOURNAL: ${MONGODB_ENABLE_JOURNAL:-true}
      ALLOW_EMPTY_PASSWORD: ${ALLOW_EMPTY_PASSWORD:-yes}


# v7 environment file

# Rocket.Chat version
# see:- https://github.com/RocketChat/Rocket.Chat/releases
RELEASE=7.8.0
# MongoDB endpoint (include ?replicaSet= parameter)
MONGO_URL=mongodb://mongodb:27017/rocketchat?replicaSet=rs0
# MongoDB endpoint to the local database
MONGO_OPLOG_URL=mongodb://mongodb:27017/local?replicaSet=rs0
# IP to bind the process to
BIND_IP=<your IP>
# URL used to access your Rocket.Chat instance
ROOT_URL=<your URL>
# Port Rocket.Chat runs on (in-container)
PORT=3000
# Port on the host to bind to
HOST_PORT=3000
# Added this in response to the warning of variable not set
DEPLOY_PLATFORM=selfhosted

### MongoDB configuration
# MongoDB version/image tag
MONGODB_RELEASE=7.0
# See:- https://hub.docker.com/r/bitnami/mongodb
MONGODB_VERSION=7.0


# v8 environment file

# Rocket.Chat version
# see:- https://github.com/RocketChat/Rocket.Chat/releases
RELEASE=8.0.1
# MongoDB endpoint (include ?replicaSet= parameter)
MONGO_URL=mongodb://mongodb:27017/rocketchat?replicaSet=rs0
# MongoDB endpoint to the local database
MONGO_OPLOG_URL=mongodb://mongodb:27017/local?replicaSet=rs0
# IP to bind the process to
BIND_IP=<your IP>
# URL used to access your Rocket.Chat instance
ROOT_URL=<your URL>
# Port Rocket.Chat runs on (in-container)
PORT=3000
# Port on the host to bind to
HOST_PORT=3000
# Added this in response to the warning of variable not set
DEPLOY_PLATFORM=selfhosted

### MongoDB configuration
# MongoDB version/image tag
MONGODB_RELEASE=8.2-ubi8
# See:- https://hub.docker.com/r/mongodb/mongodb-community-server
MONGODB_VERSION=8.2-ubi8


# Pull images.
$ cd <compose dir>
$ docker compose pull


# Stop (not down). Stop preserves networks and volumes.
$ cd <compose dir>
$ docker compose stop


# remove old Rocketchat container only (part of regular Rocketchat upgrade procedure, not part of mongoDB upgrade)
$ docker rm rocketchat-rocketchat-1
rocketchat-rocketchat-1


# Set file permissions for Mongodb community server.
$ ls -lhn /<host dir>/rocketchat/
drwxrwxr-x+ 3 1001   0 4.0K Nov 12  2022 mongodb_data
$ sudo chown -R 999:992 /<host dir>/mongodb_data/
$ sudo chmod -R 755 /<host dir>>/mongodb_data/



## Configure v8.x mongodb community server ##


# Up. (note RC container will fail to connect to DB. continue with following steps to configure DB.
$ cd <compose dir>
$ docker compose up -d


# Check replica set status (should be not enable at this stage)
$ docker exec -it rocketchat-mongodb-1 mongosh --eval 'rs.status()'
MongoServerError: no replset config has been received


# enable replica and verify
$ docker exec -it rocketchat-mongodb-1 mongosh --eval 'rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "mongodb:27017" }] })'
"mongodb:27017" }] })'
{
  ok: 1,
  ...
$ docker exec -it rocketchat-mongodb-1 mongosh --eval 'rs.status()'
...
  members: [
  ...
      stateStr: 'PRIMARY',
...
  ok: 1,


# stop and re-up.
$ docker compose up -d


# confirm compatibilty version set to 8.x
$ docker exec -i rocketchat-mongodb-1 mongosh --eval "db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )"
...
  featureCompatibilityVersion: { version: '8.2' },
  ok: 1,
...



## Restore DB from backup ##

# Stop Rocketchat container to avoid DB conflicts/corruption.
$ docker compose stop rocketchat-rocketchat-1


# Copy DB backup dump into container and dry run restore
$ docker cp ~/backup/rocketchat-v7-20260118.raw rocketchat-mongodb-1:/tmp/full.raw      # copy into container
$ docker exec rocketchat-mongodb-1 mongorestore --archive=/tmp/full.raw --dryRun --verbose | tail -20     # dry run


# Restore database
$ docker exec rocketchat-mongodb-1 mongorestore --archive=/tmp/full.raw --nsInclude=rocketchat.* --drop
...
2026-01-18T00:21:33.981+0000	19613 document(s) restored successfully. 0 document(s) failed to restore.


# Restart Rocketchat & mongoDB
$ docker compose up -d


# Confirm versions
Rocketchat GUI > admin > workspace	*refresh*
Verify expected Rocketchat and MongoDB versions.


# Cleanup backup dump from within mongodb container
$ docker exec -u 0 -it rocketchat-mongodb-1 rm /tmp/full.raw