• Stars
    star
    403
  • Rank 107,140 (Top 3 %)
  • Language
    Ruby
  • License
    MIT License
  • Created about 13 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Capistrano integration for Unicorn! - NEEDS MAINTAINER

Capistrano Unicorn

Capistrano plugin that integrates Unicorn tasks into capistrano deployment script.

Developers: Please consider contributing your forked changes, or opening an issue if there is no existing relevant one. There are a lot of forks--we'd love to reabsorb some of the issues/solutions the community has encountered.

Build Status Gem Version Code Climate

Usage

If you are upgrading from a previous version, please see the NEWS file.

Setup

Add the library to your Gemfile:

group :development do
  gem 'capistrano-unicorn', :require => false
end

And load it into your deployment script config/deploy.rb:

require 'capistrano-unicorn'

Add unicorn restart task hook:

after 'deploy:restart', 'unicorn:reload'    # app IS NOT preloaded
after 'deploy:restart', 'unicorn:restart'   # app preloaded
after 'deploy:restart', 'unicorn:duplicate' # before_fork hook implemented (zero downtime deployments)

Create a new configuration file config/unicorn.rb or config/unicorn/STAGE.rb, where stage is your deployment environment.

Example config - examples/rails3.rb. Please refer to Unicorn documentation for more examples and configuration options.

Deploy

First, make sure you're running the latest release:

cap deploy

Then you can test each individual task:

cap unicorn:start
cap unicorn:stop
cap unicorn:reload

Configuration

You can modify any of the following Capistrano variables in your deploy.rb config. You can use the unicorn:show_vars task to check that the values you have specified are set correctly.

Environment parameters

  • unicorn_env - Set basename of unicorn config .rb file to be used loaded from unicorn_config_path. Defaults to rails_env variable if set, otherwise production.
  • unicorn_rack_env - Set the value which will be passed to unicorn via the -E parameter as the Rack environment. Valid values are development, deployment, and none. Defaults to development if rails_env is development, otherwise deployment.

Execution parameters

  • unicorn_user - Launch unicorn master as the specified user via sudo. Defaults to nil, which means no use of sudo, i.e. run as the user defined by the user variable.
  • unicorn_roles - Define which roles to perform unicorn recipes on. Defaults to :app.
  • unicorn_bundle - Set bundler command for unicorn. Defaults to bundle.
  • unicorn_bin - Set unicorn executable file. Defaults to unicorn.
  • unicorn_options - Set any additional options to be passed to unicorn on startup.
  • unicorn_restart_sleep_time - Number of seconds to wait for (old) pidfile to show up when restarting unicorn. Defaults to 2.

Relative path parameters

  • app_subdir - If your app lives in a subdirectory 'rails' (say) of your repository, set this to /rails (the leading slash is required).
  • unicorn_config_rel_path - Set the directory path (relative to app_path - see below) where unicorn config files reside. Defaults to config.
  • unicorn_config_filename - Set the filename of the unicorn config file loaded from unicorn_config_path. Should not be present in multistage installations. Defaults to unicorn.rb.

Absolute path parameters

  • app_path - Set path to app root. Defaults to current_path + app_subdir.
  • unicorn_pid - Set unicorn PID file path. By default, attempts to auto-detect from unicorn config file. On failure, falls back to value in unicorn_default_pid
  • unicorn_default_pid - See above. Defaults to #{current_path}/tmp/pids/unicorn.pid
  • bundle_gemfile - Set path to Gemfile. Defaults to #{app_path}/Gemfile
  • unicorn_config_path - Set the directory where unicorn config files reside. Defaults to #{current_path}/config.

Zero Downtime Deployment Options

  • unicorn:restart: πŸ‘Ž This can sort of support it with a configurable timeout, which may not be reliable.
  • unicorn:reload: ❓ Can anyone testify to its zero-downtime support?
  • unicorn:duplicate: πŸ‘ If you install the Unicorn before_fork hook, then yes! See: #40 (comment)

Available Tasks

To get a list of all capistrano tasks, run cap -T:

cap unicorn:add_worker                # Add a new worker
cap unicorn:remove_worker             # Remove amount of workers
cap unicorn:reload                    # Reload Unicorn
cap unicorn:restart                   # Restart Unicorn
cap unicorn:show_vars                 # Debug Unicorn variables
cap unicorn:shutdown                  # Immediately shutdown Unicorn
cap unicorn:start                     # Start Unicorn master process
cap unicorn:stop                      # Stop Unicorn

