0

I am running both my staging and production environments on the same DigitalOcean Ubuntu box. I have everything working so that each environment can be deployed to its own directory, run a separate unicorn process with separate pid files, and nginx is configured with separate sites-enabled files to associate each of those unicorn instances with its proper environment.

My deploy process properly (re)starts unicorn for the matching environment. The problem is when I need to restart the box itself, in which my /etc/init.d/unicorn is only configured to launch for production. I'm not sure what I need to do to make both production and staging launch at startup, shy of creating secondary /etc/init.d/unicorn-staging and /etc/default/unicorn-staging files.

Here are my existing files for reference.

/etc/init.d/unicorn

#!/bin/sh
### BEGIN INIT INFO
# Provides:          unicorn
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: unicorn initscript
# Description:       unicorn
### END INIT INFO

set -e
NAME=unicorn
DESC="Unicorn web server"

. /lib/lsb/init-functions

if [ -f /etc/default/unicorn ]; then
  . /etc/default/unicorn
fi

PID=${PID-/run/unicorn.pid}

run_by_init() {
    ([ "${previous-}" ] && [ "${runlevel-}" ]) || [ "${runlevel-}" = S ]
}

exit_with_message() {
  if ! run_by_init; then
    log_action_msg "$1 Not starting."
  fi
  exit 0
}

check_config() {
  if [ $CONFIGURED != "yes" ]; then
    exit_with_message "Unicorn is not configured (see /etc/default/unicorn)."
  fi
}

check_app_root() {
  if ! [ -d $APP_ROOT ]; then
    exit_with_message "Application directory $APP_ROOT is not exist."
  fi
}

set -u

case "$1" in
  start)
        check_config
        check_app_root

        log_daemon_msg "Starting $DESC" $NAME || true
        if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
          ;;
  stop)
        log_daemon_msg "Stopping $DESC" $NAME || true
        if start-stop-daemon --stop --signal QUIT --quiet --oknodo --pidfile $PID; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
        ;;
  force-stop)
        log_daemon_msg "Forcing stop of $DESC" $NAME || true
        if start-stop-daemon --stop --quiet --oknodo --pidfile $PID; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
        ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" $NAME || true
        start-stop-daemon --stop --quiet --oknodo --pidfile $PID
        sleep 1
        if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
        ;;
  reload)
        log_daemon_msg "Reloading $DESC" $NAME || true
        if start-stop-daemon --stop --signal HUP --quiet --oknodo --pidfile $PID; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
        ;;
  reopen-logs)
        log_daemon_msg "Relopening log files of $DESC" $NAME || true
        if start-stop-daemon --stop --signal USR1 --quiet --oknodo --pidfile $PID; then
          log_end_msg 0 || true
        else
          log_end_msg 1 || true
        fi
        ;;
  status)
        status_of_proc -p $PID $DAEMON $NAME && exit 0 || exit $?
        ;;
  *)
        log_action_msg "Usage: $0 <start|stop|restart|force-reload|reload|force-stop|reopen-logs|status>" || true
        exit 1
        ;;
esac

/etc/default/unicorn

# Change paramentres below to appropriate values and set CONFIGURED to yes.
CONFIGURED=yes

# Default timeout until child process is killed during server upgrade,
# it has *no* relation to option "timeout" in server's config.rb.
TIMEOUT=60

# Path to your web application, sh'ld be also set in server's config.rb,
# option "working_directory". Rack's config.ru is located here.
APP_ROOT=/var/www/example.com/current

# Server's config.rb, it's not a rack's config.ru
CONFIG_RB=/var/www/example.com/current/config/unicorn.rb

# Where to store PID, sh'ld be also set in server's config.rb, option "pid".
PID=/var/www/coderfit.com/shared/tmp/pids/unicorn.pid
UNICORN_OPTS="-D -c $CONFIG_RB -E production"

PATH=/usr/local/rvm/rubies/ruby-2.2.0/bin:/var/www/example.com/shared/bundle/ruby/2.2.0/bin:/usr/local/sbin:/usr/bin:/bin:/sbin:$
export GEM_HOME=/usr/local/rvm/gems/ruby-2.2.0@example
export GEM_PATH=/var/www/example.com/shared/bundle/ruby/2.2.0:/usr/local/rvm/gems/ruby-2.2.0@example:/usr/local/rvm/gems/ruby-2.2.0@global
DAEMON=/var/www/example.com/shared/bundle/ruby/2.2.0/bin/unicorn
1

You can copy /etc/init.d/unicorn into /etc/init.d/unicorn_app2.

Edit unicorn_app2 file:

  • Change /etc/default/unicorn into /etc/default/unicorn_app2
  • Change /run/unicorn.pid into /run/unicorn_app2.pid

Copy /etc/default/unicorn into /etc/default/unicorn_app2

Edit /etc/default/unicorn_app2 to setup your second app

Run new server service unicorn_app2 start, also setup your nginx/apache for second app (with new pid file)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.