Permalink
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 }) | |
}); | |
}); | |
}); | |
} |