nginxinator 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ set :webserver_log_level, "info"
2
+ set :webserver_config_files, ["nginx.conf", "ssl.crt", "ssl.key", "mime.types"]
3
+ set :webserver_data_path, -> { current_path }
4
+ set :webserver_logs_path, -> { shared_path.join('log') }
5
+ set :webserver_config_path, -> { shared_path.join('nginx') }
6
+ set :webserver_socket_path, -> { shared_path.join('run') }
7
+ set :webserver_templates_path, "templates/nginx"
8
+ set :webserver_container_name, -> { "#{fetch(:domain)}-nginx-#{fetch(:webserver_publish_ports).join('-')}" }
9
+ set :webserver_ports_options, -> { fetch(:webserver_publish_ports).collect { |p| ["--publish", "0.0.0.0:#{p}:#{p}"] }.flatten }
10
+
11
+ def webserver_run(host)
12
+ execute("docker", "run", "--detach", "--tty",
13
+ "--name", fetch(:webserver_container_name),
14
+ "--volume", "#{fetch(:deploy_to)}:#{fetch(:deploy_to)}:rw",
15
+ "--entrypoint", "/usr/sbin/nginx",
16
+ "--restart", "always",
17
+ fetch(:webserver_ports_options),
18
+ fetch(:webserver_image_name),
19
+ "-c", shared_path.join('nginx', 'nginx.conf'))
20
+ end
@@ -1,24 +1,107 @@
1
+ module Capistrano
2
+ module TaskEnhancements
3
+ alias_method :nginx_original_default_tasks, :default_tasks
4
+ def default_tasks
5
+ nginx_original_default_tasks + [
6
+ "nginxinator:write_built_in",
7
+ "nginxinator:write_example_configs",
8
+ "nginxinator:write_example_configs:in_place"
9
+ ]
10
+ end
11
+ end
12
+ end
13
+
1
14
  namespace :nginxinator do
2
15
 
3
- desc 'Write example config files'
16
+ set :example, "_example"
17
+
18
+ desc "Write example config files (with '_example' appended to their names)."
4
19
  task :write_example_configs do
5
20
  run_locally do
6
- execute "mkdir", "-p", "config/deploy", "templates/nginx"
21
+ execute "mkdir", "-p", "config/deploy", fetch(:webserver_templates_path, 'templates/nginx')
7
22
  {
8
- 'examples/Capfile' => 'Capfile_example',
9
- 'examples/config/deploy.rb' => 'config/deploy_example.rb',
10
- 'examples/config/deploy/staging.rb' => 'config/deploy/staging_example.rb',
11
- 'examples/Dockerfile' => 'templates/nginx/Dockerfile_example',
12
- 'examples/nginx.conf.erb' => 'templates/nginx/nginx_example.conf.erb',
13
- 'examples/ssl.crt.erb' => 'templates/nginx/ssl.crt_example.erb',
14
- 'examples/ssl.key.erb' => 'templates/nginx/ssl.key_example.erb',
15
- 'examples/mime.types.erb' => 'templates/nginx/mime.types_example.erb'
23
+ "examples/Capfile" => "Capfile#{fetch(:example)}",
24
+ "examples/config/deploy.rb" => "config/deploy#{fetch(:example)}.rb",
25
+ "examples/config/deploy/staging.rb" => "config/deploy/staging#{fetch(:example)}.rb",
26
+ "examples/Dockerfile" => "#{fetch(:webserver_templates_path, 'templates/nginx')}/Dockerfile#{fetch(:example)}",
27
+ "examples/nginx.conf.erb" => "#{fetch(:webserver_templates_path, 'templates/nginx')}/nginx#{fetch(:example)}.conf.erb",
28
+ "examples/ssl.crt.erb" => "#{fetch(:webserver_templates_path, 'templates/nginx')}/ssl.crt#{fetch(:example)}.erb",
29
+ "examples/ssl.key.erb" => "#{fetch(:webserver_templates_path, 'templates/nginx')}/ssl.key#{fetch(:example)}.erb",
30
+ "examples/mime.types.erb" => "#{fetch(:webserver_templates_path, 'templates/nginx')}/mime.types#{fetch(:example)}.erb"
16
31
  }.each do |source, destination|
17
32
  config = File.read(File.dirname(__FILE__) + "/#{source}")
18
33
  File.open("./#{destination}", 'w') { |f| f.write(config) }
19
34
  info "Wrote '#{destination}'"
20
35
  end
