blog post overleaf
This commit is contained in:
180
_posts/2025-12-18-how-to-upgrade-a-mongodb-container.md
Normal file
180
_posts/2025-12-18-how-to-upgrade-a-mongodb-container.md
Normal file
@@ -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 })
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user