capistrano-unicorn-nginx 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 758cd1020049cc4d33a1539020d9a70c6c941f4d
4
- data.tar.gz: 9a03ad07a95c3b03e88242d86c00126002cce252
3
+ metadata.gz: d07f364efb0a3c692f5a90e291944f3039f0a0a0
4
+ data.tar.gz: 261aa7183d26027881a31024196e536f478f59d2
5
5
  SHA512:
6
- metadata.gz: dd12187184bb0853faf8b88e9ce7130bf0955cc0e9f51dc0dbace706ffcad472f05a51a8100d27f278b5bb934e99b4052a3e4ebd9309b79966b66c7047bdf005
7
- data.tar.gz: 2ef806960ca72c9ff39c7b7c3d80cf697b8f0f23ba7a9053540eb2287f782a630966c363e2af7ab1b8bc00956354e25b6ba276382081df93cc2c15a484eeb10e
6
+ metadata.gz: 1afb2f016b9c6859c722daacc25ab981959dc87834da8d0a76f2add162587d3afaabff5ce3d7230446c43df74ba98a7cf0ceb5a5499310ff5975cbe46e562166
7
+ data.tar.gz: e0cd00708bb708bcedd7412b82c448815f6ef49702552ed5523e9a307a353a37cc3c71c0aa021196ad57f2e783f6f71234864755f7bae54061ca7b76f789b11c
data/CHANGELOG.md CHANGED
@@ -2,17 +2,27 @@
2
2
 
3
3
  ### master
4
4
 
5
+ ### v3.0.0, 2014-10-05
6
+ - enable setting unicorn app environment with `rails_env` option.
7
+ If `rails_env` is not set, `stage` option is used as until now. (@bruno-)
8
+ - add load balancing support (@rhomeister)
9
+ - config files are updated each time `setup` task is run (@rhomeister)
10
+
5
11
  ### v2.1.0, 2014-08-05
6
12
  - add `nginx_location` option that specifies nginx installation dir
7
13
  (@jordanyaker)
14
+
8
15
  ### v2.0.0, 2014-04-11
9
16
  - all the work is moved to the `setup` task
17
+
10
18
  ### v1.0.2, 2014-03-30
11
19
  - add `sudo_upload!` helper method for easier uploads
12
20
  - improve the way how templates are handled
21
+
13
22
  ### v1.0.1, 2014-03-30
14
23
  - refactor all unicorn and nginx paths to separate modules
15
24
  - speed up `nginx:setup_ssl` task
16
25
  - small README update
26
+
17
27
  ### v1.0.0, 2014-03-29
18
28
  - @bruno- all the v1.0.0 features
data/README.md CHANGED
@@ -7,30 +7,26 @@ Goals of this plugin:
7
7
  * automatic unicorn and nginx configuration for Rails apps
8
8
  * **no manual ssh** to the server required
9
9
  * zero downtime deployments enabled
10
+ * support for single node as well as cluster deployments
10
11
 
11
12
  Specifics:
12
13
 
13
- * generates nginx config file on the server
14
- * generates unicorn initializer and config files<br/>
14
+ * generates nginx config file on the server (web role)
15
+ * generates unicorn initializer and config files (app role)<br/>
15
16
  application is started automatically after server restart
16
17
  * capistrano tasks for server management, example: `unicorn:restart`<br/>
17
18
  see below for all available tasks
19
+ * automatic load balancing setup when there are multiple `app` nodes
18
20
 
19
21
  `capistrano-unicorn-nginx` works only with Capistrano 3!
20
22
 