21
- info "Now remove the '_example' portion of their names or diff with existing files and add the needed lines."
36
+ unless fetch(:example).empty?
37
+ info "Now remove the '#{fetch(:example)}' portion of their names or diff with existing files and add the needed lines."
38
+ end
39
+ end
40
+ end
41
+
42
+ desc 'Write example config files (will overwrite any existing config files).'
43
+ namespace :write_example_configs do
44
+ task :in_place do
45
+ set :example, ""
46
+ Rake::Task['nginxinator:write_example_configs'].invoke
47
+ end
48
+ end
49
+
50
+ desc 'Write a file showing the built-in overridable settings.'
51
+ task :write_built_in do
52
+ run_locally do
53
+ {
54
+ 'built-in.rb' => 'built-in.rb',
55
+ }.each do |source, destination|
56
+ config = File.read(File.dirname(__FILE__) + "/#{source}")
57
+ File.open("./#{destination}", 'w') { |f| f.write(config) }
58
+ info "Wrote '#{destination}'"
59
+ end
60
+ info "Now examine the file and copy-paste into your deploy.rb or <stage>.rb and customize."
61
+ end
62
+ end
63
+
64
+ # These are the only two tasks using :preexisting_ssh_user
65
+ namespace :deployment_user do
66
+ #desc "Setup or re-setup the deployment user, idempotently"
67
+ task :setup do
68
+ on roles(:all) do |h|
69
+ on "#{fetch(:preexisting_ssh_user)}@#{h}" do |host|
70
+ as :root do
71
+ deployment_user_setup(fetch(:webserver_templates_path))
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ task :deployment_user do
79
+ on roles(:all) do |h|
80
+ on "#{fetch(:preexisting_ssh_user)}@#{h}" do |host|
81
+ as :root do
82
+ if unix_user_exists?(fetch(:deployment_username))
83
+ info "User #{fetch(:deployment_username)} already exists. You can safely re-setup the user with 'nginxinator:deployment_user:setup'."
84
+ else
85
+ Rake::Task['nginxinator:deployment_user:setup'].invoke
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ task :webserver_user do
93
+ on roles(:app) do
94
+ as :root do
95
+ unix_user_add(fetch(:webserver_username)) unless unix_user_exists?(fetch(:webserver_username))
96
+ end
97
+ end
98
+ end
99
+
100
+ task :file_permissions => [:deployment_user, :webserver_user] do
101
+ on roles(:app) do
102
+ as :root do
103
+ setup_file_permissions
104
+ end
22
105
  end
23
106
  end
24
107
 
@@ -2,7 +2,7 @@
2
2
  require 'capistrano/setup'
3
3
 
4
4
  # Includes default deployment tasks
5
- require 'capistrano/deploy'
5
+ #require 'capistrano/deploy'
6
6
 
7
7
  # Includes tasks from other gems included in your Gemfile
8
8
  #
@@ -1,13 +1,9 @@
1
+ ##### nginxinator
2
+ ### ------------------------------------------------------------------
1
3
  set :domain, "my-app.example.com"
2
- set :user_host, "#{fetch(:deployment_username)}@#{fetch(:domain)}"
3
-
4
- role :app, fetch(:user_host)
5
- role :web, fetch(:user_host)
6
- role :db, fetch(:user_host)
7
-
8
-
9
- # nginxinator
10
- #--------------------------------------------------------------------------
4
+ server fetch(:domain),
5
+ :user => fetch(:deployment_username),
6
+ :roles => ["app", "web", "db"]
11
7
  set :webserver_publish_ports, ["80", "443"]
12
8
  set :webserver_image_name, "snarlysodboxer/nginx:0.0.0"
13
- #--------------------------------------------------------------------------
9
+ ### ------------------------------------------------------------------
@@ -1,27 +1,14 @@
1
- # config valid only for Capistrano 3.1
1
+ # config valid only for Capistrano 3.2.1
2
2
  lock '3.2.1'
3
3
 
4
+ ##### nginxinator
5
+ ### ------------------------------------------------------------------
6
+ set :application, "my_app_name"
4
7
  set :preexisting_ssh_user, ENV['USER']
5
8
  set :deployment_username, "deployer"
6
9
  set :webserver_username, "www-data"
7
- set :webserver_config_files, ["nginx.conf", "ssl.crt", "ssl.key", "mime.types"]
8
- set :webserver_data_path, current_path
9
- set :webserver_logs_path, shared_path.join('log')
10
- set :webserver_config_path, shared_path.join('nginx')
11
- set :webserver_socket_path, shared_path.join('run')
12
- set :webserver_writeable_dirs, [shared_path.join('run'), shared_path.join('log')]
10
+ set :webserver_owned_dirs, [shared_path.join('tmp', 'cache'), shared_path.join('public', 'assets')]
11
+ set :webserver_writeable_dirs, [shared_path.join('run'), shared_path.join('tmp'), shared_path.join('log')]
13
12
  set :webserver_executable_dirs, [shared_path.join('bundle', 'bin')]
