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
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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 })
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
}
 |