luban-rack 0.1.0 → 0.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/luban/deployment/applications/rack/base.rb +6 -2
- data/lib/luban/deployment/applications/rack/configurator.rb +3 -10
- data/lib/luban/deployment/applications/rack/controller.rb +1 -24
- data/lib/luban/deployment/applications/rack/paths.rb +19 -7
- data/lib/luban/deployment/applications/rack/templates/thin/thin.logrotate.erb +1 -1
- data/lib/luban/deployment/applications/rack/templates/thin/thin.monitrc.erb +16 -9
- data/lib/luban/deployment/applications/rack/templates/thin/thin.yml.erb +3 -26
- data/lib/luban/deployment/applications/rack/version.rb +1 -1
- data/lib/luban/deployment/applications/rack/web_server.rb +45 -0
- data/lib/luban/deployment/applications/rack/web_servers/thin.rb +39 -0
- data/lib/luban/deployment/applications/rack.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75dff673fdfb8b910f2c8a5fc1c9a831cd5c313f
|
4
|
+
data.tar.gz: 6e16e73badf9284fa25dbc3957382089f99ff2c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29bd4d9a3c43e62e1b9c1887eddffe4328039788f8c00e9197c241d455b64690cda4cee8bf2b2650a48d62d320bf715242d4f46026c4346998b7ef4e4fa813d6
|
7
|
+
data.tar.gz: c582a1f63b6871c4209e2b2836e792f1f16e905fa21730b194b4d0e7ec6f9c2f17114369ea33b9252bc0a24619579a5888508abd63979772f70fd99091c3f768
|
data/CHANGELOG.md
CHANGED
@@ -11,17 +11,21 @@ module Luban
|
|
11
11
|
|
12
12
|
parameter :web_server
|
13
13
|
|
14
|
+
def power_by(server, **opts)
|
15
|
+
web_server name: server, opts: opts
|
16
|
+
end
|
17
|
+
|
14
18
|
protected
|
15
19
|
|
16
20
|
def set_default_rack_parameters
|
17
|
-
set_default :web_server, DefaultWebServer
|
21
|
+
set_default :web_server, name: DefaultWebServer, opts: {}
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
21
25
|
include Parameters
|
22
26
|
|
23
27
|
def default_templates_path
|
24
|
-
@default_templates_path ||= super(__FILE__).join(web_server.to_s)
|
28
|
+
@default_templates_path ||= super(__FILE__).join(web_server[:name].to_s)
|
25
29
|
end
|
26
30
|
|
27
31
|
dispatch_task :phased_restart_process, to: :controller
|
@@ -3,21 +3,14 @@ module Luban
|
|
3
3
|
module Applications
|
4
4
|
class Rack
|
5
5
|
class Configurator < Luban::Deployment::Application::Configurator
|
6
|
-
using Luban::CLI::CoreRefinements
|
7
|
-
|
8
6
|
include Paths
|
9
7
|
include Parameters
|
8
|
+
include WebServer
|
10
9
|
|
11
10
|
protected
|
12
11
|
|
13
|
-
def
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def load_web_server
|
18
|
-
require_relative "web_servers/#{web_server}"
|
19
|
-
server_module = WebServers.const_get(web_server.camelcase).const_get('Common')
|
20
|
-
singleton_class.send(:prepend, server_module)
|
12
|
+
def web_server_module(path)
|
13
|
+
@web_server_module ||= super.const_get('Common')
|
21
14
|
end
|
22
15
|
end
|
23
16
|
end
|
@@ -3,23 +3,10 @@ module Luban
|
|
3
3
|
module Applications
|
4
4
|
class Rack
|
5
5
|
class Controller < Luban::Deployment::Application::Controller
|
6
|
-
using Luban::CLI::CoreRefinements
|
7
|
-
|
8
6
|
include Luban::Deployment::Service::Controller::Cluster
|
9
7
|
include Paths
|
10
8
|
include Parameters
|
11
|
-
|
12
|
-
def release_matched?
|
13
|
-
release_tag =~ /^#{Regexp.escape(application_version)}/
|
14
|
-
end
|
15
|
-
|
16
|
-
def release_tag
|
17
|
-
@release_tag ||= release_path.basename
|
18
|
-
end
|
19
|
-
|
20
|
-
def release_path
|
21
|
-
@release_path ||= Pathname.new(readlink(app_path.join('app')))
|
22
|
-
end
|
9
|
+
include WebServer
|
23
10
|
|
24
11
|
def restart_process(phased: false)
|
25
12
|
if process_stopped?
|
@@ -46,16 +33,6 @@ module Luban
|
|
46
33
|
|
47
34
|
protected
|
48
35
|
|
49
|
-
def init
|
50
|
-
load_web_server
|
51
|
-
end
|
52
|
-
|
53
|
-
def load_web_server
|
54
|
-
require_relative "web_servers/#{web_server}"
|
55
|
-
server_module = WebServers.const_get(web_server.camelcase)
|
56
|
-
singleton_class.send(:prepend, server_module)
|
57
|
-
end
|
58
|
-
|
59
36
|
def restart_process!
|
60
37
|
capture("#{restart_command} 2>&1")
|
61
38
|
end
|
@@ -4,19 +4,31 @@ module Luban
|
|
4
4
|
class Rack
|
5
5
|
module Paths
|
6
6
|
def log_file_name
|
7
|
-
@log_file_name ||= "#{web_server}.log"
|
7
|
+
@log_file_name ||= "#{web_server[:name]}.log"
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
10
|
+
def pid_file_path(n = nil)
|
11
|
+
if n.nil?
|
12
|
+
@pid_file_path ||= pids_path.join(pid_file_name)
|
13
|
+
else
|
14
|
+
pids_path.join(pid_file_name(n))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def pid_file_name(n = nil)
|
19
|
+
if n.nil?
|
20
|
+
@pid_file_name ||= "#{web_server[:name]}.pid"
|
21
|
+
else
|
22
|
+
"#{web_server[:name]}.#{n + web_server[:opts][:port].to_i}.pid"
|
23
|
+
end
|
12
24
|
end
|
13
25
|
|
14
26
|
def pid_file_pattern
|
15
|
-
@pid_file_pattern ||= "#{web_server}.*.pid"
|
27
|
+
@pid_file_pattern ||= "#{web_server[:name]}.*.pid"
|
16
28
|
end
|
17
29
|
|
18
30
|
def control_file_name
|
19
|
-
@control_file_name ||= "#{web_server}.#{control_file_extname}"
|
31
|
+
@control_file_name ||= "#{web_server[:name]}.#{control_file_extname}"
|
20
32
|
end
|
21
33
|
|
22
34
|
def control_file_extname
|
@@ -24,7 +36,7 @@ module Luban
|
|
24
36
|
end
|
25
37
|
|
26
38
|
def logrotate_file_name
|
27
|
-
@logrotate_file_name ||= "#{web_server}.logrotate"
|
39
|
+
@logrotate_file_name ||= "#{web_server[:name]}.logrotate"
|
28
40
|
end
|
29
41
|
|
30
42
|
def sockets_path
|
@@ -36,7 +48,7 @@ module Luban
|
|
36
48
|
end
|
37
49
|
|
38
50
|
def socket_file_name
|
39
|
-
@socket_file_name ||= "#{web_server}.sock"
|
51
|
+
@socket_file_name ||= "#{web_server[:name]}.sock"
|
40
52
|
end
|
41
53
|
|
42
54
|
def ruby_bin_path
|
@@ -1,14 +1,21 @@
|
|
1
1
|
# Monit Monit configuration for Thin
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
<% opts = web_server[:opts] -%>
|
4
|
+
<% opts[:servers].times do |n| -%>
|
5
|
+
check process <%= service_entry %>.<%= web_server[:name] %>.<%= n %>
|
6
|
+
with pidfile <%= pid_file_path(n) %>
|
7
|
+
group <%= service_entry %>
|
8
|
+
onreboot laststate
|
9
|
+
start program = "/bin/bash -c 'sleep 1; <%= start_command %> -o <%=n %>'"
|
10
|
+
stop program = "/bin/bash -c '<%= stop_command %> -o <%=n %>'"
|
7
11
|
if totalmem is greater than 150.0 MB for 40 cycles then alert
|
8
|
-
if
|
9
|
-
if failed port
|
10
|
-
|
11
|
-
if
|
12
|
-
|
12
|
+
<%- if opts[:port] -%>
|
13
|
+
if failed port <%= opts[:port].to_i + n %> for 4 times within 8 cycles then restart
|
14
|
+
<%- end -%>
|
15
|
+
<%- if opts[:socket] -%>
|
16
|
+
if failed unixsocket <%= socket_file_path(n) %> for 4 times within 8 cycles then restart
|
17
|
+
<%- end -%>
|
13
18
|
if cpu is greater than 80% for 20 cycles then alert
|
14
19
|
if loadavg(5min) greater than 10 for 40 cycles then alert
|
20
|
+
|
21
|
+
<% end -%>
|
@@ -1,27 +1,4 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
# socket: <%= socket_file_path %>
|
6
|
-
chdir: <%= release_path %>
|
7
|
-
|
8
|
-
# Adapter options
|
9
|
-
environment: <%= stage %>
|
10
|
-
|
11
|
-
# Daemon options
|
12
|
-
daemonize: true
|
13
|
-
log: <%= log_file_path %>
|
14
|
-
pid: <%= pid_file_path %>
|
15
|
-
tag: <%= "#{env_name}:#{release_tag}" %>
|
16
|
-
|
17
|
-
# Cluster options
|
18
|
-
servers: 4
|
19
|
-
wait: 30
|
20
|
-
|
21
|
-
# Tuning options
|
22
|
-
# timeout: 30
|
23
|
-
# max_conns: 1024
|
24
|
-
# max_persistent_conns: 100
|
25
|
-
|
26
|
-
# Common options
|
27
|
-
# trace: true
|
2
|
+
<% web_server[:opts].each_pair do |key, value| -%>
|
3
|
+
<%= key %>: <%= value.inspect %>
|
4
|
+
<% end %>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Luban
|
2
|
+
module Deployment
|
3
|
+
module Applications
|
4
|
+
class Rack
|
5
|
+
module WebServer
|
6
|
+
using Luban::CLI::CoreRefinements
|
7
|
+
|
8
|
+
def default_web_server_options
|
9
|
+
raise NotImplementedError, "#{self.class.name}##{__method__} is an abstract method."
|
10
|
+
end
|
11
|
+
|
12
|
+
protected
|
13
|
+
|
14
|
+
def init
|
15
|
+
load_web_server
|
16
|
+
end
|
17
|
+
|
18
|
+
def load_web_server
|
19
|
+
require web_server_require_path
|
20
|
+
singleton_class.send(:prepend, web_server_module(web_server_require_path))
|
21
|
+
set_default_web_server_options
|
22
|
+
rescue LoadError => e
|
23
|
+
abort "Aborted! Failed to load web server #{web_server[:name].inspect}."
|
24
|
+
end
|
25
|
+
|
26
|
+
def web_server_require_path
|
27
|
+
@web_server_require_path ||= web_server_require_root.join(web_server[:name].to_s)
|
28
|
+
end
|
29
|
+
|
30
|
+
def web_server_require_root
|
31
|
+
@web_server_require_root ||= Pathname.new("luban/deployment/applications/rack/web_servers")
|
32
|
+
end
|
33
|
+
|
34
|
+
def web_server_module(path)
|
35
|
+
@web_server_module ||= Object.const_get(path.to_s.camelcase, false)
|
36
|
+
end
|
37
|
+
|
38
|
+
def set_default_web_server_options
|
39
|
+
web_server[:opts] = default_web_server_options.merge(web_server[:opts])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -5,6 +5,32 @@ module Luban
|
|
5
5
|
module WebServers
|
6
6
|
module Thin
|
7
7
|
module Common
|
8
|
+
def default_web_server_options
|
9
|
+
@default_web_server_options ||= {
|
10
|
+
# Server options
|
11
|
+
address: "0.0.0.0",
|
12
|
+
port: 3000,
|
13
|
+
socket: socket_file_path.to_s,
|
14
|
+
chdir: release_path.to_s,
|
15
|
+
# Adapter options
|
16
|
+
environment: stage,
|
17
|
+
# Daemon options
|
18
|
+
daemonize: true,
|
19
|
+
log: log_file_path.to_s,
|
20
|
+
pid: pid_file_path.to_s,
|
21
|
+
tag: "#{env_name}:#{release_tag}",
|
22
|
+
# Cluster options
|
23
|
+
servers: 4,
|
24
|
+
wait: 30,
|
25
|
+
# Tuning options
|
26
|
+
timeout: 30,
|
27
|
+
max_conns: 1024,
|
28
|
+
max_persistent_conns: 100,
|
29
|
+
# Common options
|
30
|
+
trace: true
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
8
34
|
def control_file_extname
|
9
35
|
@control_file_extname ||= "yml"
|
10
36
|
end
|
@@ -24,6 +50,19 @@ module Luban
|
|
24
50
|
def process_pattern
|
25
51
|
@process_pattern ||= "^thin server.+\\[#{Regexp.escape(env_name)}:#{Regexp.escape(application_version)}-[0-9a-f]+\\]"
|
26
52
|
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
|
56
|
+
def set_default_web_server_options
|
57
|
+
super.tap do |opts|
|
58
|
+
if opts.delete(:unix_socket)
|
59
|
+
opts.delete(:address)
|
60
|
+
opts.delete(:port)
|
61
|
+
else
|
62
|
+
opts.delete(:socket)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
27
66
|
end
|
28
67
|
|
29
68
|
include Common
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: luban-rack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rubyist Chi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: luban
|
@@ -92,6 +92,7 @@ files:
|
|
92
92
|
- lib/luban/deployment/applications/rack/templates/thin/thin.monitrc.erb
|
93
93
|
- lib/luban/deployment/applications/rack/templates/thin/thin.yml.erb
|
94
94
|
- lib/luban/deployment/applications/rack/version.rb
|
95
|
+
- lib/luban/deployment/applications/rack/web_server.rb
|
95
96
|
- lib/luban/deployment/applications/rack/web_servers/thin.rb
|
96
97
|
- lib/luban/rack.rb
|
97
98
|
- luban-rack.gemspec
|