14
13
  set :ignore_permissions_dirs, [shared_path.join('postgres'), shared_path.join('nginx')]
15
- set :webserver_container_name, -> { "#{fetch(:domain)}-nginx-#{fetch(:webserver_publish_ports).join('-')}" }
16
- set :webserver_ports_options, -> { fetch(:webserver_publish_ports).collect { |p| ["--publish", "0.0.0.0:#{p}:#{p}"] }.flatten }
17
- set :webserver_docker_run_command, -> { [
18
- "--detach", "--tty",
19
- "--name", fetch(:webserver_container_name),
20
- "--volume", "#{fetch(:deploy_to)}:#{fetch(:deploy_to)}:rw",
21
- "--entrypoint", "/usr/sbin/nginx",
22
- "--restart", "always",
23
- fetch(:webserver_ports_options),
24
- fetch(:webserver_image_name),
25
- "-c", shared_path.join('nginx', 'nginx.conf')
26
- ].flatten }
27
- set :local_templates_path, "templates/nginx"
14
+ ### ------------------------------------------------------------------
@@ -1,24 +1,30 @@
1
1
  namespace :nginx do
2
2
 
3
+ task :ensure_setup => ['nginxinator:deployment_user', 'nginxinator:webserver_user', 'deployinator:sshkit_umask'] do
4
+ SSHKit.config.output_verbosity = fetch(:webserver_log_level)
5
+ end
6
+
3
7
  desc "Idempotently setup an Nginx instance."
4
- task :setup => ['deployinator:deployment_user', 'deployinator:webserver_user', 'deployinator:sshkit_umask'] do
8
+ task :setup => [:ensure_setup] do
5
9
  Rake::Task['nginx:open_firewall'].invoke
6
10
  # 'on', 'run_locally', 'as', 'execute', 'info', 'warn', and 'fatal' are from SSHKit
7
- on roles(:app) do
11
+ on roles(:app) do |host|
8
12
  as :root do
9
13
  set :config_file_changed, false
10
14
  Rake::Task['nginx:install_config_files'].invoke
11
- Rake::Task['deployinator:file_permissions'].invoke
12
- unless container_exists?(fetch(:webserver_container_name))
13
- create_container(fetch(:webserver_container_name), fetch(:webserver_docker_run_command))
15
+ Rake::Task['nginxinator:file_permissions'].invoke
16
+ name = fetch(:webserver_container_name)
17
+ unless container_exists?(name)
18
+ warn "Starting a new container named #{name} on #{host}"
19
+ webserver_run(host)
14
20
  else
15
- unless container_is_running?(fetch(:webserver_container_name))
16
- start_container(fetch(:webserver_container_name))
21
+ unless container_is_running?(name)
22
+ start_container(name)
17
23
  else
18
24
  if fetch(:config_file_changed)
19
- restart_container(fetch(:webserver_container_name))
25
+ restart_container(name)
20
26
  else
21
- info "No config file changes for #{fetch(:webserver_container_name)} and it is already running; we're setup!"
27
+ info "No config file changes for #{name} and it is already running; we're setup!"
22
28
  end
23
29
  end
24
30
  end
@@ -27,34 +33,35 @@ namespace :nginx do
27
33
  end
28
34
 
29
35
  desc "Check the status of the Nginx instance."
30
- task :status => ['deployinator:deployment_user'] do
36
+ task :status => [:ensure_setup] do
31
37
  on roles(:app) do
32
38
  info ""
33
- if container_exists?(fetch(:webserver_container_name))
34
- info "#{fetch(:webserver_container_name)} exists on #{fetch(:domain)}"
39
+ name = fetch(:webserver_container_name)
40
+ if container_exists?(name)
41
+ info "#{name} exists on #{fetch(:domain)}"
35
42
  info ""
36
- if container_is_running?(fetch(:webserver_container_name))
37
- info "#{fetch(:webserver_container_name)} is running on #{fetch(:domain)}"
43
+ if container_is_running?(name)
44
+ info "#{name} is running on #{fetch(:domain)}"
38
45
  info ""
39
46
  else
40
- info "#{fetch(:webserver_container_name)} is not running on #{fetch(:domain)}"
47
+ info "#{name} is not running on #{fetch(:domain)}"
41
48
  info ""
42
49
  end
43
50
  else
44
- info "#{fetch(:webserver_container_name)} does not exist on #{fetch(:domain)}"
51
+ info "#{name} does not exist on #{fetch(:domain)}"
45
52
  info ""
46
53
  end
47
54
  end
48
55
  end
49
56
 