Tests

To execute test suite run:

bundle exec rake test

Multistage

The issue here is that capistrano loads default configuration and then executes your staging task and overrides previously defined variables. The default environment before executing your stage task is set to :production, so it will use a wrong environment unless you take steps to ensure that :rails_env and :unicorn_env are set correctly.

Let's say you have a scenario involving two deployment stages: staging and production. You’ll need to add config/deploy/staging.rb and config/deploy/production.rb files. However, it makes sense to adhere to DRY and avoid duplicating lines between the two files. So it would be nicer to keep common settings in config/deploy.rb, and only put stuff in each staging definition file which is really specific to that staging environment. Fortunately this can be done using the lazy evaluation form of set.

So config/deploy.rb file would contain something like:

set :stages, %w(production staging)
set :default_stage, "staging"
require 'capistrano/ext/multistage'

set(:unicorn_env) { rails_env }

role(:web) { domain }
role(:app) { domain }
role(:db, :primary => true) { domain }

set(:deploy_to)    { "/home/#{user}/#{application}/#{fetch :rails_env}" }
set(:current_path) { File.join(deploy_to, current_dir) }

Then config/deploy/production.rb would contain something like:

set :domain,      "app.mydomain.com"
set :rails_env,   "production"

and config/deploy/staging.rb would only need to contain something like:

set :domain,      "app.staging.mydomain.com"
set :rails_env,   "staging"

Nice and clean!

License

See LICENSE file for details.

More Repositories

1

pgweb

Cross-platform client for PostgreSQL databases
Go
8,042
star
2

gitkit

Git toolkit for Go: Smart HTTP server, SSH server, hook receiver
Go
260
star
3

goodreads

Goodreads API wrapper
Ruby
240
star
4

lunchy-go

OSX Launch Manager
Go
180
star
5

opentable

Unofficial OpenTable API
Ruby
147
star
6

grooveshark

Grooveshark.com unofficial API library
Ruby
123
star
7

slack-notify

Slack.com notifier
Ruby
94
star
8

musicbot

Play music from Slack: Raspberry Pi + Mopidy + Spotify
Go
93
star
9

lxc-ruby

Linux containers (LXC) ruby wrapper
Ruby
89
star
10

xml-sitemap

Easy XML sitemap generation for Ruby/Rails/Merb/Sinatra applications
Ruby
56
star
11

munin-ruby

Munin node client for Ruby
Ruby
41
star
12

omxremote

Web frontend and API for Raspberry Pi omxplayer media player
Go
38
star
13

ansible-vault-go

Go package to interact with Ansible Vault files
Go
37
star
14

wireguard-aws-gateway

Wireguard VPN gateway or AWS
HCL
29
star
15

mail_extract

Strip email message body from quotes and signatures
Ruby
25
star
16

net-ssh-session

Shell session for Net::SSH connections
Ruby
25
star
17

travis-github

Travis CI builds tab in Github
JavaScript
24
star
18

cloudwatchlogs

Web interface for AWS CloudWatch Logs
Go
23
star
19

rackspace-clouddns

Rackspace CloudDNS Ruby Wrapper
Ruby
20
star
20

github-events

Listen to Github repository events in real time
Go
18
star
21

shuttle

Minimalistic deployment tool
Ruby
17
star
22

heroku-vegeta

Using Heroku as a distributed stress-testing platform
Go
16
star
23

nginx2influxdb

Stream Nginx logs directly into InfluxDB
Go
14
star
24

rack-revision

Rack middleware for add code revision header X-REVISION
Ruby
14
star
25

pastie

Simplified API to Pastie.org
Ruby
12
star
26

markup-editor

Web-based markup editor with on-the-fly preview
JavaScript
12
star
27

app-config

Flexible and simple in-application settings for Rails/Sinatra applications
Ruby
11
star
28

docker-router

Reverse proxy for docker containers with automatic SSL
Go
11
star
29

envd

Serve application environment variables over HTTP
Go
11
star
30

bundle_cache

Cache bundle to Amazon S3
Go
10
star
31

docify

Render your favorite markup (RDoc, Markdown, Textile) into nice-looking html.
Ruby
10
star
32

apple_push

