nginxinator 0.0.3 → 0.1.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.
- data/lib/nginxinator/config.rb +13 -15
- data/lib/nginxinator/examples/Capfile +27 -0
- data/lib/nginxinator/examples/config/deploy/staging.rb +50 -0
- data/lib/nginxinator/examples/config/deploy/staging_nginxinator.rb +58 -0
- data/lib/nginxinator/examples/config/deploy.rb +60 -0
- data/lib/nginxinator/examples/config/deploy_nginxinator.rb +1 -0
- data/lib/nginxinator/examples/{mime.types_example.erb → mime.types.erb} +0 -0
- data/lib/nginxinator/examples/{nginx_example.conf.erb → nginx.conf.erb} +5 -5
- data/lib/nginxinator/examples/{site-enabled_example.erb → site-enabled.erb} +6 -6
- data/lib/nginxinator/examples/{ssl.crt_example.erb → ssl.crt.erb} +0 -0
- data/lib/nginxinator/examples/{ssl.key_example.erb → ssl.key.erb} +0 -0
- data/lib/nginxinator/nginx.rb +70 -69
- data/lib/nginxinator.rb +2 -3
- metadata +28 -8
- data/lib/nginxinator/examples/nginxinator_example.rb +0 -116
data/lib/nginxinator/config.rb
CHANGED
@@ -1,23 +1,21 @@
|
|
1
|
-
namespace :
|
2
|
-
|
3
|
-
task :ensure_setup do |t, args|
|
4
|
-
@settings = NginxInstance.new
|
5
|
-
# use 'rake pg:COMMAND debug=true' for debugging (you can also add --trace if you like)
|
6
|
-
SSHKit.config.output_verbosity = Logger::DEBUG if ENV['debug'] == "true"
|
7
|
-
end
|
1
|
+
namespace :nginxinator do
|
8
2
|
|
9
3
|
desc 'Write example config files'
|
10
4
|
task :write_example_configs do
|
11
5
|
run_locally do
|
12
|
-
execute "mkdir -p templates/nginx/sites-enabled"
|
6
|
+
execute "mkdir -p config/deploy templates/nginx/sites-enabled"
|
13
7
|
{
|
14
|
-
'examples/
|
15
|
-
'examples/
|
16
|
-
'examples/
|
17
|
-
'examples/
|
18
|
-
'examples/
|
19
|
-
'examples/
|
20
|
-
'examples/
|
8
|
+
'examples/Capfile' => 'Capfile_example',
|
9
|
+
'examples/config/deploy.rb' => 'config/deploy_example.rb',
|
10
|
+
'examples/config/deploy_nginxinator.rb' => 'config/deploy_nginxinator_example.rb',
|
11
|
+
'examples/config/deploy/staging.rb' => 'config/deploy/staging_example.rb',
|
12
|
+
'examples/config/deploy/staging_nginxinator.rb' => 'config/deploy/staging_nginxinator_example.rb',
|
13
|
+
'examples/Dockerfile' => 'templates/nginx/Dockerfile_example',
|
14
|
+
'examples/nginx.conf.erb' => 'templates/nginx/nginx_example.conf.erb',
|
15
|
+
'examples/site-enabled.erb' => 'templates/nginx/sites-enabled/client-app_example.erb',
|
16
|
+
'examples/ssl.crt.erb' => 'templates/nginx/ssl.crt_example.erb',
|
17
|
+
'examples/ssl.key.erb' => 'templates/nginx/ssl.key_example.erb',
|
18
|
+
'examples/mime.types.erb' => 'templates/nginx/mime.types_example.erb'
|
21
19
|
}.each do |source, destination|
|
22
20
|
config = File.read(File.dirname(__FILE__) + "/#{source}")
|
23
21
|
File.open("./#{destination}", 'w') { |f| f.write(config) }
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Load DSL and Setup Up Stages
|
2
|
+
require 'capistrano/setup'
|
3
|
+
|
4
|
+
# Includes default deployment tasks
|
5
|
+
require 'capistrano/deploy'
|
6
|
+
|
7
|
+
# Includes tasks from other gems included in your Gemfile
|
8
|
+
#
|
9
|
+
# For documentation on these, see for example:
|
10
|
+
#
|
11
|
+
# https://github.com/capistrano/rvm
|
12
|
+
# https://github.com/capistrano/rbenv
|
13
|
+
# https://github.com/capistrano/chruby
|
14
|
+
# https://github.com/capistrano/bundler
|
15
|
+
# https://github.com/capistrano/rails
|
16
|
+
#
|
17
|
+
# require 'capistrano/rvm'
|
18
|
+
# require 'capistrano/rbenv'
|
19
|
+
# require 'capistrano/chruby'
|
20
|
+
# require 'capistrano/bundler'
|
21
|
+
# require 'capistrano/rails/assets'
|
22
|
+
# require 'capistrano/rails/migrations'
|
23
|
+
|
24
|
+
require 'nginxinator'
|
25
|
+
|
26
|
+
# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
|
27
|
+
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Simple Role Syntax
|
2
|
+
# ==================
|
3
|
+
# Supports bulk-adding hosts to roles, the primary server in each group
|
4
|
+
# is considered to be the first unless any hosts have the primary
|
5
|
+
# property set. Don't declare `role :all`, it's a meta role.
|
6
|
+
|
7
|
+
set :domain, "my-app.example.com"
|
8
|
+
set :deploy_username, "deployer"
|
9
|
+
set :user_host, "#{fetch(:deploy_username)}@#{fetch(:domain)}"
|
10
|
+
|
11
|
+
role :app, fetch(:user_host)
|
12
|
+
role :web, fetch(:user_host)
|
13
|
+
role :db, fetch(:user_host)
|
14
|
+
|
15
|
+
# Extended Server Syntax
|
16
|
+
# ======================
|
17
|
+
# This can be used to drop a more detailed server definition into the
|
18
|
+
# server list. The second argument is a, or duck-types, Hash and is
|
19
|
+
# used to set extended properties on the server.
|
20
|
+
|
21
|
+
#server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value
|
22
|
+
|
23
|
+
|
24
|
+
# Custom SSH Options
|
25
|
+
# ==================
|
26
|
+
# You may pass any option but keep in mind that net/ssh understands a
|
27
|
+
# limited set of options, consult[net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start).
|
28
|
+
#
|
29
|
+
# Global options
|
30
|
+
# --------------
|
31
|
+
# set :ssh_options, {
|
32
|
+
# keys: %w(/home/rlisowski/.ssh/id_rsa),
|
33
|
+
# forward_agent: false,
|
34
|
+
# auth_methods: %w(password)
|
35
|
+
# }
|
36
|
+
#
|
37
|
+
# And/or per server (overrides global)
|
38
|
+
# ------------------------------------
|
39
|
+
# server 'example.com',
|
40
|
+
# user: 'user_name',
|
41
|
+
# roles: %w{web app},
|
42
|
+
# ssh_options: {
|
43
|
+
# user: 'user_name', # overrides user setting above
|
44
|
+
# keys: %w(/home/user_name/.ssh/id_rsa),
|
45
|
+
# forward_agent: false,
|
46
|
+
# auth_methods: %w(publickey password)
|
47
|
+
# # password: 'please use keys'
|
48
|
+
# }
|
49
|
+
|
50
|
+
require './config/deploy/staging_nginxinator.rb'
|
@@ -0,0 +1,58 @@
|
|
1
|
+
## For a standard Ubuntu 12.04 Nginx Docker image you should only
|
2
|
+
## need to change the following values to get started:
|
3
|
+
set :domain, "client.example.com"
|
4
|
+
set :sites_enabled, ['client-app']
|
5
|
+
set :publish_ports, [
|
6
|
+
{
|
7
|
+
"external" => "80",
|
8
|
+
"internal" => "80"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
"external" => "443",
|
12
|
+
"internal" => "443"
|
13
|
+
}
|
14
|
+
]
|
15
|
+
set :image_name, "snarlysodboxer/nginx:0.0.0"
|
16
|
+
set :external_data_path, "/var/www/client-app/current"
|
17
|
+
set :external_logs_path, "/var/www/client-app/shared/log/nginx"
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
## The values below may be commonly changed to match specifics
|
22
|
+
## relating to a particular Docker image or setup:
|
23
|
+
set :config_files, ["nginx.conf", "ssl.crt", "ssl.key", "mime.types"]
|
24
|
+
set :internal_data_path, -> { fetch(:external_data_path) }
|
25
|
+
set :internal_conf_path, "/etc/nginx"
|
26
|
+
set :internal_sites_enabled_path, "/etc/nginx/sites-enabled"
|
27
|
+
set :internal_logs_path, "/var/log/nginx"
|
28
|
+
set :internal_sock_path, "/var/run/unicorn"
|
29
|
+
set :ssh_user, ENV["USER"]
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
## The values below are not meant to be changed and shouldn't
|
34
|
+
## need to be under the majority of circumstances:
|
35
|
+
set :nginx_container_name, "#{fetch(:domain)}-nginx-#{fetch(:publish_ports).collect { |p| p['external'] }.join('-')}"
|
36
|
+
set :external_conf_path, "/#{fetch(:nginx_container_name)}-conf"
|
37
|
+
set :external_sites_enabled_path, "#{fetch(:external_conf_path)}/sites-enabled"
|
38
|
+
set :external_sock_path, "#{fetch(:external_conf_path)}/run"
|
39
|
+
set :ports_options, -> {
|
40
|
+
options = []
|
41
|
+
fetch(:publish_ports).each do |port_set|
|
42
|
+
options += ["--publish", "0.0.0.0:#{port_set['external']}:#{port_set['internal']}"]
|
43
|
+
end
|
44
|
+
options
|
45
|
+
}
|
46
|
+
set :docker_run_command, -> { [
|
47
|
+
"--detach", "--tty",
|
48
|
+
"--name", fetch(:nginx_container_name),
|
49
|
+
"--volume", "#{fetch(:external_data_path)}:#{fetch(:internal_data_path)}:rw",
|
50
|
+
"--volume", "#{fetch(:external_conf_path)}:#{fetch(:internal_conf_path)}:rw",
|
51
|
+
"--volume", "#{fetch(:external_sock_path)}:#{fetch(:internal_sock_path)}:rw",
|
52
|
+
"--volume", "#{fetch(:external_logs_path)}:#{fetch(:internal_logs_path)}:rw",
|
53
|
+
"--restart", "always",
|
54
|
+
fetch(:ports_options),
|
55
|
+
fetch(:image_name)
|
56
|
+
].flatten }
|
57
|
+
set :local_templates_path, "templates/nginx"
|
58
|
+
set :local_site_templates_path, -> { "#{fetch(:local_templates_path)}/sites-enabled" }
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# config valid only for Capistrano 3.1
|
2
|
+
lock '3.2.1'
|
3
|
+
|
4
|
+
set :application, 'my_app_name'
|
5
|
+
set :repo_url, 'git@example.com:me/my_repo.git'
|
6
|
+
|
7
|
+
# Default branch is :master
|
8
|
+
# ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call
|
9
|
+
|
10
|
+
# Default deploy_to directory is /var/www/my_app
|
11
|
+
# set :deploy_to, '/var/www/my_app'
|
12
|
+
|
13
|
+
# Default value for :scm is :git
|
14
|
+
# set :scm, :git
|
15
|
+
|
16
|
+
# Default value for :format is :pretty
|
17
|
+
# set :format, :pretty
|
18
|
+
|
19
|
+
# Default value for :log_level is :debug
|
20
|
+
# set :log_level, :debug
|
21
|
+
|
22
|
+
# Default value for :pty is false
|
23
|
+
# set :pty, true
|
24
|
+
|
25
|
+
# Default value for :linked_files is []
|
26
|
+
# set :linked_files, %w{config/database.yml}
|
27
|
+
|
28
|
+
# Default value for linked_dirs is []
|
29
|
+
# set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
|
30
|
+
|
31
|
+
# Default value for default_env is {}
|
32
|
+
# set :default_env, { path: "/opt/ruby/bin:$PATH" }
|
33
|
+
|
34
|
+
# Default value for keep_releases is 5
|
35
|
+
# set :keep_releases, 5
|
36
|
+
|
37
|
+
namespace :deploy do
|
38
|
+
|
39
|
+
desc 'Restart application'
|
40
|
+
task :restart do
|
41
|
+
on roles(:app), in: :sequence, wait: 5 do
|
42
|
+
# Your restart mechanism here, for example:
|
43
|
+
# execute :touch, release_path.join('tmp/restart.txt')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
after :publishing, :restart
|
48
|
+
|
49
|
+
after :restart, :clear_cache do
|
50
|
+
on roles(:web), in: :groups, limit: 3, wait: 10 do
|
51
|
+
# Here we can do anything such as:
|
52
|
+
# within release_path do
|
53
|
+
# execute :rake, 'cache:clear'
|
54
|
+
# end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
require './config/deploy_nginxinator.rb'
|
@@ -0,0 +1 @@
|
|
1
|
+
# Only stage-specific nginxinator config options are needed.
|
File without changes
|
@@ -4,7 +4,7 @@ daemon off;
|
|
4
4
|
user www-data;
|
5
5
|
worker_processes 4;
|
6
6
|
|
7
|
-
error_log <%= @
|
7
|
+
error_log <%= @internal_logs_path %>/error.log warn;
|
8
8
|
pid /var/run/nginx.pid;
|
9
9
|
|
10
10
|
events {
|
@@ -12,10 +12,10 @@ events {
|
|
12
12
|
}
|
13
13
|
|
14
14
|
http {
|
15
|
-
include <%= @
|
15
|
+
include <%= @internal_conf_path %>/mime.types;
|
16
16
|
default_type application/octet-stream;
|
17
17
|
|
18
|
-
access_log <%= @
|
18
|
+
access_log <%= @internal_logs_path %>/access.log;
|
19
19
|
|
20
20
|
sendfile on;
|
21
21
|
tcp_nopush on;
|
@@ -34,6 +34,6 @@ http {
|
|
34
34
|
types_hash_bucket_size 64;
|
35
35
|
|
36
36
|
|
37
|
-
include <%= @
|
38
|
-
include <%= @
|
37
|
+
include <%= @internal_conf_path %>/conf.d/*.conf;
|
38
|
+
include <%= @internal_sites_enabled_path %>/*;
|
39
39
|
}
|
@@ -1,25 +1,25 @@
|
|
1
1
|
upstream unicorn {
|
2
|
-
server unix:<%= @
|
2
|
+
server unix:<%= @internal_sock_path %>/unicorn.socket fail_timeout=0;
|
3
3
|
}
|
4
4
|
|
5
5
|
|
6
6
|
server {
|
7
7
|
listen 80;
|
8
8
|
location / {
|
9
|
-
rewrite ^/(.*)$ https://<%= @
|
9
|
+
rewrite ^/(.*)$ https://<%= @domain %>/$1 redirect;
|
10
10
|
}
|
11
11
|
}
|
12
12
|
|
13
13
|
server {
|
14
14
|
listen 443;
|
15
|
-
set $public_root <%= @
|
16
|
-
set $rails_root <%= @
|
15
|
+
set $public_root <%= @internal_data_path %>/public;
|
16
|
+
set $rails_root <%= @internal_data_path %>;
|
17
17
|
|
18
18
|
root $public_root;
|
19
19
|
|
20
20
|
ssl on;
|
21
|
-
ssl_certificate <%= @
|
22
|
-
ssl_certificate_key <%= @
|
21
|
+
ssl_certificate <%= @internal_conf_path %>/ssl.crt;
|
22
|
+
ssl_certificate_key <%= @internal_conf_path %>/ssl.key;
|
23
23
|
ssl_ciphers HIGH;
|
24
24
|
ssl_protocols SSLv3 TLSv1;
|
25
25
|
ssl_prefer_server_ciphers on;
|
File without changes
|
File without changes
|
data/lib/nginxinator/nginx.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
require 'erb'
|
2
2
|
|
3
|
-
require './nginxinator.rb' if File.exists?('./nginxinator.rb')
|
4
|
-
|
5
3
|
## NOTES:
|
6
4
|
# tasks without 'desc' description lines are for manual debugging of this
|
7
5
|
# deployment code.
|
@@ -11,42 +9,41 @@ require './nginxinator.rb' if File.exists?('./nginxinator.rb')
|
|
11
9
|
|
12
10
|
namespace :nginx do
|
13
11
|
|
14
|
-
desc "Idempotently setup
|
15
|
-
task :setup
|
16
|
-
# instance variables are lost inside SSHKit's 'on' block, so
|
17
|
-
# at the beginning of each task we assign 'settings' to @settings.
|
18
|
-
settings = @settings
|
12
|
+
desc "Idempotently setup an Nginx instance using values in ./config/deploy/<stage>_nginxinator.rb"
|
13
|
+
task :setup do
|
19
14
|
Rake::Task['nginx:ensure_access_docker'].invoke
|
20
15
|
Rake::Task['nginx:open_firewall'].invoke
|
21
16
|
# 'on', 'run_locally', 'as', 'execute', 'info', 'warn', and 'fatal' are from SSHKit
|
22
|
-
on
|
17
|
+
on roles(:app) do
|
23
18
|
config_file_changed = false
|
24
|
-
|
25
|
-
if nginx_config_file_differs?(
|
26
|
-
warn "Config file #{config_file} on #{
|
27
|
-
Rake::Task['nginx:install_config_file'].invoke(
|
19
|
+
fetch(:config_files).each do |config_file|
|
20
|
+
if nginx_config_file_differs?(fetch(:local_templates_path), fetch(:external_conf_path), config_file)
|
21
|
+
warn "Config file #{config_file} on #{fetch(:domain)} is being updated."
|
22
|
+
Rake::Task['nginx:install_config_file'].invoke(fetch(:local_templates_path), fetch(:external_conf_path), config_file)
|
28
23
|
Rake::Task['nginx:install_config_file'].reenable
|
29
24
|
config_file_changed = true
|
30
25
|
end
|
31
26
|
end
|
32
|
-
|
33
|
-
if nginx_config_file_differs?(
|
34
|
-
warn "Config file #{config_file} on #{
|
35
|
-
Rake::Task['nginx:install_config_file'].invoke(
|
27
|
+
fetch(:sites_enabled).each do |config_file|
|
28
|
+
if nginx_config_file_differs?(fetch(:local_site_templates_path), fetch(:external_sites_enabled_path), config_file)
|
29
|
+
warn "Config file #{config_file} on #{fetch(:domain)} is being updated."
|
30
|
+
Rake::Task['nginx:install_config_file'].invoke(fetch(:local_site_templates_path), fetch(:external_sites_enabled_path), config_file)
|
36
31
|
Rake::Task['nginx:install_config_file'].reenable
|
37
32
|
config_file_changed = true
|
38
33
|
end
|
39
34
|
end
|
40
|
-
|
35
|
+
execute "sudo", "mkdir", "-p", fetch(:external_sock_path)
|
36
|
+
execute "sudo", "chown", "-R", "www-data:www-data", fetch(:external_sock_path)
|
37
|
+
unless nginx_container_exists?
|
41
38
|
Rake::Task['nginx:create_container'].invoke
|
42
39
|
else
|
43
|
-
unless nginx_container_is_running?
|
40
|
+
unless nginx_container_is_running?
|
44
41
|
Rake::Task['nginx:start_container'].invoke
|
45
42
|
else
|
46
43
|
if config_file_changed
|
47
44
|
Rake::Task['nginx:restart_container'].invoke
|
48
45
|
else
|
49
|
-
info "No config file changes for #{
|
46
|
+
info "No config file changes for #{fetch(:nginx_container_name)} and it is already running; we're setup!"
|
50
47
|
end
|
51
48
|
end
|
52
49
|
end
|
@@ -54,75 +51,69 @@ namespace :nginx do
|
|
54
51
|
end
|
55
52
|
|
56
53
|
desc "Check the status of the Nginx instance."
|
57
|
-
task :status
|
58
|
-
|
59
|
-
on "#{settings.ssh_user}@#{settings.domain}" do
|
54
|
+
task :status do
|
55
|
+
on roles(:app) do
|
60
56
|
info ""
|
61
|
-
if nginx_container_exists?
|
62
|
-
info "#{
|
57
|
+
if nginx_container_exists?
|
58
|
+
info "#{fetch(:nginx_container_name)} exists on #{fetch(:domain)}"
|
63
59
|
info ""
|
64
|
-
if nginx_container_is_running?
|
65
|
-
info "#{
|
60
|
+
if nginx_container_is_running?
|
61
|
+
info "#{fetch(:nginx_container_name)} is running on #{fetch(:domain)}"
|
66
62
|
info ""
|
67
63
|
else
|
68
|
-
info "#{
|
64
|
+
info "#{fetch(:nginx_container_name)} is not running on #{fetch(:domain)}"
|
69
65
|
info ""
|
70
66
|
end
|
71
67
|
else
|
72
|
-
info "#{
|
68
|
+
info "#{fetch(:nginx_container_name)} does not exist on #{fetch(:domain)}"
|
73
69
|
info ""
|
74
70
|
end
|
75
71
|
end
|
76
72
|
end
|
77
73
|
|
78
|
-
task :create_container
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
execute("docker", "run", settings.docker_run_command)
|
74
|
+
task :create_container do
|
75
|
+
on roles(:app) do
|
76
|
+
warn "Starting a new container named #{fetch(:nginx_container_name)} on #{fetch(:domain)}"
|
77
|
+
execute("docker", "run", fetch(:docker_run_command))
|
83
78
|
sleep 2
|
84
|
-
fatal nginx_stay_running_message
|
79
|
+
fatal nginx_stay_running_message and raise unless nginx_container_is_running?
|
85
80
|
end
|
86
81
|
end
|
87
82
|
|
88
|
-
task :start_container
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
execute("docker", "start", settings.container_name)
|
83
|
+
task :start_container do
|
84
|
+
on roles(:app) do
|
85
|
+
warn "Starting an existing but non-running container named #{fetch(:nginx_container_name)}"
|
86
|
+
execute("docker", "start", fetch(:nginx_container_name))
|
93
87
|
sleep 2
|
94
|
-
fatal nginx_stay_running_message
|
88
|
+
fatal nginx_stay_running_message and raise unless nginx_container_is_running?
|
95
89
|
end
|
96
90
|
end
|
97
91
|
|
98
|
-
task :restart_container
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
execute("docker", "restart", settings.container_name)
|
92
|
+
task :restart_container do
|
93
|
+
on roles(:app) do
|
94
|
+
warn "Restarting a running container named #{fetch(:nginx_container_name)}"
|
95
|
+
execute("docker", "restart", fetch(:nginx_container_name))
|
103
96
|
sleep 2
|
104
|
-
fatal nginx_stay_running_message
|
97
|
+
fatal nginx_stay_running_message and raise unless nginx_container_is_running?
|
105
98
|
end
|
106
99
|
end
|
107
100
|
|
108
|
-
task :ensure_access_docker
|
109
|
-
|
110
|
-
|
111
|
-
as settings.ssh_user do
|
101
|
+
task :ensure_access_docker do
|
102
|
+
on roles(:app) do
|
103
|
+
as fetch(:ssh_user) do
|
112
104
|
unless test("bash", "-c", "\"docker", "ps", "&>", "/dev/null\"")
|
113
|
-
execute("sudo", "usermod", "-a", "-G", "docker",
|
105
|
+
execute("sudo", "usermod", "-a", "-G", "docker", fetch(:ssh_user))
|
114
106
|
fatal "Newly added to docker group, this run will fail, next run will succeed. Simply try again."
|
115
107
|
end
|
116
108
|
end
|
117
109
|
end
|
118
110
|
end
|
119
111
|
|
120
|
-
task :install_config_file, [:template_path, :config_path, :config_file]
|
121
|
-
|
122
|
-
on "#{settings.ssh_user}@#{settings.domain}" do
|
112
|
+
task :install_config_file, [:template_path, :config_path, :config_file] do |t, args|
|
113
|
+
on roles(:app) do
|
123
114
|
as 'root' do
|
124
115
|
execute("mkdir", "-p", args.config_path) unless test("test", "-d", args.config_path)
|
125
|
-
generated_config_file = nginx_generate_config_file(
|
116
|
+
generated_config_file = nginx_generate_config_file("#{args.template_path}/#{args.config_file}.erb")
|
126
117
|
upload! StringIO.new(generated_config_file), "/tmp/#{args.config_file}"
|
127
118
|
execute("mv", "/tmp/#{args.config_file}", "#{args.config_path}/#{args.config_file}")
|
128
119
|
execute("chown", "-R", "root:root", args.config_path)
|
@@ -131,12 +122,11 @@ namespace :nginx do
|
|
131
122
|
end
|
132
123
|
end
|
133
124
|
|
134
|
-
task :open_firewall
|
135
|
-
|
136
|
-
on "#{settings.ssh_user}@#{settings.domain}" do
|
125
|
+
task :open_firewall do
|
126
|
+
on roles(:app) do
|
137
127
|
as "root" do
|
138
128
|
if test "ufw", "status"
|
139
|
-
|
129
|
+
fetch(:publish_ports).collect { |port_set| port_set['external'] }.each do |port|
|
140
130
|
raise "Error during opening UFW firewall" unless test("ufw", "allow", "#{port}/tcp")
|
141
131
|
end
|
142
132
|
end
|
@@ -149,12 +139,12 @@ namespace :nginx do
|
|
149
139
|
# Temporarily added 'nginx_' to the beginning of each of these methods to avoid
|
150
140
|
# getting them overwritten by other gems with methods with the same names, (E.G. postgresinator.)
|
151
141
|
## TODO Figure out how to do this the right or better way.
|
152
|
-
def nginx_stay_running_message
|
153
|
-
"Container #{
|
142
|
+
def nginx_stay_running_message
|
143
|
+
"Container #{fetch(:nginx_container_name)} on #{fetch(:domain)} did not stay running more than 2 seconds"
|
154
144
|
end
|
155
145
|
|
156
|
-
def nginx_config_file_differs?(
|
157
|
-
generated_config_file = nginx_generate_config_file(
|
146
|
+
def nginx_config_file_differs?(local_templates_path, external_config_path, config_file)
|
147
|
+
generated_config_file = nginx_generate_config_file("#{local_templates_path}/#{config_file}.erb")
|
158
148
|
as 'root' do
|
159
149
|
config_file_path = "#{external_config_path}/#{config_file}"
|
160
150
|
if nginx_file_exists?(config_file_path)
|
@@ -165,20 +155,31 @@ namespace :nginx do
|
|
165
155
|
end
|
166
156
|
end
|
167
157
|
|
168
|
-
def nginx_generate_config_file(
|
169
|
-
|
158
|
+
def nginx_generate_config_file(template_file_path)
|
159
|
+
set :logs_path, -> { fetch(:internal_logs_path) }
|
160
|
+
set :conf_path, -> { fetch(:internal_conf_path) }
|
161
|
+
set :sock_path, -> { fetch(:internal_sock_path) }
|
162
|
+
set :data_path, -> { fetch(:internal_data_path) }
|
163
|
+
set :sites_path, -> { fetch(:internal_sites_enabled_path) }
|
164
|
+
set :cdomain, -> { fetch(:domain) }
|
165
|
+
@internal_logs_path = fetch(:logs_path)
|
166
|
+
@internal_conf_path = fetch(:conf_path)
|
167
|
+
@internal_sock_path = fetch(:sock_path)
|
168
|
+
@internal_data_path = fetch(:data_path)
|
169
|
+
@internal_sites_enabled_path = fetch(:sites_path)
|
170
|
+
@domain = fetch(:cdomain)
|
170
171
|
template_path = File.expand_path(template_file_path)
|
171
172
|
ERB.new(File.new(template_path).read).result(binding)
|
172
173
|
end
|
173
174
|
|
174
|
-
def nginx_container_exists?
|
175
|
-
test "docker", "inspect",
|
175
|
+
def nginx_container_exists?
|
176
|
+
test "docker", "inspect", fetch(:nginx_container_name), ">", "/dev/null"
|
176
177
|
end
|
177
178
|
|
178
|
-
def nginx_container_is_running?
|
179
|
+
def nginx_container_is_running?
|
179
180
|
(capture "docker", "inspect",
|
180
181
|
"--format='{{.State.Running}}'",
|
181
|
-
|
182
|
+
fetch(:nginx_container_name)).strip == "true"
|
182
183
|
end
|
183
184
|
|
184
185
|
def nginx_file_exists?(file_name_path)
|
data/lib/nginxinator.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nginxinator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-11-
|
12
|
+
date: 2014-11-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: capistrano
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - '='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.2.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.2.1
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: rake
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,12 +68,16 @@ files:
|
|
52
68
|
- lib/nginxinator.rb
|
53
69
|
- lib/nginxinator/nginx.rb
|
54
70
|
- lib/nginxinator/config.rb
|
55
|
-
- lib/nginxinator/examples/
|
56
|
-
- lib/nginxinator/examples/
|
57
|
-
- lib/nginxinator/examples/
|
58
|
-
- lib/nginxinator/examples/
|
59
|
-
- lib/nginxinator/examples/
|
60
|
-
- lib/nginxinator/examples/
|
71
|
+
- lib/nginxinator/examples/Capfile
|
72
|
+
- lib/nginxinator/examples/config/deploy.rb
|
73
|
+
- lib/nginxinator/examples/config/deploy_nginxinator.rb
|
74
|
+
- lib/nginxinator/examples/config/deploy/staging.rb
|
75
|
+
- lib/nginxinator/examples/config/deploy/staging_nginxinator.rb
|
76
|
+
- lib/nginxinator/examples/nginx.conf.erb
|
77
|
+
- lib/nginxinator/examples/site-enabled.erb
|
78
|
+
- lib/nginxinator/examples/ssl.crt.erb
|
79
|
+
- lib/nginxinator/examples/ssl.key.erb
|
80
|
+
- lib/nginxinator/examples/mime.types.erb
|
61
81
|
- lib/nginxinator/examples/Dockerfile
|
62
82
|
homepage: https://github.com/snarlysodboxer/nginxinator
|
63
83
|
licenses:
|
@@ -1,116 +0,0 @@
|
|
1
|
-
class NginxInstance
|
2
|
-
|
3
|
-
## For a standard Ubuntu 12.04 Nginx Docker image you should only
|
4
|
-
## need to change the following values to get started:
|
5
|
-
def domain
|
6
|
-
"client.example.com"
|
7
|
-
end
|
8
|
-
|
9
|
-
def sites_enabled
|
10
|
-
['client-app']
|
11
|
-
end
|
12
|
-
|
13
|
-
def publish_ports
|
14
|
-
[
|
15
|
-
{
|
16
|
-
"external" => "80",
|
17
|
-
"internal" => "80"
|
18
|
-
},
|
19
|
-
{
|
20
|
-
"external" => "443",
|
21
|
-
"internal" => "443"
|
22
|
-
}
|
23
|
-
]
|
24
|
-
end
|
25
|
-
|
26
|
-
def image_name
|
27
|
-
"snarlysodboxer/nginx:0.0.0"
|
28
|
-
end
|
29
|
-
|
30
|
-
def external_data_path
|
31
|
-
"/var/www/current"
|
32
|
-
end
|
33
|
-
|
34
|
-
def external_logs_path
|
35
|
-
"/var/log/nginx"
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
## The values below may be commonly changed to match specifics
|
41
|
-
## relating to a particular Docker image or setup:
|
42
|
-
def config_files
|
43
|
-
["nginx.conf", "ssl.crt", "ssl.key", "mime.types"]
|
44
|
-
end
|
45
|
-
|
46
|
-
def internal_data_path
|
47
|
-
"/var/www/current"
|
48
|
-
end
|
49
|
-
|
50
|
-
def internal_conf_path
|
51
|
-
"/etc/nginx"
|
52
|
-
end
|
53
|
-
|
54
|
-
def internal_sites_enabled_path
|
55
|
-
"/etc/nginx/sites-enabled"
|
56
|
-
end
|
57
|
-
|
58
|
-
def internal_logs_path
|
59
|
-
"/var/log/nginx"
|
60
|
-
end
|
61
|
-
|
62
|
-
def internal_sock_path
|
63
|
-
"/var/run/unicorn"
|
64
|
-
end
|
65
|
-
|
66
|
-
def ssh_user
|
67
|
-
ENV["USER"]
|
68
|
-
end
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
## The values below are not meant to be changed and shouldn't
|
73
|
-
## need to be under the majority of circumstances:
|
74
|
-
|
75
|
-
def external_conf_path
|
76
|
-
"/#{container_name}-conf"
|
77
|
-
end
|
78
|
-
|
79
|
-
def external_sites_enabled_path
|
80
|
-
"#{external_conf_path}/sites-enabled"
|
81
|
-
end
|
82
|
-
|
83
|
-
def external_sock_path
|
84
|
-
"#{external_conf_path}/run"
|
85
|
-
end
|
86
|
-
|
87
|
-
def container_name
|
88
|
-
"#{domain}-nginx-#{publish_ports.collect { |p| p['external'] }.join('-')}"
|
89
|
-
end
|
90
|
-
|
91
|
-
def docker_run_command
|
92
|
-
ports_options = []
|
93
|
-
publish_ports.each do |port_set|
|
94
|
-
ports_options += ["--publish", "0.0.0.0:#{port_set['external']}:#{port_set['internal']}"]
|
95
|
-
end
|
96
|
-
[ "--detach", "--tty",
|
97
|
-
"--name", container_name,
|
98
|
-
"--volume", "#{external_data_path}:#{internal_data_path}:rw",
|
99
|
-
"--volume", "#{external_conf_path}:#{internal_conf_path}:rw",
|
100
|
-
"--volume", "#{external_sock_path}:#{internal_sock_path}:rw",
|
101
|
-
"--volume", "#{external_logs_path}:#{internal_logs_path}:rw",
|
102
|
-
"--restart", "always",
|
103
|
-
ports_options,
|
104
|
-
image_name
|
105
|
-
].flatten
|
106
|
-
end
|
107
|
-
|
108
|
-
def local_templates_path
|
109
|
-
"templates/nginx"
|
110
|
-
end
|
111
|
-
|
112
|
-
def local_site_templates_path
|
113
|
-
"#{local_templates_path}/sites-enabled"
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|