check-mongodb.mjs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import mongodb from 'mongodb-legacy'
  2. import {
  3. connectionPromise,
  4. db,
  5. } from '../../../app/src/infrastructure/mongodb.js'
  6. const { ObjectId } = mongodb
  7. const MIN_MONGO_VERSION = [6, 0]
  8. const MIN_MONGO_FEATURE_COMPATIBILITY_VERSION = [6, 0]
  9. async function main() {
  10. let mongoClient
  11. try {
  12. mongoClient = await connectionPromise
  13. } catch (err) {
  14. console.error('Cannot connect to mongodb')
  15. throw err
  16. }
  17. await checkMongoVersion(mongoClient)
  18. await checkFeatureCompatibilityVersion(mongoClient)
  19. try {
  20. await testTransactions(mongoClient)
  21. } catch (err) {
  22. console.error("Mongo instance doesn't support transactions")
  23. throw err
  24. }
  25. }
  26. async function testTransactions(mongoClient) {
  27. const session = mongoClient.startSession()
  28. try {
  29. await session.withTransaction(async () => {
  30. await db.users.findOne({ _id: new ObjectId() }, { session })
  31. })
  32. } finally {
  33. await session.endSession()
  34. }
  35. }
  36. async function checkMongoVersion(mongoClient) {
  37. const buildInfo = await mongoClient.db().admin().buildInfo()
  38. const [major, minor] = buildInfo.versionArray
  39. const [minMajor, minMinor] = MIN_MONGO_VERSION
  40. if (major < minMajor || (major === minMajor && minor < minMinor)) {
  41. const version = buildInfo.version
  42. const minVersion = MIN_MONGO_VERSION.join('.')
  43. console.error(
  44. `The MongoDB server has version ${version}, but Overleaf requires at least version ${minVersion}. Aborting.`
  45. )
  46. process.exit(1)
  47. }
  48. }
  49. async function checkFeatureCompatibilityVersion(mongoClient) {
  50. const {
  51. featureCompatibilityVersion: { version },
  52. } = await mongoClient
  53. .db()
  54. .admin()
  55. .command({ getParameter: 1, featureCompatibilityVersion: 1 })
  56. const [major, minor] = version.split('.').map(v => parseInt(v))
  57. const [minMajor, minMinor] = MIN_MONGO_FEATURE_COMPATIBILITY_VERSION
  58. if (major < minMajor || (major === minMajor && minor < minMinor)) {
  59. const minVersion = MIN_MONGO_FEATURE_COMPATIBILITY_VERSION.join('.')
  60. console.error(`
  61. The MongoDB server has featureCompatibilityVersion=${version}, but Overleaf requires at least version ${minVersion}.
  62. Open a mongo shell:
  63. - Overleaf Toolkit deployments: $ bin/mongo
  64. - Legacy docker-compose.yml deployments: $ docker exec -it mongo mongosh localhost/sharelatex
  65. In the mongo shell:
  66. > db.adminCommand( { setFeatureCompatibilityVersion: "${minMajor}.${minMinor}" } )
  67. Verify the new value:
  68. > db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
  69. ...
  70. {
  71. featureCompatibilityVersion: { version: ${minMajor}.${minMinor}' },
  72. ...
  73. Aborting.
  74. `)
  75. process.exit(1)
  76. }
  77. }
  78. main()
  79. .then(() => {
  80. console.error('Mongodb is up.')
  81. process.exit(0)
  82. })
  83. .catch(err => {
  84. console.error(err)
  85. process.exit(1)
  86. })