Sinatra-based API to send Apple Push Notifications
Ruby
10
star
33

proxie

HTTP proxy server with sqlite-powered storage and web interface for debugging.
Ruby
9
star
34

lxc-server

Web API for LXC container management
Ruby
9
star
35

cxml

Ruby implementation of cXML communication protocol
Ruby
9
star
36

fakemail

Sendmail replacement to debug email output, layouts, etc.
Ruby
8
star
37

hipache-api

HTTP interface for Hipache
Go
8
star
38

munin-plugins

Some useful munin plugins
Ruby
8
star
39

wg-registry

User and device self-service portal for WireGuard
Go
8
star
40

unfuddle-cli

Console-based tool to manage Unfuddle repositories
Ruby
8
star
41

cron2

Cron2 is cron scheduler on steroids: HCL, Docker, Logs, Notifications, Etc
Go
7
star
42

grit-http

Sinatra based API for Git repositories, powered by Grit
Ruby
7
star
43

zeroconf-beacon

Spawn a simple zeroconf service over the local network
Go
7
star
44

lxc-tools

Set of tools to work with LXC containers
Ruby
6
star
45

xtract

Simple data extraction tool
Go
6
star
46

go-craigslist

Craigslist.org wrapper for Go
HTML
6
star
47

snatch

Remote database downloader based on SSH
Ruby
6
star
48

docker-gateway

Stupid simple reverse proxy for Docker
Go
6
star
49

rack-norris

X-Chuck-Norris header with a joke in your Rack app!
Ruby
5
star
50

reeder

Experimental RSS reader
CSS
5
star
51

actions

Repo for Github Actions
Shell
4
star
52

howdy

Experimental YAML-based service monitoring thingy.
Go
4
star
53

unfuddle-services

Sinatra based hook server for Unfuddle. Similar to github-services.
Ruby
3
star
54

rscale

Image scaling wrapper based on ImageMagick console utils
Ruby
3
star
55

dep-cache

Parallel dependency cache helper for running in CI environments
Go
3
star
56

gitvault

Your personal git hosting
Ruby
3
star
57

arduino-rc-receiver

Script to troubleshoot RC receiver with Arduino
Arduino
3
star
58

dotfiles

Development environment configuration, scripts, etc
Ruby
3
star
59

shelly

Remote bash runner over HTTP
Go
2
star
60

debugserver

Debugging server for any console-less applications
Ruby
2
star
61

munin-dashboard

Sinatra based API and GUI for munin nodes
Ruby
2
star
62

ws

Websocket debugging tool
Go
2
star
63

spellcheck

Text spellcheck/correction based on Redis key-value storage server
Ruby
2
star
64

capistrano-payload

Capistrano plugin that delivers JSON payload to the specified URL
Ruby
2
star
65

dependenci

Client for http://dependenci.com
Ruby
2
star
66

irc2pusher

Send IRC messages to a Pusher channel
2
star
67

sqlembed

Parse out *.sql files and embed the queries as consts
Go
2
star
68

app-detective

Detect application type
Ruby
2
star
69

debugclient-php

DebugServer PHP client library
PHP
2
star
70

crash_hook

Exception notifications via HTTP
Ruby
2
star
71

terminal_helpers

Various helpers for console-based applications
Ruby
2
star
72

fpm-builder

Helpers for building packages with fpm
Shell
1
star
73

git-branches

A small tool to show current status of the git repository
Go
1
star
74

arrow_payments

ArrowPayments gateway for Ruby
Ruby
1
star
75

crash_server

Simple web application for crash_hook
Ruby
1
star
76

docker-sandbox

Docker quickstart and playground
1
star
77

git-handler

Control git flow
Ruby
1
star
78

server-configs

Set of various server configs and scripts
1
star
79

bootstrap_navigation

Navigation helper for bootstap html/css framework
Ruby
1
star
80

reckless

Ruby client to Chicago's records store Reckless.com
Ruby
1
star
81

helm-wireguard

Wireguard Helm Chart
Go
1
star
82

docker-http-proxy

Go
1
star
83

shuttle-go

Shuttle is a minimalisting application deployment tool
Go
1
star
84

heroku-addon

Heroku Addon SDK for Go
Go
1
star
85

dummy-service

This a service dummy for random testing
Ruby
1
star
86

dockerfiles

Collection of Dockerfiles
Shell
1
star