diff --git a/_posts/2025-12-18-how-to-upgrade-a-mongodb-container.md b/_posts/2025-12-18-how-to-upgrade-a-mongodb-container.md new file mode 100644 index 0000000..0df13a7 --- /dev/null +++ b/_posts/2025-12-18-how-to-upgrade-a-mongodb-container.md @@ -0,0 +1,180 @@ +--- +layout: post +author: Sam Hadow +tags: podman, mongodb, containers +--- + +On my server I self host Overleaf with containers (podman) and Overleaf requires MongoDB as a database. Each version of Overleaf has a minimum required version of MongoDB and therefore you might have to upgrade your MongoDB container at one point. I'll explain step by step how I did it in my case. + +# Upgrade steps + +As stated in the official [documentation](https://docs.overleaf.com/on-premises/maintenance/updating-mongodb), MongoDB requires step by step upgrades. +The intermediary version when upgrading (starting from version 4.0) are: +4.0, 4.2, 4.4, 5.0, 6.0, 7.0, 8.0 + +In my case I had to upgrade from version 6.0 to version 8.0 + +I now have the following in my Mongodb systemd unit managing the container: + +```ini +[Unit] +Description=Podman container-overleaf-mongo.service +Documentation=man:podman-generate-systemd(1) +Wants=network-online.target +After=network-online.target +RequiresMountsFor=%t/containers +BindsTo=pod-overleaf.service +After=pod-overleaf.service + +[Service] +Environment=PODMAN_SYSTEMD_UNIT=%n +Restart=on-failure +TimeoutStopSec=70 +ExecStart=/usr/bin/podman run \ + --cidfile=%t/%n.ctr-id \ + --cgroups=no-conmon \ + --rm \ + --pod-id-file %t/pod-overleaf.pod-id \ + --sdnotify=conmon \ + --replace \ + -d \ + -e MONGO_INITDB_DATABASE=sharelatex \ + -v /home/data/podman/overleaf/mongo_data:/data/db:Z \ + -v /home/data/podman/overleaf/initdb.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js:z \ + --name overleaf-mongo \ + "--health-cmd=echo \"db.stats().ok\" | mongosh localhost:27017/test --quiet" \ + --health-interval=10s \ + --health-timeout=10s \ + --health-retries=5 \ + docker.io/library/mongo:8.0 \ + --replSet overleaf +ExecStop=/usr/bin/podman stop \ + --ignore -t 10 \ + --cidfile=%t/%n.ctr-id +ExecStopPost=/usr/bin/podman rm \ + -f \ + --ignore -t 10 \ + --cidfile=%t/%n.ctr-id +Type=notify +NotifyAccess=all + +[Install] +WantedBy=default.target +``` + +The important line is: +``` + docker.io/library/mongo:8.0 \ +``` +Where MongoDB version is stated, originally it was 6.0. +When upgrading you need to follow these steps: ++ bring the container down ++ change the systemd unit with the next release and reload systemd daemons ++ bring the container up ++ set feature compatibility in MongoDB to the version you upgraded to ++ repeat until you upgraded to the desired version + +With commands it gives the following: +```bash +systemctl --user stop container-overleaf-mongo.service # then change the unit file +systemctl --user daemon-reload +systemctl --user start container-overleaf-mongo.service +podman exec -it overleaf-mongo mongosh --eval 'db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })' # to see which version the feature compatibility is currently set to +podman exec -it overleaf-mongo mongosh --eval 'db.adminCommand({ setFeatureCompatibilityVersion: "7.0", confirm: true })' # to set the feature compatibility to another version (here 7.0) +``` +Then I had to repeat the same steps to upgrade from 7.0 to 8.0. + + +## Command outputs + +Here are example outputs when running with `podman exec` commands in a MongoDB container: + +### 1. Getting MongoDB version (not the feature compatibility, only the version of MongoDB) + +Command: + +```bash +podman exec overleaf-mongo mongod --version +``` +Output: + +```js +db version v7.0.26 +Build Info: { + "version": "7.0.26", + "gitVersion": "715b3bbc6c34cecc42ffc77ef77d24f71e240e94", + "openSSLVersion": "OpenSSL 3.0.2 15 Mar 2022", + "modules": [], + "allocator": "tcmalloc", + "environment": { + "distmod": "ubuntu2204", + "distarch": "x86_64", + "target_arch": "x86_64" + } +} +``` +In this case the major version is 7.0. + +### 2. Getting feature compatibility version + +Command: + +```bash +podman exec -it overleaf-mongo mongosh --eval 'db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })' +``` +Output: + +```js +{ + featureCompatibilityVersion: { version: '6.0' }, + ok: 1, + '$clusterTime': { + clusterTime: Timestamp({ t: 1763739555, i: 108 }), + signature: { + hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), + keyId: Long('0') + } + }, + operationTime: Timestamp({ t: 1763739555, i: 108 }) +} +``` +Here we can see that the feature compatibility version is 6.0 (even though MongoDB was at version 7.0). + +### 3. Upgrading feature compatibility version + +If we simply run: + +```bash +podman exec -it overleaf-mongo mongosh --eval 'db.adminCommand({ setFeatureCompatibilityVersion: "7.0" })' +``` +Then MongoDB gives us this warning (downgrades are not possible): + +``` +MongoServerError: Once you have upgraded to 7.0, you will not be able to downgrade FCV and binary version without support assistance. Please re-run this command with 'confirm: true' to acknowledge this and continue with the FCV upgrade. +``` + +If we indeed want to upgrade we need to run this command: + +```bash +podman exec -it overleaf-mongo mongosh --eval 'db.adminCommand({ setFeatureCompatibilityVersion: "7.0", confirm: true })' +``` + +And we should get an ouput like this: + +```js +{ + ok: 1, + '$clusterTime': { + clusterTime: Timestamp({ t: 1763739614, i: 2 }), + signature: { + hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), + keyId: Long('0') + } + }, + operationTime: Timestamp({ t: 1763739614, i: 2 }) +} +``` + + + +