nginxinator 0.2.0 → 0.2.1

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.
@@ -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: