diff --git a/Dockerfile b/Dockerfile
index 5d60121f9e598fe062dea363855fce2f82ca89e6..a42e8d17cab08a002b5e72f0ea368fa6be69fe44 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,11 @@
 FROM node:20
 
 RUN apt-get update && \ 
-    apt-get install -y ranger vim
+    apt-get install -y imagemagick potrace ghostscript ranger vim
+
+RUN sed -i.bak 's/rights="none" pattern="PS"/rights="read | write" pattern="PS"/g' /etc/ImageMagick-6/policy.xml
+RUN sed -i.bak 's/rights="none" pattern="EPS"/rights="read | write" pattern="EPS"/g' /etc/ImageMagick-6/policy.xml
+
 
 RUN corepack enable
 
diff --git a/dev/scripts/setupDevServer.sh b/dev/scripts/setupDevServer.sh
index 421d784cd590c8020ee7aca9e90cdf691baeea2b..24c7719de8d047829d959d62f1fcc1af827cf9b5 100644
--- a/dev/scripts/setupDevServer.sh
+++ b/dev/scripts/setupDevServer.sh
@@ -1,8 +1,8 @@
 #!/bin/sh
-set -x
+# set -x
 
 # This is run through docker. Its CWD will be the root folder.
-node ./dev/scripts/ensureTempFolderExists.js
+# node ./dev/scripts/ensureTempFolderExists.js
 # node ./dev/scripts/seedAdmin.js
 
 exec "$@"
