Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Run Node.js App as Ubuntu Upstart Service

###The Issue With Forever Forever is great for running node services, with a minor setback: the word "forever" doesn't apply to system reboots.

###The solution, run node apps as a system service logged in as root

vim /etc/init/node-app.conf

Contents for node-app.conf

start on filesystem and started networking
respawn
chdir /home/deploy/node-app  #deployment directory
env NODE_ENV=production
env PORT=3000
exec /usr/local/bin/node server/cluster.js  #start command - no forever needed, if it fails, the service restarts

SUCCESS! Now the app runs on reboot! You can also control the app as a service

service node-app start #node-app is filename of service.conf file
service node-app stop
service node-app restart #run this one command on deploy to either start | restart the service

###So how does my deploy script change? Run visudo to give deploy user permission to run only the node service without a password

echo "deploy ALL=(root) NOPASSWD: /sbin/restart node-app" >> /etc/sudoers
#this can be edited later by running visudo as root user

Now, run this with your deploy script as your deploy user

sudo restart node-app

EvanK commented Oct 31, 2014

This is nice!

Adding console log to the upstart conf will also enable logging of stdout/stderr to /var/log/upstart/$JOBNAME.log

Is this working for Ubuntu 15.04 (and the systemd) for anyone else?

@miclovich Its very different , different commands and an extra step to make it boot up together with system so no i wouldn't recommend touching ubuntu 15.04 if you aren't ready for different system configuration. Also 15 is not an LTS version.

Here is a cheatsheet for SystemD
http://linoxide.com/linux-command/systemd-vs-sysvinit-cheatsheet/

xolar commented Mar 9, 2016

Cheers!

matt212 commented Mar 15, 2016

Hi,
I have below code in my app.js file
http.createServer(app).listen(config.port, config.address, function() {
console.log("Express server listening on %s:%d in %s mode", config.address, config.port, app.settings.env);
});
How can i allocated different ports from above script and run multiple instance on different ports

This Gist is DANGEROUS.

If you use this Gist as-is, it will run your application as root, which is a serious security issue. You will want to use setuid to run it under a limited user (you can use the adduser command to create one), like demonstrated in this post.

VLZH commented Jun 24, 2016

Thanks!)

thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment