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