Instantly share code, notes, and snippets.

Embed
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

This comment has been minimized.

Copy link

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

@miclovich

This comment has been minimized.

Copy link

miclovich commented Feb 24, 2016

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

@jeveloper

This comment has been minimized.

Copy link

jeveloper commented Feb 29, 2016

@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

This comment has been minimized.

Copy link

xolar commented Mar 9, 2016

Cheers!

@matt212

This comment has been minimized.

Copy link

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

@joepie91

This comment has been minimized.

Copy link

joepie91 commented Jun 22, 2016

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

This comment has been minimized.

Copy link

VLZH commented Jun 24, 2016

Thanks!)

@droidmanspace

This comment has been minimized.

Copy link

droidmanspace commented Jan 6, 2018

thanks

@aniqi

This comment has been minimized.

Copy link

aniqi commented Jan 25, 2018

perfectly!

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