50
- task :install_config_files => ['deployinator:deployment_user', 'deployinator:webserver_user', 'deployinator:sshkit_umask'] do
51
- require 'erb'
57
+ task :install_config_files => [:ensure_setup] do
58
+ require 'erb' unless defined?(ERB)
52
59
  on roles(:app) do
53
60
  as 'root' do
54
61
  execute "mkdir", "-p", fetch(:webserver_socket_path),
55
62
  fetch(:webserver_logs_path), fetch(:webserver_config_path)
56
63
  fetch(:webserver_config_files).each do |config_file|
57
- template_path = File.expand_path("#{fetch(:local_templates_path)}/#{config_file}.erb")
64
+ template_path = File.expand_path("#{fetch(:webserver_templates_path)}/#{config_file}.erb")
58
65
  generated_config_file = ERB.new(File.new(template_path).read).result(binding)
59
66
  upload! StringIO.new(generated_config_file), "/tmp/#{config_file}.file"
60
67
  unless test "diff", "-q", "/tmp/#{config_file}.file", "#{fetch(:webserver_config_path)}/#{config_file}"
@@ -65,7 +72,6 @@ namespace :nginx do
65
72
  execute "rm", "/tmp/#{config_file}.file"
66
73
  end
67
74
  end
68
- #execute("chown", "-R", "#{fetch(:deployment_user_id)}:#{fetch(:webserver_user_id)}", fetch(:webserver_config_path))
69
75
  execute("chown", "-R", "root:root", fetch(:webserver_config_path))
70
76
  execute "find", fetch(:webserver_config_path), "-type", "d", "-exec", "chmod", "2775", "{}", "+"
71
77
  execute "find", fetch(:webserver_config_path), "-type", "f", "-exec", "chmod", "0600", "{}", "+"
@@ -73,7 +79,7 @@ namespace :nginx do
73
79
  end
74
80
  end
75
81
 
76
- task :open_firewall do
82
+ task :open_firewall => [:ensure_setup] do
77
83
  on roles(:app) do
78
84
  as "root" do
79
85
  if test "bash", "-c", "\"ufw", "status", "&>" "/dev/null\""
data/lib/nginxinator.rb CHANGED
@@ -3,4 +3,5 @@ require 'capistrano/setup'
3
3
  load 'nginxinator/nginx.rb'
4
4
  load 'nginxinator/config.rb'
5
5
  load 'nginxinator/check.rb'
6
+ load 'nginxinator/built-in.rb'
6
7
  load 'deployinator/helpers.rb'
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.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,14 +9,14 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-12-29 00:00:00.000000000 Z
12
+ date: 2015-01-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: capistrano
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - '='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
21
  version: 3.2.1
22
22
  type: :runtime
@@ -24,7 +24,7 @@ dependencies:
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - '='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: 3.2.1
30
30
  - !ruby/object:Gem::Dependency
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 0.1.0
37
+ version: 0.1.3
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,13 +42,13 @@ dependencies:
42
42
  requirements:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 0.1.0
45
+ version: 0.1.3
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: rake
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
- - - '='
51
+ - - ~>
52
52
  - !ruby/object:Gem::Version
53
53
  version: 10.3.2
54
54
  type: :runtime
@@ -56,7 +56,7 @@ dependencies:
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
59
- - - '='
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: 10.3.2
62
62
  - !ruby/object:Gem::Dependency
@@ -64,7 +64,7 @@ dependencies:
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  none: false
66
66
  requirements:
67
- - - '='
67
+ - - ~>
68
68
  - !ruby/object:Gem::Version
69
69
  version: 1.5.1
70
70
  type: :runtime
@@ -72,10 +72,10 @@ dependencies:
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
- - - '='
75
+ - - ~>
76
76
  - !ruby/object:Gem::Version
77
77
  version: 1.5.1
78
- description: An Opinionated Nginx Deployment gem
78
+ description: Deploy Nginx instances using Capistrano and Docker
79
79
  email: davidamick@ctisolutionsinc.com
80
80
  executables: []
81
81
  extensions: []
@@ -85,6 +85,7 @@ files:
85
85
  - lib/nginxinator/nginx.rb
86
86
  - lib/nginxinator/config.rb
87
87
  - lib/nginxinator/check.rb
88
+ - lib/nginxinator/built-in.rb
88
89
  - lib/nginxinator/examples/Capfile
89
90
  - lib/nginxinator/examples/config/deploy.rb
90
91
  - lib/nginxinator/examples/config/deploy/staging.rb
@@ -113,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
114
  - !ruby/object:Gem::Version
114
115
  version: '0'
115
116
  requirements:
116
- - Docker ~1.3.1
117
+ - Docker ~> 1.3.1
117
118
  rubyforge_project:
118
119
  rubygems_version: 1.8.23.2
119
120
  signing_key: