cfogelberg
cfogelberg

Reputation: 1488

How do I generate upstart and monit configuration files using a common spec or meta-configuration?

I'm deploying a node web application as an upstart service using grunt and monitoring it using monit. However:

  1. My upstart and monit configuration duplicate each other a little bit
  2. Upstart doesn't do variable expansion inside env stanzas
  3. I can't find a way to configure monit dynamically (ala upstart .override files)

My question

This means I'm looking for a grunt plugin or other tool that I can use to generate the uptstart .conf and monit conf.d/ files. Can you please help me find one (or suggest a better way of robustly running my node web app)?

A rather crude solution?

To be honest an underscore template of the upstart and monit files would probably be sufficient, and that's what I'll wrap up into a grunt plugin if there isn't a ready-made solution, but this feels like a problem that other people must have run into as well so I imagine there's a solution out there, I just can't find it.

Detail

A bit more detail to illustrate the three problems. My upstart conf file looks like this:

setuid node
setgid node

# ...

script
    mkdir -p /home/node/.my-app
    echo $$ > /home/node/.my-app/upstart.pid
    /usr/local/bin/node /var/node/my-app/server.js >> /var/node/my-app/logs/console.log 2>&1
end script

# ...

And my monit configuration looks like this:

check process node with pidfile /home/node/.my-app/upstart.pid
    start program = "/sbin/start my-app" with timeout 60 seconds
    stop program  = "/sbin/stop my-app"
    if failed host localhost port 17394 protocol http 
        and request "/monit.html"
        then restart
    if 3 restarts within 5 cycles then timeout

As you can see, the PID file path and config directory is duplicated across the two (problem 1) and I'd love to parameterise the host, port and request URL in the monit file (problem 3).

For problem 2 (no variable expansion in upstart's env stanza, bug report here) there are a couple of workarounds that work for variables used inside *script blocks, which are interpreted as bash scripts, but they don't seem to work in the conf file itself. I think this makes it impossible to specify the user id the app should run as in a configuration file?

Those techniques I just mentioned:

Upvotes: 1

Views: 2521

Answers (1)

aludvigsen
aludvigsen

Reputation: 5981

...or suggest a better way of robustly running my node web app

Use PM2 by Unitech instead.

I run all my node apps using PM2. It works perfectly and is easy to configure. It has built-in functionality for autogenerating of startup script. It gives you logging, monitoring and easy maintenance.

Here is a good article showing off the highlights.

Install

npm install -g pm2

Start app

pm2 start app.js

Show running apps

pm2 list

Make a startup script

pm2 startup [ubuntu|centos|systemd]

More details in the readme on their github page

Upvotes: 3

Related Questions