Search code examples
node.jsubuntuupstartstrongloop

Nodejs/Strongloop: working upstart config example


After update strongloop to v2.10 slc stops writing logs. Also I couldn't make the app to start in production mode.

/etc/init/app.conf

#!upstart
description "StrongLoop app"

start on startup
stop on shutdown

env NODE_ENV=production

script
        exec slc run /home/ubuntu/app/ \
                -l /home/ubuntu/app/app.log \
                -p /var/run/app.pid
end script

Can anybody check my upstart config or provide another working copy?


Solution

  • Are you were writing the pid to a file so that you can use it to send SIGUSR2 to the process to trigger log re-opening from logrotate?

    Assuming you are using Upstart 1.4+ (Ubuntu 12.04 or newer), then you would be better off letting slc run log to its stdout and let Upstart take care of writing it to a file so that log rotation is done for you:

    #!upstart
    description "StrongLoop app"
    
    start on startup
    stop on shutdown
    
    # assuming this is /etc/init/app.conf,
    # stdout+stderr logged to: /var/log/upstart/app.log
    console log
    
    env NODE_ENV=production
    
    exec /usr/local/bin/slc run --cluster=CPUs /home/ubuntu/app
    

    The log rotation for "free" is nice, but the biggest benefit to this approach is Upstart can log errors that slc run reports even if they are a crash while trying to set up its internal logging, which makes debugging a lot easier.

    Aside from what it means to your actual application, the only effect NODE_ENV has on slc run is to set the default number of cluster workers to the number of detected CPU cores, which literally translates to --cluster=CPUs.

    Another problem I find is the node/npm path prefix not being in the $PATH as used by Upstart, so I normally put the full paths for executables in my Upstart jobs.

    Service Installer

    You could also try using strong-service-install, which is a module used by slc pm-install to install strong-pm as an OS service:

    $ npm install -g strong-service-install
    $ sudo sl-svc-install --name app --user ubuntu --cwd /home/ubuntu/app -- slc run --cluster=CPUs .
    

    Note the spaces around the -- before slc run