diff --git a/src/dbManager/migrate.js b/src/dbManager/migrate.js
index 193c386f251125415e2e36007b3be706ec809e50..1a242f11e7c5c6226d43014ee7ba648ffae52c1c 100644
--- a/src/dbManager/migrate.js
+++ b/src/dbManager/migrate.js
@@ -230,7 +230,7 @@ const updateCheckpoint = async () => {
  * apply (the creation of the meta table, ie. from the moment they upgraded to
  * coko server v4).
  */
-const migrate = async options => {
+const migrate = async (options = {}) => {
   const threshold = await getMetaCreatedAsUnixTimestamp()
   const umzug = getUmzug(threshold)
 
diff --git a/src/index.js b/src/index.js
index 3e75070b5da460d2b5b07f75fb76913753553930..dca4318f638c3f752f0d30f06b5f6dada9d18b7f 100644
--- a/src/index.js
+++ b/src/index.js
@@ -17,6 +17,7 @@ const app = require('./app')
 const startServer = require('./startServer')
 const { BaseModel, useTransaction } = require('./models')
 const modelTypes = require('./models/_helpers/types')
+const tempFolderPath = require('./utils/tempFolderPath')
 
 const {
   healthCheck,
@@ -76,6 +77,7 @@ module.exports = {
   createTables,
   useTransaction,
   isEnvVariableTrue,
+  tempFolderPath,
 
   cron,
   uuid,
diff --git a/src/models/file/migrations/1698750314-add-full-quality-converted-object-to-storedobjects.js b/src/models/file/migrations/1698750314-add-full-quality-converted-object-to-storedobjects.js
index cf6b5f132d12f8c5d79367b6cd78f037ff342884..b075c80eac32ccdaa8fb2bed4449fcee0e3b65e2 100644
--- a/src/models/file/migrations/1698750314-add-full-quality-converted-object-to-storedobjects.js
+++ b/src/models/file/migrations/1698750314-add-full-quality-converted-object-to-storedobjects.js
@@ -6,6 +6,7 @@ const sharp = require('sharp')
 
 const useTransaction = require('../../useTransaction')
 const File = require('../file.model')
+const tempFolderPath = require('../../../utils/tempFolderPath')
 
 const {
   connectToFileStorage,
@@ -65,7 +66,7 @@ exports.up = async () => {
       await connectToFileStorage()
       const files = await File.query(trx)
 
-      const tempDir = path.join(__dirname, '..', 'temp')
+      const tempDir = tempFolderPath
       await fs.ensureDir(tempDir)
 
       await Promise.all(
@@ -77,7 +78,7 @@ exports.up = async () => {
           )
 
           if (mimetype.match(/^image\//) && !fullStoredObject) {
-            const tempFileDir = path.join(__dirname, '..', 'temp', file.id)
+            const tempFileDir = path.join(tempDir, file.id)
             await fs.ensureDir(tempFileDir)
 
             const originalStoredObject = file.storedObjects.find(
@@ -148,7 +149,7 @@ exports.up = async () => {
       )
 
       try {
-        await fs.remove(tempDir)
+        await fs.emptyDir(tempDir)
       } catch (e) {
         throw new Error(e)
       }
diff --git a/src/services/__tests__/fileStorage.service.test.js b/src/services/__tests__/fileStorage.service.test.js
index 09d7aafb7b31488928432b8b442e0121321ac266..1ff7f903cde0147ffa8db48cc78cb626ccbc8689 100644
--- a/src/services/__tests__/fileStorage.service.test.js
+++ b/src/services/__tests__/fileStorage.service.test.js
@@ -11,6 +11,7 @@ const {
 } = require('../fileStorage')
 
 const { uploadOneFile, cleanBucket } = require('./helpers/helpers')
+const tempFolderPath = require('../../utils/tempFolderPath')
 
 describe('File Storage Service', () => {
   beforeAll(async () => {
@@ -21,11 +22,9 @@ describe('File Storage Service', () => {
     cleanBucket()
   })
 
-  afterAll(() =>
-    fs.remove(
-      path.join(process.cwd(), 'src', 'services', '__tests__', 'files', 'temp'),
-    ),
-  )
+  afterAll(async () => {
+    await fs.emptyDir(tempFolderPath)
+  })
 
   it('communicates with file server', async () => {
     const fileServerHealth = await healthCheck()
@@ -166,19 +165,7 @@ describe('File Storage Service', () => {
 
   it('downloads locally the given file', async () => {
     const file = await uploadOneFile()
-    fs.ensureDir(
-      path.join(process.cwd(), 'src', 'services', '__tests__', 'files', 'temp'),
-    )
-
-    const tempPath = path.join(
-      process.cwd(),
-      'src',
-      'services',
-      '__tests__',
-      'files',
-      'temp',
-      `${file.key}`,
-    )
+    const tempPath = path.join(tempFolderPath, `${file.key}`)
 
     await download(file.key, tempPath)
     expect(fs.existsSync(tempPath)).toBe(true)
diff --git a/src/services/fileStorage.js b/src/services/fileStorage.js
index 5bf5de64a5c80c12bb2ce4a269d604ae70f92fe3..66692a53d12f0a253e82be8ac6191723483d1235 100644
--- a/src/services/fileStorage.js
+++ b/src/services/fileStorage.js
@@ -7,6 +7,7 @@ const path = require('path')
 const mime = require('mime-types')
 
 const logger = require('../logger')
+const tempFolderPath = require('../utils/tempFolderPath')
 
 const {
   getFileExtension,
@@ -18,8 +19,6 @@ const {
   emptyUndefinedOrNull,
 } = require('../helpers')
 
-const { tempFolderPath } = config.get('pubsweet-server')
-
 const imageConversionToSupportedFormatMapper = {
   eps: 'svg',
 }
@@ -27,7 +26,7 @@ const imageConversionToSupportedFormatMapper = {
 // Initializing Storage Interface
 let s3
 
-const healthCheck = () => {
+const healthCheck = async () => {
   try {
     if (!s3) {
       throw new Error(
@@ -55,7 +54,7 @@ const healthCheck = () => {
   }
 }
 
-const connectToFileStorage = () => {
+const connectToFileStorage = async () => {
   if (!config.has('fileStorage')) {
     throw new Error(
       'You have declared that you will use file storage but fileStorage configuration is missing',
@@ -112,7 +111,7 @@ const connectToFileStorage = () => {
     endpoint: serverUrl,
   })
 
-  healthCheck()
+  await healthCheck()
 }
 
 const getURL = async (objectKey, options = {}) => {
@@ -167,7 +166,7 @@ const handleImageUpload = async (fileStream, hashedFilename) => {
   try {
     const storedObjects = []
     const randomHash = crypto.randomBytes(6).toString('hex')
-    const tempDirRoot = tempFolderPath || path.join(process.cwd(), 'temp')
+    const tempDirRoot = tempFolderPath
     const tempDir = path.join(tempDirRoot, randomHash)
     let tempSmallFilePath
     let tempMediumFilePath
diff --git a/src/startServer.js b/src/startServer.js
index 43d60eccfc20249082601e0bf0310038b9fe7317..63361a4376b39928e3e6b347ac50bdc7bd85a295 100644
--- a/src/startServer.js
+++ b/src/startServer.js
@@ -9,12 +9,14 @@ const isFunction = require('lodash/isFunction')
 const logger = require('./logger')
 const { migrate } = require('./dbManager/migrate')
 const seedGlobalTeams = require('./startup/seedGlobalTeams')
+const ensureTempFolderExists = require('./startup/ensureTempFolderExists')
 
 let server
 
 const startServer = async (app = express()) => {
   if (server) return server
 
+  await ensureTempFolderExists()
   await migrate()
   await seedGlobalTeams()
 
diff --git a/src/startup/ensureTempFolderExists.js b/src/startup/ensureTempFolderExists.js
new file mode 100644
index 0000000000000000000000000000000000000000..047812a8e141aef2f6f13be3e627177ba8d28c6b
--- /dev/null
+++ b/src/startup/ensureTempFolderExists.js
@@ -0,0 +1,22 @@
+const fs = require('fs')
+
+const logger = require('../logger')
+const tempFolderPath = require('../utils/tempFolderPath')
+
+const ensureTempFolderExists = () => {
+  logger.info('Ensuring "tmp" folder exists...')
+
+  fs.stat(tempFolderPath, (err, stats) => {
+    if (err || !stats.isDirectory()) {
+      logger.info(
+        '[ensureTempFolderExists]: "tmp" folder does not exist. Creating...',
+      )
+      fs.mkdirSync(tempFolderPath)
+      logger.info('[ensureTempFolderExists]: "tmp" folder created')
+    } else {
+      logger.info('[ensureTempFolderExists]: "tmp" folder already exists')
+    }
+  })
+}
+
+module.exports = ensureTempFolderExists
diff --git a/src/utils/tempFolderPath.js b/src/utils/tempFolderPath.js
new file mode 100644
index 0000000000000000000000000000000000000000..b0898a31672f00693639bac29c4eff0315db4226
--- /dev/null
+++ b/src/utils/tempFolderPath.js
@@ -0,0 +1,5 @@
+const path = require('path')
+
+const tempFolderPath = path.join(process.cwd(), 'tmp')
+
+module.exports = tempFolderPath