Files
NodeBB/src/webserver.js

169 lines
4.5 KiB
JavaScript
Raw Normal View History

'use strict';
var path = require('path'),
fs = require('fs'),
2014-01-04 18:05:15 -05:00
nconf = require('nconf'),
express = require('express'),
WebServer = express(),
2014-01-04 18:05:15 -05:00
server,
winston = require('winston'),
async = require('async'),
2014-03-13 00:49:32 -04:00
emailer = require('./emailer'),
meta = require('./meta'),
logger = require('./logger'),
plugins = require('./plugins'),
middleware = require('./middleware'),
routes = require('./routes'),
emitter = require('./emitter'),
2015-01-07 16:18:38 -05:00
helpers = require('./../public/src/modules/helpers'),
net;
2013-05-02 15:57:43 -04:00
2014-01-04 18:05:15 -05:00
if(nconf.get('ssl')) {
server = require('https').createServer({
key: fs.readFileSync(nconf.get('ssl').key),
2014-01-04 18:09:43 -05:00
cert: fs.readFileSync(nconf.get('ssl').cert)
2014-01-04 18:05:15 -05:00
}, WebServer);
} else {
server = require('http').createServer(WebServer);
}
2013-09-23 12:50:27 -04:00
(function (app) {
2014-11-29 22:03:49 -05:00
var port = nconf.get('port');
2013-08-23 13:14:36 -04:00
module.exports.init = function() {
emailer.registerApp(app);
// Preparation dependent on plugins
plugins.ready(function() {
async.parallel([
async.apply(!nconf.get('from-file') ? meta.js.minify : meta.js.getFromFile, app.enabled('minification')),
async.apply(!nconf.get('from-file') ? meta.css.minify : meta.css.getFromFile),
async.apply(meta.sounds.init)
]);
});
middleware = middleware(app);
routes(app, middleware);
2015-01-07 16:18:38 -05:00
// Load server-side template helpers
helpers.register();
// Cache static files on production
if (global.env !== 'development') {
app.enable('cache');
app.enable('minification');
// Configure cache-buster timestamp
require('child_process').exec('git describe --tags', {
cwd: path.join(__dirname, '../')
}, function(err, stdOut) {
if (!err) {
meta.config['cache-buster'] = stdOut.trim();
} else {
fs.stat(path.join(__dirname, '../package.json'), function(err, stats) {
meta.config['cache-buster'] = new Date(stats.mtime).getTime();
});
}
});
}
2013-04-22 16:51:32 +00:00
if (port !== 80 && port !== 443 && nconf.get('use_port') === false) {
winston.info('Enabling \'trust proxy\'');
app.enable('trust proxy');
}
if ((port === 80 || port === 443) && process.env.NODE_ENV !== 'development') {
winston.info('Using ports 80 and 443 is not recommend; use a proxy instead. See README.md');
}
};
2014-11-14 15:19:26 -05:00
server.on('error', function(err) {
winston.error(err.stack);
console.log(err.stack);
if (err.code === 'EADDRINUSE') {
winston.error('NodeBB address in use, exiting...');
process.exit(0);
2014-11-14 15:19:26 -05:00
} else {
throw err;
}
});
module.exports.server = server;
2014-11-14 15:31:45 -05:00
emitter.all(['templates:compiled', 'meta:js.compiled', 'meta:css.compiled'], function() {
winston.info('NodeBB Ready');
emitter.emit('nodebb:ready');
});
2014-08-25 11:56:48 -04:00
2014-12-04 14:29:44 -05:00
server.setTimeout(10000);
module.exports.listen = function(callback) {
logger.init(app);
2014-12-09 10:26:55 -05:00
var isSocket = isNaN(port),
args = isSocket ? [port] : [port, nconf.get('bind_address')],
bind_address = ((nconf.get('bind_address') === "0.0.0.0" || !nconf.get('bind_address')) ? '0.0.0.0' : nconf.get('bind_address')) + ':' + port,
oldUmask;
2014-12-09 10:26:55 -05:00
args.push(function(err) {
2014-11-14 15:19:26 -05:00
if (err) {
winston.info('[startup] NodeBB was unable to listen on: ' + bind_address);
2014-11-14 15:19:26 -05:00
return callback(err);
}
2014-12-09 10:26:55 -05:00
winston.info('NodeBB is now listening on: ' + (isSocket ? port : bind_address));
if (oldUmask) {
process.umask(oldUmask);
}
2014-11-14 15:19:26 -05:00
callback();
});
2014-12-09 10:26:55 -05:00
// Alter umask if necessary
if (isSocket) {
oldUmask = process.umask('0000');
net = require('net');
module.exports.testSocket(port, function(err) {
if (!err) {
server.listen.apply(server, args);
} else {
winston.error('[startup] NodeBB was unable to secure domain socket access (' + port + ')');
winston.error('[startup] ' + err.message);
process.exit();
}
});
} else {
server.listen.apply(server, args);
}
};
module.exports.testSocket = function(socketPath, callback) {
async.series([
function(next) {
fs.exists(socketPath, function(exists) {
if (exists) {
next();
} else {
callback();
}
});
},
function(next) {
var testSocket = new net.Socket();
testSocket.on('error', function(err) {
next(err.code !== 'ECONNREFUSED' ? err : null);
});
testSocket.connect({ path: socketPath }, function() {
// Something's listening here, abort
callback(new Error('port-in-use'));
});
},
async.apply(fs.unlink, socketPath), // The socket was stale, kick it out of the way
], callback);
2013-11-11 13:25:54 -05:00
};
2013-04-22 16:51:32 +00:00
}(WebServer));