Skip to content

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 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 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 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 xolar commented Mar 9, 2016

Cheers!

@matt212

This comment has been minimized.

Copy link

@matt212 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 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 VLZH commented Jun 24, 2016

Thanks!)

@droidmanspace

This comment has been minimized.

Copy link

@droidmanspace droidmanspace commented Jan 6, 2018

thanks

@aniqi

This comment has been minimized.

Copy link

@aniqi aniqi commented Jan 25, 2018

perfectly!

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