diff --git a/package.json b/package.json index 42a3621225..5756d77ef8 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,10 @@ }, "scripts": { "start": "babel-node server/server.js", + "prestart-production": "bower cache clean && bower install && gulp build", + "start-production": "node pm2Start", "lint": "eslint --ext=.js,.jsx .", - "test": "mocha", - "postinstall": "bower cache clean && bower install && gulp build" + "test": "mocha" }, "license": "BSD-3-Clause", "contributors": [ diff --git a/pm2Start.js b/pm2Start.js index 6689e2d616..57b3bbc68e 100644 --- a/pm2Start.js +++ b/pm2Start.js @@ -2,7 +2,7 @@ var pm2 = require('pm2'); pm2.connect(function() { pm2.start({ name: 'server', - script: 'server/server.js', + script: 'server/production-start.js', 'exec_mode': 'cluster', instances: '2', 'max_memory_restart': '900M' diff --git a/server/debug-entry.js b/server/debug-entry.js index f0a88e9337..0d04431c3e 100644 --- a/server/debug-entry.js +++ b/server/debug-entry.js @@ -1,4 +1,5 @@ +// use this file with runners like node-debug +// or mocha. require('babel/register'); var app = require('./server'); - app.start(); diff --git a/server/production-start.js b/server/production-start.js new file mode 100644 index 0000000000..79fbab6f54 --- /dev/null +++ b/server/production-start.js @@ -0,0 +1,31 @@ +// this ensures node understands the future +require('babel/register'); + +var startTime = Date.now(); +var timeoutHandler; +// this is where server starts booting up +var app = require('./server'); +console.log('waiting for db to connect'); + + +var onConnect = function() { + console.log('db connected in %s ms', Date.now() - startTime); + if (timeoutHandler) { + clearTimeout(timeoutHandler); + } + app.start(); +}; + +var timeoutHandler = setTimeout(function() { + var message = + 'db did not after ' + + (Date.now() - startTime) + + ' ms connect crashing hard'; + + console.log(message); + // purposely shutdown server + // pm2 should restart this in production + throw new Error(message); +}, 5000); + +app.dataSources.db.on('connected', onConnect); diff --git a/server/server.js b/server/server.js index 34c686ec9f..070ab1b620 100755 --- a/server/server.js +++ b/server/server.js @@ -2,8 +2,7 @@ require('dotenv').load(); var pmx = require('pmx'); pmx.init(); -var R = require('ramda'), - assign = require('lodash').assign, +var assign = require('lodash').assign, loopback = require('loopback'), boot = require('loopback-boot'), accepts = require('accepts'), @@ -199,7 +198,6 @@ app.use( }) ); -var startTime = Date.now(); boot(app, { appRootDir: __dirname, dev: process.env.NODE_ENV @@ -249,7 +247,7 @@ var passportOptions = { } }; -R.keys(passportProviders).map(function(strategy) { +Object.keys(passportProviders).map(function(strategy) { var config = passportProviders[strategy]; config.session = config.session !== false; passportConfigurator.configureProvider( @@ -310,8 +308,6 @@ if (process.env.NODE_ENV === 'development') { }); } -module.exports = app; - app.start = function() { app.listen(app.get('port'), function() { app.emit('started'); @@ -323,34 +319,12 @@ app.start = function() { }); }; +module.exports = app; + // start the server if `$ node server.js` +// in production use `$npm start-production` +// or `$node server/production` to start the server +// and wait for DB handshake if (require.main === module) { - if (process.env.NODE_ENV === 'production') { - var timeoutHandler; - console.log('waiting for db to connect'); - - var onConnect = function() { - console.log('db connected in %s ms', Date.now() - startTime); - if (timeoutHandler) { - clearTimeout(timeoutHandler); - } - app.start(); - }; - - var timeoutHandler = setTimeout(function() { - var message = - 'db did not after ' + - (Date.now() - startTime) + - ' ms connect crashing hard'; - - console.log(message); - // purposely shutdown server - // pm2 should restart this in production - throw new Error(message); - }, 5000); - - app.dataSources.db.on('connected', onConnect); - } else { - app.start(); - } + app.start(); }