--- a/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs +++ b/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs @@ -7,6 +7,7 @@ import { const { ObjectId } = mongodb const MIN_MONGO_VERSION = [6, 0] +const MIN_MONGO_FEATURE_COMPATIBILITY_VERSION = [6, 0] async function main() { let mongoClient @@ -18,6 +19,7 @@ async function main() { } await checkMongoVersion(mongoClient) + await checkFeatureCompatibilityVersion(mongoClient) try { await testTransactions(mongoClient) @@ -53,6 +55,41 @@ async function checkMongoVersion(mongoClient) { } } +async function checkFeatureCompatibilityVersion(mongoClient) { + const { + featureCompatibilityVersion: { version }, + } = await mongoClient + .db() + .admin() + .command({ getParameter: 1, featureCompatibilityVersion: 1 }) + const [major, minor] = version.split('.').map(v => parseInt(v)) + const [minMajor, minMinor] = MIN_MONGO_FEATURE_COMPATIBILITY_VERSION + + if (major < minMajor || (major === minMajor && minor < minMinor)) { + const minVersion = MIN_MONGO_FEATURE_COMPATIBILITY_VERSION.join('.') + console.error(` +The MongoDB server has featureCompatibilityVersion=${version}, but Overleaf requires at least version ${minVersion}. + +Open a mongo shell: +- Overleaf Toolkit deployments: $ bin/mongo +- Legacy docker-compose.yml deployments: $ docker exec -it mongo mongosh localhost/sharelatex + +In the mongo shell: +> db.adminCommand( { setFeatureCompatibilityVersion: "${minMajor}.${minMinor}" } ) + +Verify the new value: +> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ) + ... + { + featureCompatibilityVersion: { version: ${minMajor}.${minMinor}' }, +... + +Aborting. +`) + process.exit(1) + } +} + main() .then(() => { console.error('Mongodb is up.')