nginxinator 0.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 +7 -0
- data/lib/nginxinator.rb +6 -0
- data/lib/nginxinator/config.rb +30 -0
- data/lib/nginxinator/examples/Dockerfile +10 -0
- data/lib/nginxinator/examples/mime.types_example.erb +79 -0
- data/lib/nginxinator/examples/nginx_example.conf.erb +39 -0
- data/lib/nginxinator/examples/nginxinator_example.rb +115 -0
- data/lib/nginxinator/examples/site-enabled_example.erb +65 -0
- data/lib/nginxinator/examples/ssl.crt_example.erb +1 -0
- data/lib/nginxinator/examples/ssl.key_example.erb +1 -0
- data/lib/nginxinator/nginx.rb +185 -0
- metadata +81 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: b829943382a3708dfe4e28c665d8fe93d65168cd
|
|
4
|
+
data.tar.gz: c055ef06028e3bf7bcdca0ccd2c77d7745816ef4
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 1ce2ff7f57db5da8c751ed6756ac3cab26598b5285763793e86d6d25139e73abb1bb637a6ee15e744a0a8d342fa16ae370b32d5ebaf3bd1d2303c5612773e3b9
|
|
7
|
+
data.tar.gz: 15184a3635cb2ffaf163002b9da4567ea6957f6e14fb139c77195c2f0f7fb12cfa4eb7bea967db1d266f2e011c2b9fa8a623906df4311add5df002f63ce4bd4f
|
data/lib/nginxinator.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
namespace :nginx do
|
|
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
|
|
8
|
+
|
|
9
|
+
desc 'Write example config files'
|
|
10
|
+
task :write_example_configs do
|
|
11
|
+
run_locally do
|
|
12
|
+
execute "mkdir -p templates/nginx/sites-enabled"
|
|
13
|
+
{
|
|
14
|
+
'examples/Dockerfile' => 'Dockerfile_example',
|
|
15
|
+
'examples/nginxinator_example.rb' => 'nginxinator_example.rb',
|
|
16
|
+
'examples/nginx_example.conf.erb' => 'templates/nginx/nginx_example.conf.erb',
|
|
17
|
+
'examples/site-enabled_example.erb' => 'templates/nginx/sites-enabled/client-app_example.erb',
|
|
18
|
+
'examples/ssl.crt_example.erb' => 'templates/nginx/ssl.crt_example.erb',
|
|
19
|
+
'examples/ssl.key_example.erb' => 'templates/nginx/ssl.key_example.erb',
|
|
20
|
+
'examples/mime.types_example.erb' => 'templates/nginx/mime.types_example.erb'
|
|
21
|
+
}.each do |source, destination|
|
|
22
|
+
config = File.read(File.dirname(__FILE__) + "/#{source}")
|
|
23
|
+
File.open("./#{destination}", 'w') { |f| f.write(config) }
|
|
24
|
+
info "Wrote '#{destination}'"
|
|
25
|
+
end
|
|
26
|
+
info "Now remove the '_example' portion of their names or diff with existing files and add the needed lines."
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# vi: ft=config
|
|
2
|
+
FROM ubuntu:12.04
|
|
3
|
+
MAINTAINER david amick <docker@davidamick.com>
|
|
4
|
+
|
|
5
|
+
ENV DEBIAN_FRONTEND noninteractive
|
|
6
|
+
|
|
7
|
+
RUN /bin/bash -l -c "apt-get update -qq && apt-get install -qy nginx"
|
|
8
|
+
|
|
9
|
+
ENTRYPOINT ["/usr/sbin/nginx"]
|
|
10
|
+
CMD ["-c", "/etc/nginx/nginx.conf"]
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
types {
|
|
2
|
+
text/html html htm shtml;
|
|
3
|
+
text/css css;
|
|
4
|
+
text/xml xml rss;
|
|
5
|
+
image/gif gif;
|
|
6
|
+
image/jpeg jpeg jpg;
|
|
7
|
+
application/x-javascript js;
|
|
8
|
+
application/atom+xml atom;
|
|
9
|
+
|
|
10
|
+
text/mathml mml;
|
|
11
|
+
text/plain txt;
|
|
12
|
+
text/vnd.sun.j2me.app-descriptor jad;
|
|
13
|
+
text/vnd.wap.wml wml;
|
|
14
|
+
text/x-component htc;
|
|
15
|
+
|
|
16
|
+
image/png png;
|
|
17
|
+
image/tiff tif tiff;
|
|
18
|
+
image/vnd.wap.wbmp wbmp;
|
|
19
|
+
image/x-icon ico;
|
|
20
|
+
image/x-jng jng;
|
|
21
|
+
image/x-ms-bmp bmp;
|
|
22
|
+
image/svg+xml svg svgz;
|
|
23
|
+
|
|
24
|
+
application/java-archive jar war ear;
|
|
25
|
+
application/json json;
|
|
26
|
+
application/mac-binhex40 hqx;
|
|
27
|
+
application/msword doc;
|
|
28
|
+
application/pdf pdf;
|
|
29
|
+
application/postscript ps eps ai;
|
|
30
|
+
application/rtf rtf;
|
|
31
|
+
application/vnd.ms-excel xls;
|
|
32
|
+
application/vnd.ms-powerpoint ppt;
|
|
33
|
+
application/vnd.wap.wmlc wmlc;
|
|
34
|
+
application/vnd.google-earth.kml+xml kml;
|
|
35
|
+
application/vnd.google-earth.kmz kmz;
|
|
36
|
+
application/x-7z-compressed 7z;
|
|
37
|
+
application/x-cocoa cco;
|
|
38
|
+
application/x-java-archive-diff jardiff;
|
|
39
|
+
application/x-java-jnlp-file jnlp;
|
|
40
|
+
application/x-makeself run;
|
|
41
|
+
application/x-perl pl pm;
|
|
42
|
+
application/x-pilot prc pdb;
|
|
43
|
+
application/x-rar-compressed rar;
|
|
44
|
+
application/x-redhat-package-manager rpm;
|
|
45
|
+
application/x-sea sea;
|
|
46
|
+
application/x-shockwave-flash swf;
|
|
47
|
+
application/x-stuffit sit;
|
|
48
|
+
application/x-tcl tcl tk;
|
|
49
|
+
application/x-x509-ca-cert der pem crt;
|
|
50
|
+
application/x-xpinstall xpi;
|
|
51
|
+
application/xhtml+xml xhtml;
|
|
52
|
+
application/zip zip;
|
|
53
|
+
|
|
54
|
+
application/octet-stream bin exe dll;
|
|
55
|
+
application/octet-stream deb;
|
|
56
|
+
application/octet-stream dmg;
|
|
57
|
+
application/octet-stream eot;
|
|
58
|
+
application/octet-stream iso img;
|
|
59
|
+
application/octet-stream msi msp msm;
|
|
60
|
+
application/ogg ogx;
|
|
61
|
+
|
|
62
|
+
audio/midi mid midi kar;
|
|
63
|
+
audio/mpeg mpga mpega mp2 mp3 m4a;
|
|
64
|
+
audio/ogg oga ogg spx;
|
|
65
|
+
audio/x-realaudio ra;
|
|
66
|
+
audio/webm weba;
|
|
67
|
+
|
|
68
|
+
video/3gpp 3gpp 3gp;
|
|
69
|
+
video/mp4 mp4;
|
|
70
|
+
video/mpeg mpeg mpg mpe;
|
|
71
|
+
video/ogg ogv;
|
|
72
|
+
video/quicktime mov;
|
|
73
|
+
video/webm webm;
|
|
74
|
+
video/x-flv flv;
|
|
75
|
+
video/x-mng mng;
|
|
76
|
+
video/x-ms-asf asx asf;
|
|
77
|
+
video/x-ms-wmv wmv;
|
|
78
|
+
video/x-msvideo avi;
|
|
79
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# deamon off is imporant to keep the docker container running
|
|
2
|
+
daemon off;
|
|
3
|
+
|
|
4
|
+
user www-data;
|
|
5
|
+
worker_processes 4;
|
|
6
|
+
|
|
7
|
+
error_log <%= @settings.internal_logs_path %>/error.log warn;
|
|
8
|
+
pid /var/run/nginx.pid;
|
|
9
|
+
|
|
10
|
+
events {
|
|
11
|
+
worker_connections 2048;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
http {
|
|
15
|
+
include <%= @settings.internal_conf_path %>/mime.types;
|
|
16
|
+
default_type application/octet-stream;
|
|
17
|
+
|
|
18
|
+
access_log <%= @settings.internal_logs_path %>/access.log;
|
|
19
|
+
|
|
20
|
+
sendfile on;
|
|
21
|
+
tcp_nopush on;
|
|
22
|
+
tcp_nodelay on;
|
|
23
|
+
|
|
24
|
+
keepalive_timeout 65;
|
|
25
|
+
|
|
26
|
+
gzip on;
|
|
27
|
+
gzip_http_version 1.0;
|
|
28
|
+
gzip_comp_level 2;
|
|
29
|
+
gzip_proxied any;
|
|
30
|
+
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
|
|
31
|
+
|
|
32
|
+
server_names_hash_bucket_size 64;
|
|
33
|
+
types_hash_max_size 2048;
|
|
34
|
+
types_hash_bucket_size 64;
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
include <%= @settings.internal_conf_path %>/conf.d/*.conf;
|
|
38
|
+
include <%= @settings.internal_sites_enabled_path %>/*;
|
|
39
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
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
|
+
ports_options,
|
|
103
|
+
image_name
|
|
104
|
+
].flatten
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def local_templates_path
|
|
108
|
+
"templates/nginx"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def local_site_templates_path
|
|
112
|
+
"#{local_templates_path}/sites-enabled"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
upstream unicorn {
|
|
2
|
+
server unix:<%= @settings.internal_sock_path %>/unicorn.socket fail_timeout=0;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
server {
|
|
7
|
+
listen 80;
|
|
8
|
+
location / {
|
|
9
|
+
rewrite ^/(.*)$ https://<%= @settings.domain %>/$1 redirect;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
server {
|
|
14
|
+
listen 443;
|
|
15
|
+
set $public_root <%= @settings.internal_data_path %>/public;
|
|
16
|
+
set $rails_root <%= @settings.internal_data_path %>;
|
|
17
|
+
|
|
18
|
+
root $public_root;
|
|
19
|
+
|
|
20
|
+
ssl on;
|
|
21
|
+
ssl_certificate <%= @settings.internal_conf_path %>/ssl.crt;
|
|
22
|
+
ssl_certificate_key <%= @settings.internal_conf_path %>/ssl.key;
|
|
23
|
+
ssl_ciphers HIGH;
|
|
24
|
+
ssl_protocols SSLv3 TLSv1;
|
|
25
|
+
ssl_prefer_server_ciphers on;
|
|
26
|
+
|
|
27
|
+
if (-f $document_root/system/maintenance.html) {
|
|
28
|
+
rewrite ^(.*)$ /system/maintenance.html last;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
location / {
|
|
33
|
+
client_max_body_size 4096M;
|
|
34
|
+
proxy_read_timeout 900;
|
|
35
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
36
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
37
|
+
proxy_set_header X-Forwarded-Proto https;
|
|
38
|
+
proxy_set_header Host $http_host;
|
|
39
|
+
proxy_redirect off;
|
|
40
|
+
proxy_max_temp_file_size 0;
|
|
41
|
+
proxy_set_header X-Sendfile-Type X-Accel-Redirect;
|
|
42
|
+
proxy_set_header X-Accel-Remote-Mapping webdav_redirect;
|
|
43
|
+
proxy_set_header X-Accel-Mapping $rails_root=$rails_root;
|
|
44
|
+
|
|
45
|
+
if (-f $request_filename) {
|
|
46
|
+
expires max;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (!-f $request_filename) {
|
|
51
|
+
proxy_pass http://unicorn;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
location ~ /files/(.*) {
|
|
57
|
+
alias $rails_root/$1;
|
|
58
|
+
internal;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
error_page 500 502 503 504 /500.html;
|
|
62
|
+
location = /500.html {
|
|
63
|
+
root $public_root;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Remove this line and add your cert here
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Remove this line and add your key here
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
|
|
3
|
+
require './nginxinator.rb' if File.exists?('./nginxinator.rb')
|
|
4
|
+
|
|
5
|
+
## NOTES:
|
|
6
|
+
# tasks without 'desc' description lines are for manual debugging of this
|
|
7
|
+
# deployment code.
|
|
8
|
+
#
|
|
9
|
+
# we've choosen to only pass strings (if anything) to tasks. this allows tasks to be
|
|
10
|
+
# debugged individually. only private methods take ruby objects.
|
|
11
|
+
|
|
12
|
+
namespace :nginx do
|
|
13
|
+
|
|
14
|
+
desc "Idempotently setup one or more Nginx instances using values in ./nginxinator.rb"
|
|
15
|
+
task :setup => :ensure_setup do
|
|
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
|
|
19
|
+
Rake::Task['nginx:ensure_access_docker'].invoke
|
|
20
|
+
Rake::Task['nginx:open_firewall'].invoke
|
|
21
|
+
# 'on', 'run_locally', 'as', 'execute', 'info', 'warn', and 'fatal' are from SSHKit
|
|
22
|
+
on "#{settings.ssh_user}@#{settings.domain}" do
|
|
23
|
+
config_file_changed = false
|
|
24
|
+
settings.config_files.each do |config_file|
|
|
25
|
+
if config_file_differs?(settings, settings.local_templates_path, settings.external_conf_path, config_file)
|
|
26
|
+
warn "Config file #{config_file} on #{settings.domain} is being updated."
|
|
27
|
+
Rake::Task['nginx:install_config_file'].invoke(settings.local_templates_path, settings.external_conf_path, config_file)
|
|
28
|
+
Rake::Task['nginx:install_config_file'].reenable
|
|
29
|
+
config_file_changed = true
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
settings.sites_enabled.each do |config_file|
|
|
33
|
+
if config_file_differs?(settings, settings.local_site_templates_path, settings.external_sites_enabled_path, config_file)
|
|
34
|
+
warn "Config file #{config_file} on #{settings.domain} is being updated."
|
|
35
|
+
Rake::Task['nginx:install_config_file'].invoke(settings.local_site_templates_path, settings.external_sites_enabled_path, config_file)
|
|
36
|
+
Rake::Task['nginx:install_config_file'].reenable
|
|
37
|
+
config_file_changed = true
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
unless container_exists?(settings.container_name)
|
|
41
|
+
Rake::Task['nginx:create_container'].invoke
|
|
42
|
+
else
|
|
43
|
+
unless container_is_running?(settings.container_name)
|
|
44
|
+
Rake::Task['nginx:start_container'].invoke
|
|
45
|
+
else
|
|
46
|
+
if config_file_changed
|
|
47
|
+
Rake::Task['nginx:restart_container'].invoke
|
|
48
|
+
else
|
|
49
|
+
info "No config file changes for #{settings.container_name} and it is already running; we're setup!"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
desc "Check the status of the Nginx instance."
|
|
57
|
+
task :status => :ensure_setup do |t, args|
|
|
58
|
+
settings = @settings
|
|
59
|
+
on "#{settings.ssh_user}@#{settings.domain}" do
|
|
60
|
+
info ""
|
|
61
|
+
if container_exists?(settings.container_name)
|
|
62
|
+
info "#{settings.container_name} exists on #{settings.domain}"
|
|
63
|
+
info ""
|
|
64
|
+
if container_is_running?(settings.container_name)
|
|
65
|
+
info "#{settings.container_name} is running on #{settings.domain}"
|
|
66
|
+
info ""
|
|
67
|
+
else
|
|
68
|
+
info "#{settings.container_name} is not running on #{settings.domain}"
|
|
69
|
+
info ""
|
|
70
|
+
end
|
|
71
|
+
else
|
|
72
|
+
info "#{settings.container_name} does not exist on #{settings.domain}"
|
|
73
|
+
info ""
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
task :create_container => :ensure_setup do |t, args|
|
|
79
|
+
settings = @settings
|
|
80
|
+
on "#{settings.ssh_user}@#{settings.domain}" do
|
|
81
|
+
warn "Starting a new container named #{settings.container_name} on #{settings.domain}"
|
|
82
|
+
execute("docker", "run", settings.docker_run_command)
|
|
83
|
+
sleep 2
|
|
84
|
+
fatal stay_running_message(settings) and raise unless container_is_running?(settings.container_name)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
task :start_container => :ensure_setup do |t, args|
|
|
89
|
+
settings = @settings
|
|
90
|
+
on "#{settings.ssh_user}@#{settings.domain}" do
|
|
91
|
+
warn "Starting an existing but non-running container named #{settings.container_name}"
|
|
92
|
+
execute("docker", "start", settings.container_name)
|
|
93
|
+
sleep 2
|
|
94
|
+
fatal stay_running_message(settings) and raise unless container_is_running?(settings.container_name)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
task :restart_container => :ensure_setup do |t, args|
|
|
99
|
+
settings = @settings
|
|
100
|
+
on "#{settings.ssh_user}@#{settings.domain}" do
|
|
101
|
+
warn "Restarting a running container named #{settings.container_name}"
|
|
102
|
+
execute("docker", "restart", settings.container_name)
|
|
103
|
+
sleep 2
|
|
104
|
+
fatal stay_running_message(settings) and raise unless container_is_running?(settings.container_name)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
task :ensure_access_docker => :ensure_setup do |t, args|
|
|
109
|
+
settings = @settings
|
|
110
|
+
on "#{settings.ssh_user}@#{settings.domain}" do
|
|
111
|
+
as settings.ssh_user do
|
|
112
|
+
unless test("bash", "-c", "\"docker", "ps", "&>", "/dev/null\"")
|
|
113
|
+
execute("sudo", "usermod", "-a", "-G", "docker", settings.ssh_user)
|
|
114
|
+
fatal "Newly added to docker group, this run will fail, next run will succeed. Simply try again."
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
task :install_config_file, [:template_path, :config_path, :config_file] => :ensure_setup do |t, args|
|
|
121
|
+
settings = @settings
|
|
122
|
+
on "#{settings.ssh_user}@#{settings.domain}" do
|
|
123
|
+
as 'root' do
|
|
124
|
+
execute("mkdir", "-p", args.config_path) unless test("test", "-d", args.config_path)
|
|
125
|
+
generated_config_file = generate_config_file(settings, "#{args.template_path}/#{args.config_file}.erb")
|
|
126
|
+
upload! StringIO.new(generated_config_file), "/tmp/#{args.config_file}"
|
|
127
|
+
execute("mv", "/tmp/#{args.config_file}", "#{args.config_path}/#{args.config_file}")
|
|
128
|
+
execute("chown", "-R", "root:root", args.config_path)
|
|
129
|
+
execute("chmod", "-R", "700", args.config_path)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
task :open_firewall => :ensure_setup do |t, args|
|
|
135
|
+
settings = @settings
|
|
136
|
+
on "#{settings.ssh_user}@#{settings.domain}" do
|
|
137
|
+
as "root" do
|
|
138
|
+
if test "ufw", "status"
|
|
139
|
+
settings.publish_ports.collect { |port_set| port_set['external'] }.each do |port|
|
|
140
|
+
raise "Error during opening UFW firewall" unless test("ufw", "allow", "#{port}/tcp")
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
private
|
|
148
|
+
|
|
149
|
+
def stay_running_message(settings)
|
|
150
|
+
"Container #{settings.container_name} on #{settings.domain} did not stay running more than 2 seconds"
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def config_file_differs?(settings, local_templates_path, external_config_path, config_file)
|
|
154
|
+
generated_config_file = generate_config_file(settings, "#{local_templates_path}/#{config_file}.erb")
|
|
155
|
+
as 'root' do
|
|
156
|
+
config_file_path = "#{external_config_path}/#{config_file}"
|
|
157
|
+
if file_exists?(config_file_path)
|
|
158
|
+
capture("cat", config_file_path).chomp != generated_config_file.chomp
|
|
159
|
+
else
|
|
160
|
+
true
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def generate_config_file(settings, template_file_path)
|
|
166
|
+
@settings = settings # needed for ERB
|
|
167
|
+
template_path = File.expand_path(template_file_path)
|
|
168
|
+
ERB.new(File.new(template_path).read).result(binding)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def container_exists?(container_name)
|
|
172
|
+
test "docker", "inspect", container_name, ">", "/dev/null"
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def container_is_running?(container_name)
|
|
176
|
+
(capture "docker", "inspect",
|
|
177
|
+
"--format='{{.State.Running}}'",
|
|
178
|
+
container_name).strip == "true"
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def file_exists?(file_name_path)
|
|
182
|
+
test "[", "-f", file_name_path, "]"
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: nginxinator
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- david amick
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2014-10-16 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rake
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - '='
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 10.3.2
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - '='
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 10.3.2
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: sshkit
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - '='
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: 1.5.1
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - '='
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: 1.5.1
|
|
41
|
+
description: An Opinionated Nginx Deployment gem
|
|
42
|
+
email: davidamick@ctisolutionsinc.com
|
|
43
|
+
executables: []
|
|
44
|
+
extensions: []
|
|
45
|
+
extra_rdoc_files: []
|
|
46
|
+
files:
|
|
47
|
+
- lib/nginxinator.rb
|
|
48
|
+
- lib/nginxinator/nginx.rb
|
|
49
|
+
- lib/nginxinator/config.rb
|
|
50
|
+
- lib/nginxinator/examples/nginxinator_example.rb
|
|
51
|
+
- lib/nginxinator/examples/nginx_example.conf.erb
|
|
52
|
+
- lib/nginxinator/examples/site-enabled_example.erb
|
|
53
|
+
- lib/nginxinator/examples/ssl.crt_example.erb
|
|
54
|
+
- lib/nginxinator/examples/ssl.key_example.erb
|
|
55
|
+
- lib/nginxinator/examples/mime.types_example.erb
|
|
56
|
+
- lib/nginxinator/examples/Dockerfile
|
|
57
|
+
homepage: https://github.com/snarlysodboxer/nginxinator
|
|
58
|
+
licenses:
|
|
59
|
+
- GNU
|
|
60
|
+
metadata: {}
|
|
61
|
+
post_install_message:
|
|
62
|
+
rdoc_options: []
|
|
63
|
+
require_paths:
|
|
64
|
+
- lib
|
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - '>='
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: 1.9.3
|
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - '>='
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '0'
|
|
75
|
+
requirements: []
|
|
76
|
+
rubyforge_project:
|
|
77
|
+
rubygems_version: 2.0.2
|
|
78
|
+
signing_key:
|
|
79
|
+
specification_version: 4
|
|
80
|
+
summary: Deploy Nginx
|
|
81
|
+
test_files: []
|