diff --git a/server-ce/config/settings.js b/server-ce/config/settings.js index c686a019f6..3b2bf91ab3 100644 --- a/server-ce/config/settings.js +++ b/server-ce/config/settings.js @@ -188,6 +188,8 @@ const settings = { // Add https:// protocol prefix if not set (Allow plain-text http:// for Server Pro/CE). (process.env.OVERLEAF_STATUS_PAGE_URL.startsWith('http://') || process.env.OVERLEAF_STATUS_PAGE_URL.startsWith('https://')) ? process.env.OVERLEAF_STATUS_PAGE_URL : `https://${process.env.OVERLEAF_STATUS_PAGE_URL}` : undefined, + maintenanceMessage: process.env.OVERLEAF_MAINTENANCE_MESSAGE, + maintenanceMessageHTML: process.env.OVERLEAF_MAINTENANCE_MESSAGE_HTML, // The name this is used to describe your Overleaf Community Edition Installation appName: process.env.OVERLEAF_APP_NAME || 'Overleaf Community Edition', diff --git a/services/web/app/src/Features/Errors/HttpErrorHandler.js b/services/web/app/src/Features/Errors/HttpErrorHandler.js index 0908a1b3e2..e90d2491e9 100644 --- a/services/web/app/src/Features/Errors/HttpErrorHandler.js +++ b/services/web/app/src/Features/Errors/HttpErrorHandler.js @@ -144,9 +144,12 @@ module.exports = HttpErrorHandler = { } else { res.status(503) } - let message = `${Settings.appName} is currently down for maintenance.` - if (Settings.statusPageUrl) { - message += ` Please check ${Settings.statusPageUrl} for updates.` + let message = Settings.maintenanceMessage + if (!message) { + message = `${Settings.appName} is currently down for maintenance.` + if (Settings.statusPageUrl) { + message += ` Please check ${Settings.statusPageUrl} for updates.` + } } switch (req.accepts(['html', 'json'])) { case 'html': diff --git a/services/web/app/views/general/closed.pug b/services/web/app/views/general/closed.pug index 5725e35ea6..3bb8df8230 100644 --- a/services/web/app/views/general/closed.pug +++ b/services/web/app/views/general/closed.pug @@ -8,7 +8,11 @@ block content .page-header h1 Maintenance p - if settings.statusPageUrl + if settings.maintenanceMessageHTML + | !{settings.maintenanceMessageHTML} + else if settings.maintenanceMessage + | #{settings.maintenanceMessage} + else if settings.statusPageUrl | #{settings.appName} is currently down for maintenance. | Please check our #[a(href=settings.statusPageUrl target='_blank') status page] | for updates. diff --git a/services/web/test/acceptance/src/CloseSiteTests.mjs b/services/web/test/acceptance/src/CloseSiteTests.mjs index 62a6461441..0037e16f67 100644 --- a/services/web/test/acceptance/src/CloseSiteTests.mjs +++ b/services/web/test/acceptance/src/CloseSiteTests.mjs @@ -15,6 +15,11 @@ import Settings from '@overleaf/settings' import request from './helpers/request.js' describe('siteIsOpen', function () { + afterEach(function () { + delete Settings.maintenanceMessage + delete Settings.maintenanceMessageHTML + }) + describe('when siteIsOpen is default (true)', function () { it('should get page', function (done) { return request.get('/login', (error, response, body) => { @@ -41,6 +46,29 @@ describe('siteIsOpen', function () { }) }) + it('should return a custom message on maintenance page', function (done) { + const message = `Hello world (${Math.random()})` + Settings.maintenanceMessage = message + request.get('/login', (error, response, body) => { + response.statusCode.should.equal(503) + body.should.contain(message) + done() + }) + }) + + it('should return a custom HTML message on maintenance page', function (done) { + const message = `Hello world (${Math.random()})` + const messageHTML = `
Hello world (${Math.random()})
` + Settings.maintenanceMessage = message + Settings.maintenanceMessageHTML = messageHTML + request.get('/login', (error, response, body) => { + response.statusCode.should.equal(503) + body.should.not.contain(message) + body.should.contain(messageHTML) + done() + }) + }) + it('should return a plain text message for a json request', function (done) { request.get('/some/route', { json: true }, (error, response, body) => { response.statusCode.should.equal(503) @@ -50,6 +78,18 @@ describe('siteIsOpen', function () { }) }) + it('should return a custom message for a json request', function (done) { + const message = `Hello world (${Math.random()})` + const messageHTML = `Hello world (${Math.random()})
` + Settings.maintenanceMessage = message + Settings.maintenanceMessageHTML = messageHTML + request.get('/some/route', { json: true }, (error, response, body) => { + response.statusCode.should.equal(503) + body.message.should.equal(message) + done() + }) + }) + it('should return a 200 on / for load balancer health checks', function (done) { request.get('/', (error, response, body) => { response.statusCode.should.equal(200)