freeCodeCamp/pm2Start.js
Berkeley Martinez 169c82acfc Add emailing on server exceptions
Keymetrics VC's are coming. They no longer let you see reported
errors or notify you on their free tier which renders the service
useless for us.

This will emailing you using mandrill with a stack trace and
context of the error when it receives it
2016-01-24 22:27:45 -08:00

82 lines
2.0 KiB
JavaScript

require('dotenv').load();
var pm2 = require('pm2');
var nodemailer = require('nodemailer');
var moment = require('moment-timezone');
var _ = require('lodash');
var instances = process.env.INSTANCES || 1;
var serverName = process.env.SERVER_NAME || 'server';
var maxMemory = process.env.MAX_MEMORY || '390M';
var transportOptions = {
type: 'smtp',
service: 'Mandrill',
auth: {
user: process.env.MANDRILL_USER || false,
pass: process.env.MANDRILL_PASSWORD
}
};
var mailReceiver = process.env.MAIL_RECEIVER || false;
pm2.connect(function() {
pm2.start({
name: serverName,
script: 'server/production-start.js',
'exec_mode': 'cluster',
instances: instances,
'max_memory_restart': maxMemory,
'NODE_ENV': 'production'
}, function() {
console.log(
'pm2 started %s with %s instances at %s max memory',
serverName,
instances,
maxMemory
);
pm2.disconnect();
});
});
if (transportOptions.auth.user && mailReceiver) {
console.log('setting up mailer');
var transporter = nodemailer.createTransport(transportOptions);
var compiled = _.template(
'An error has occurred on server ' +
'<% name %>\n' +
'Stack Trace:\n\n\n<%= stack %>\n\n\n' +
'Context:\n\n<%= text %>'
);
pm2.launchBus(function(err, bus) {
if (err) {
return console.error(err);
}
console.log('event bus connected');
bus.on('process:exception', function(data) {
var text;
var stack;
var name;
try {
data.date = moment(data.at || new Date())
.tz('America/Los_Angeles')
.format('MMMM Do YYYY, h:mm:ss a z');
text = JSON.stringify(data, null, 2);
stack = data.data.stack;
name = data.process.name;
} catch (e) {
return e;
}
transporter.sendMail({
to: mailReceiver,
from: 'team@freecodecamp.com',
subject: 'Server exception',
text: compiled({ name: name, text: text, stack: stack })
});
});
});
}