21
- This project was based on
22
- [capistrano-nginx-unicorn](https://github.com/kalys/capistrano-nginx-unicorn).
23
- I contributed a lot to Capistrano 3 version of that plugin. In the end I
24
- decided to create my own project to bring in additional improvements, without
25
- having to ask for permissions and wait for merging.
26
-
27
23
  ### Installation
28
24
 
29
25
  Add this to `Gemfile`:
30
26
 
31
27
  group :development do
32
- gem 'capistrano', '~> 3.1'
33
- gem 'capistrano-unicorn-nginx', '~> 2.0'
28
+ gem 'capistrano', '~> 3.2.1'
29
+ gem 'capistrano-unicorn-nginx', '~> 3.0.0'
34
30
  end
35
31
 
36
32
  And then:
@@ -39,169 +35,38 @@ And then:
39
35
 
40
36
  ### Setup and usage
41
37
 
42
- Add this line to `Capfile`
43
-
44
- require 'capistrano/unicorn_nginx'
45
-
46
- Only if you already have a domain for your app, set `nginx_server_name` in
47
- stage file, example `config/deploy/production.rb`:
48
-
49
- set :nginx_server_name, 'mydomain.com'
50
-
51
- If you don't have a domain yet, you do not have to do anything
52
- (`nginx_server_name` will use the default value - server IP).
53
-
54
- **SSL only setup**
55
-
56
- If you want to setup SSL for your page, add these options to stage file
57
- (i.e. `config/deploy/production.rb`):
58
-
59
- # ignore this if you do not need SSL
60
- set :nginx_use_ssl, true
61
- set :nginx_ssl_cert_local_path, "/path/to/ssl_cert.crt"
62
- set :nginx_ssl_cert_key_local_path, "/path/to/ssl_cert.key"
63
-
64
- And you're all set!
65
-
66
- **Setup task**
67
-
68
- Make sure the `deploy_to` path exists and has the right privileges on the
69
- server (i.e. `/var/www/myapp`).<br/>
70
- Or just install
71
- [capistrano-safe-deploy-to](https://github.com/bruno-/capistrano-safe-deploy-to)
72
- plugin and don't think about it.
38
+ Depending on your needs 2 general scenarios are covered:
73
39
 
74
- To setup the server for unicorn and nginx, run:
75
-
76
- $ bundle exec cap production setup
40
+ - [single server setup](https://github.com/capistrano-plugins/capistrano-unicorn-nginx/wiki/Single-server-setup)<br/>
41
+ A scenario where you run the webserver (nginx) and application server
42
+ (unicorn) on the same node.
43
+ - [multiple server setup](https://github.com/capistrano-plugins/capistrano-unicorn-nginx/wiki/Multiple-server-setup)<br/>
44
+ Webserver (nginx) and application server (unicorn) run on different nodes.
77
45
 
78
46
  ### Configuration
79
47
 
80
- As described in the Usage section, this plugin works with minimal setup.
81
- However, configuration is possible.
82
-
83
- You'll find the options and their defaults below.
84
-
85
- In order to override the default, put the option in the stage file, for example:
86
-
87
- # in config/deploy/production.rb
88
- set :unicorn_workers, 4
89
-
90
- **Nginx options**
91
-
92
- Defaults are listed near option name in the first line.
93
-
94
- - `set :nginx_server_name` # defaults to <server_IP><br/>
95
- Your application's domain. The default is your server's IP address.
96
-
97
- - `set :nginx_pid, "/run/nginx.pid"`<br/>
98
- Path for nginx process pid file.
99
-
100
- - `set :nginx_location, "/etc/nginx"`<br/>
101
- Nginx installation directory.
102
-
103
- SSL related options:
104
-
105
- - `set :nginx_use_ssl, false`<br/>
106
- If set to `true`, nginx will be configured to 443 port and port 80 will be auto
107
- routed to 443. Also, on `nginx:setup`, paths to ssl certificate and key will be
108
- configured. Certificate file and key will be uploaded to `/etc/ssl/certs/`
109
- and `/etc/ssl/private/` directories on the server.
110
-
111
- - `set :nginx_upload_local_cert, true`<br/>
112
- If `true`, certificates will be uploaded from a local path. Otherwise, it
113
- is expected for the certificate and key defined in the next 2 variables to be
114
- already on the server.
115
-
116
- - `set :nginx_ssl_cert, "#{fetch(:nginx_server_name)}.crt"`<br/>
117
- Remote file name of the certificate. Only makes sense if `nginx_use_ssl` is set.
118
-
119
- - `set :nginx_ssl_cert_key, "#{fetch(:nginx_server_name)}.key"`<br/>
120
- Remote file name of the certificate. Only makes sense if `nginx_use_ssl` is set.
121
-
122
- - `set :nginx_ssl_cert_local_path` # no default, required if
123
- `nginx_use_ssl = true` and `nginx_upload_local_cert = true`<br/>
124
- Local path to file with certificate. Only makes sense if `nginx_use_ssl` is
125
- set. This file will be copied to remote server. Example value:
126
- `set :nginx_ssl_cert_local_path, "/home/user/ssl/myssl.cert"`
127
-
128
- - `set :nginx_ssl_cert_key_local_path` # no default<br/>
129
- Local path to file with certificate key. Only makes sense if `nginx_use_ssl` is set.
130
- This file will be copied to remote server. Example value:
131
- `set :nginx_ssl_cert_key_local_path, "/home/user/ssl/myssl.key"`
132
-
133
- **Unicorn options**
134
-
135
- Defaults are listed near option name in the first line.
136
-
137
- - `set :unicorn_service, "unicorn_#{fetch(:application)}_#{fetch(:stage)}`<br/>
138
- Unicorn service name is `unicorn_myapp_production` by default.
139
-
140
- - `set :unicorn_pid, shared_path.join("tmp/pids/unicorn.pid")`<br/>
141
- Path for unicorn process pid file.
142
-
143
- - `set :unicorn_config, shared_path.join("config/unicorn.rb")`<br/>
144
- Path for unicorn config file.
145
-
146
- - `set :unicorn_workers, 2`<br/>
147
- Number of unicorn workers.
48
+ See the
49
+ [full options list on the wiki page](https://github.com/capistrano-plugins/capistrano-unicorn-nginx/wiki/Configuration).
50
+ Feel free to skip this unless you're looking for something specific.
148
51
 
149
52
  ### How it works
150
53
 
151
- Here's what happens when you run `$ bundle exec cap production setup`:
54
+ [How it works wiki page](https://github.com/capistrano-plugins/capistrano-unicorn-nginx/wiki/How-it-works)
55
+ contains the list of tasks that the plugin executes.
152
56
 
153
- **Nginx**
154
-
155
- - `nginx:setup`<br/>
156
- Generates and uploads nginx config file. Symlinks config file to
157
- `/etc/nginx/sites-enabled`.
158
- - `nginx:setup_ssl`<br/>
159
- Performs SSL related tasks if `nginx_use_ssl` is true (false by default).
160
-
161
- **Unicorn**
162
-
163
- - `unicorn:setup_initializer`<br/>
164
- Uploads unicorn initializer file.
165
- - `unicorn:setup_app_config`<br/>
166
- Generates unicorn application config file
167
-
168
- **Capistrano `deploy` task**
169
-
170
- This plugin also integrates seamlessly with Capistrano `deploy` task.
171
- Here's what happens when you run `$ bundle exec cap production deploy`:
172
-
173
- - `after :publishing, "nginx:reload"`<br/>
174
- Reloads nginx.
175
- - `after :publishing, "unicorn:restart"`<br/>
176
- Restarts unicorn after new release.
57
+ You do not have to know this unless you want to learn more about the plugin internals.
177
58
 
178
59
  ### Template customization
179
60
 
180
- If you want to change default templates, you can generate them using
181
- `rails generator`:
182
-
183
- $ bundle exec rails g capistrano:unicorn_nginx:config
184
-
185
- This will copy default templates to `config/deploy/templates` directory, so you
186
- can customize them as you like, and capistrano tasks will use this templates
187
- instead of default.
61
+ [On template customization wiki page](https://github.com/capistrano-plugins/capistrano-unicorn-nginx/wiki/Template-customization)
62
+ see how to inspect, tweak and override templates for `nginx` and `unicorn`
63
+ config files.
188
64
 
189
- You can also provide path, where to generate templates:
190
-
191
- $ bundle exec rails g capistrano:unicorn_nginx:config config/templates
65
+ Do not do this unless you have a specific need.
192
66
 
193
67
  ### More Capistrano automation?
194
68
 
195
- If you'd like to streamline your Capistrano deploys, you might want to check
196
- these zero-configuration, plug-n-play plugins:
197
-
198
- - [capistrano-postgresql](https://github.com/bruno-/capistrano-postgresql)<br/>
199
- plugin that automates postgresql configuration and setup
200
- - [capistrano-rbenv-install](https://github.com/bruno-/capistrano-rbenv-install)<br/>
201
- would you like Capistrano to install rubies for you?
202
- - [capistrano-safe-deploy-to](https://github.com/bruno-/capistrano-safe-deploy-to)<br/>
203
- if you're annoyed that Capistrano does **not** create a deployment path for the
204
- app on the server (default `/var/www/myapp`), this is what you need!
69
+ Check out [capistrano-plugins](https://github.com/capistrano-plugins) github org.
205
70
 
206
71
  ### Bug reports and pull requests
207
72
 
@@ -31,10 +31,27 @@ namespace :nginx do
31
31
  end
32
32
  end
33
33
 
34
+ # this is needed when the web role is a non release role -> deploy directories are not created, and nginx log files
35
+ # are written to "#{deploy_path}/shared/log/"
36
+ desc "Create the nginx log directory"
37
+ task :create_log_dir do
38
+ on roles :web do
39
+ # create the deploy_to, shared_path and the directory in which the nginx_access_log_file resides.
40
+ # We need to be conservative and ensure that all are created with the correct ownership: it could happen that
41
+ # web does become a release role later, in which case the ownerships need to be correct.
42
+ [deploy_path, shared_path, File.dirname(nginx_access_log_file)].each do |dir|
43
+ next if file_exists? dir
44
+ sudo :mkdir, '-pv', dir
45
+ user = capture :id, '-un'
46
+ group = capture :id, '-gn'
47
+ sudo :chown, "#{user}:#{group}", dir
48
+ end
49
+ end
50
+ end
51
+
34
52
  desc 'Setup nginx configuration'
35
- task :setup do
53
+ task setup: [:create_log_dir] do
36
54
  on roles :web do
37
- next if file_exists? nginx_sites_available_file
38
55
  sudo_upload! template('nginx_conf.erb'), nginx_sites_available_file
39
56
  sudo :ln, '-fs', nginx_sites_available_file, nginx_sites_enabled_file
40
57
  end
@@ -11,6 +11,9 @@ namespace :load do
11
11
  set :unicorn_pid, -> { unicorn_default_pid_file }
12
12
  set :unicorn_config, -> { unicorn_default_config_file }
13
13
  set :unicorn_workers, 2
14
+ set :unicorn_tcp_listen_port, 8080
15
+ set :unicorn_use_tcp, -> { roles(:app).count > 1} # use tcp if there are multiple app nodes
16
+ set :unicorn_app_env, -> { fetch(:rails_env) || fetch(:stage) }
14
17
  # set :unicorn_user # default set in `unicorn:defaults` task
15
18
 
16
19
  set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids')
@@ -28,7 +31,6 @@ namespace :unicorn do
28
31
  desc 'Setup Unicorn initializer'
29
32
  task :setup_initializer do
30
33
  on roles :app do
31
- next if file_exists? unicorn_initd_file
32
34
  sudo_upload! template('unicorn_init.erb'), unicorn_initd_file
33
35
  execute :chmod, '+x', unicorn_initd_file
34
36
  sudo 'update-rc.d', '-f', fetch(:unicorn_service), 'defaults'
@@ -38,7 +40,6 @@ namespace :unicorn do
38
40
  desc 'Setup Unicorn app configuration'
39
41
  task :setup_app_config do
40
42
  on roles :app do
41
- next if file_exists? fetch(:unicorn_config)
42
43
  execute :mkdir, '-pv', File.dirname(fetch(:unicorn_config))
43
44
  upload! template('unicorn.rb.erb'), fetch(:unicorn_config)
44
45
  end
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module UnicornNginx
3
- VERSION = "2.1.0"
3
+ VERSION = "3.0.0"
4
4
  end
5
5
  end
@@ -1,5 +1,11 @@
1
1
  upstream unicorn_<%= fetch(:nginx_config_name) %> {
2
+ <% if fetch(:unicorn_use_tcp) %>
3
+ <% roles(:app).each do |role| %>
4
+ server <%= role.hostname %>:<%= fetch(:unicorn_tcp_listen_port)%> fail_timeout=0;
5
+ <% end %>
6
+ <% else %>
2
7
  server unix:/tmp/unicorn.<%= fetch(:nginx_config_name) %>.sock fail_timeout=0;
8
+ <% end %>
3
9
  }
4
10
 
5
11
  <% if fetch(:nginx_use_ssl) %>
@@ -3,7 +3,12 @@ pid "<%= fetch(:unicorn_pid) %>"
3
3
  stdout_path "<%= unicorn_log_file %>"
4
4
  stderr_path "<%= unicorn_error_log_file %>"
5
5
 
6
+ <% if fetch(:unicorn_use_tcp) %>
7
+ listen <%= fetch(:unicorn_tcp_listen_port) %>
8
+ <% else %>
6
9
  listen "/tmp/unicorn.<%= fetch(:nginx_config_name) %>.sock"
10
+ <% end %>
11
+
7
12
  worker_processes <%= fetch(:unicorn_workers) %>
8
13
  timeout 30
9
14
 
@@ -15,9 +15,9 @@ TIMEOUT=${TIMEOUT-60}
15
15
  APP_ROOT=<%= current_path %>
16
16
  PID=<%= fetch(:unicorn_pid) %>
17
17
 
18
- CMD="cd $APP_ROOT && <%= bundle_unicorn("-D -c", fetch(:unicorn_config), "-E", fetch(:stage)) %>"
19
-
20
18
  AS_USER=<%= fetch(:unicorn_user) %>
19
+ CMD="export HOME; true "${HOME:=$(getent passwd "$AS_USER" | cut -d: -f6;)}" ; cd $APP_ROOT && <%= bundle_unicorn("-D -c", fetch(:unicorn_config), "-E", fetch(:unicorn_app_env)) %>"
20
+
21
21
  set -u
22
22
 
23
23
  OLD_PIN="$PID.oldbin"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-unicorn-nginx
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruno Sutic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-05 00:00:00.000000000 Z
11
+ date: 2014-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capistrano