rubber 2.1.0 → 2.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.
- data/.travis.yml +2 -2
- data/CHANGELOG +33 -0
- data/lib/rubber/cloud/fog.rb +12 -14
- data/lib/rubber/configuration.rb +1 -1
- data/lib/rubber/environment.rb +12 -3
- data/lib/rubber/recipes/rubber/setup.rb +7 -1
- data/lib/rubber/recipes/rubber/utils.rb +4 -1
- data/lib/rubber/version.rb +1 -2
- data/rubber.gemspec +1 -1
- data/templates/apache/config/rubber/deploy-apache.rb +13 -2
- data/templates/base/config/rubber/rubber.yml +9 -2
- data/templates/complete_passenger/config/rubber/role/haproxy/haproxy-passenger.conf +8 -1
- data/templates/couchbase/config/rubber/deploy-couchbase.rb +105 -0
- data/templates/couchbase/config/rubber/role/couchbase/crontab +8 -0
- data/templates/couchbase/config/rubber/rubber-couchbase.yml +25 -0
- data/templates/couchbase/templates.rb +3 -0
- data/templates/couchbase/templates.yml +1 -0
- data/templates/graylog/config/rubber/deploy-graylog.rb +5 -1
- data/templates/graylog/config/rubber/role/graylog_web/graylog_web-upstart.conf +1 -1
- data/templates/graylog/config/rubber/rubber-graylog.yml +3 -3
- data/templates/jenkins/config/rubber/deploy-jenkins.rb +37 -24
- data/templates/jenkins/config/rubber/role/jenkins/crontab +7 -0
- data/templates/jenkins/config/rubber/role/jenkins/github-deploy-key.pem +2 -0
- data/templates/jenkins/config/rubber/role/jenkins/github-deploy-key.pem.pub +2 -0
- data/templates/jenkins/config/rubber/role/jenkins/jenkins-apache-vhost.conf +1 -1
- data/templates/jenkins/config/rubber/rubber-jenkins.yml +1 -1
- data/templates/monit/config/rubber/role/couchbase/monit-couchbase.conf +7 -0
- data/templates/monit/config/rubber/role/resque_scheduler/monit-resque_scheduler.conf +10 -0
- data/templates/mysql/config/rubber/deploy-mysql.rb +1 -0
- data/templates/passenger/config/rubber/deploy-passenger.rb +43 -4
- data/templates/passenger/config/rubber/rubber-passenger.yml +4 -1
- data/templates/passenger_nginx/config/rubber/role/passenger_nginx/application.conf +13 -0
- data/templates/torquebox/config/rubber/role/torquebox/standalone-ha.xml +60 -54
- data/templates/torquebox/config/rubber/role/torquebox/standalone.conf +1 -0
- data/templates/torquebox/config/rubber/rubber-torquebox.yml +6 -4
- data/test/cloud/aws_test.rb +1 -1
- data/test/cloud/fog_test.rb +1 -1
- data/test/dns/aws_test.rb +28 -4
- data/test/dns/zerigo_test.rb +2 -2
- data/test/environment_test.rb +28 -8
- data/test/fixtures/basic/rubber.yml +5 -0
- data/test/instance_test.rb +1 -1
- metadata +14 -6
data/.travis.yml
CHANGED
data/CHANGELOG
CHANGED
@@ -1,3 +1,36 @@
|
|
1
|
+
2.1.1 (10/02/2012)
|
2
|
+
------------------
|
3
|
+
|
4
|
+
New Features:
|
5
|
+
============
|
6
|
+
[base] add ability to override by environment in rubber*.yml <f4c4af3>
|
7
|
+
[couchbase, monit] add couchbase template <550dff4>
|
8
|
+
|
9
|
+
Improvements:
|
10
|
+
============
|
11
|
+
[core] Updated sudo_script to sudo to any user. <288ef5d>
|
12
|
+
[apache, jenkins] create an apache bootstrap so jenkins template doesn't have to duplicate logic <5862791>
|
13
|
+
[complete_passenger, passenger] do a rolling passenger restart by tieing into apache rolling restart <065d757>
|
14
|
+
[complete_passenger] dont do health check over ssl by default (Fails with self signed cert) <a5a8da7>
|
15
|
+
[graylog] Updated graylog from 0.9.6 to 0.9.6p1. <864795c>
|
16
|
+
[graylog] Use puma instead of passenger for graylog-web, since it works much better with JRuby. <7419705>
|
17
|
+
[jenkins] Added support for backing up Jenkins. <a44162d>
|
18
|
+
[jenkins] Fixed Jenkins config. <bbaa6f4>
|
19
|
+
[jenkins] Make sure we have the header module enabled for the config to work. <93d03d8>
|
20
|
+
[jenkins] The module is "headers", not "header". <4057334>
|
21
|
+
[passenger] Bumped rubber from 3.0.12 to 3.0.15. <bc408f1>
|
22
|
+
[passenger_nginx] Updated Nginx config to improve performance of asset pipeline. <7184327>
|
23
|
+
[torquebox] Updated TorqueBox config from 2.0.3 to 2.1.0. <13a0268>
|
24
|
+
|
25
|
+
Bug Fixes:
|
26
|
+
=========
|
27
|
+
[core] fix merging of alias records <d314857>
|
28
|
+
[core] Refactor to avoid fog deprecation, fixes #222 <43ea42f>
|
29
|
+
[core] assign defaults for partial records in rubber-dns.yml when running setup_dns_records <a72a701>
|
30
|
+
[monit] monit check for resque scheduler - fixes #221 <34a4fde>
|
31
|
+
[mysql] Delete anonymous MySQL user when bootstrapping the db. Fixes #185 (pull request #212) <ce84ff2>
|
32
|
+
[torquebox] Always use the rubber system JRuby with Torquebox. <9c03a02>
|
33
|
+
|
1
34
|
2.1.0 (08/20/2012)
|
2
35
|
------------------
|
3
36
|
|
data/lib/rubber/cloud/fog.rb
CHANGED
@@ -171,30 +171,28 @@ module Rubber
|
|
171
171
|
|
172
172
|
def add_security_group_rule(group_name, protocol, from_port, to_port, source)
|
173
173
|
group = @compute_provider.security_groups.get(group_name)
|
174
|
+
opts = {:ip_protocol => protocol || 'tcp'}
|
175
|
+
|
174
176
|
if source.instance_of? Hash
|
175
|
-
|
176
|
-
groupstr = "#{source[:account]}:#{source[:name]}"
|
177
|
-
group.authorize_port_range(from_port.to_i..to_port.to_i, :ip_protocol => protocol, :group => groupstr)
|
178
|
-
else
|
179
|
-
group.authorize_group_and_owner(source[:name], source[:account])
|
180
|
-
end
|
177
|
+
opts[:group] = {source[:account] => source[:name]}
|
181
178
|
else
|
182
|
-
|
179
|
+
opts[:cidr_ip] = source
|
183
180
|
end
|
181
|
+
|
182
|
+
group.authorize_port_range(from_port.to_i..to_port.to_i, opts)
|
184
183
|
end
|
185
184
|
|
186
185
|
def remove_security_group_rule(group_name, protocol, from_port, to_port, source)
|
187
186
|
group = @compute_provider.security_groups.get(group_name)
|
187
|
+
opts = {:ip_protocol => protocol || 'tcp'}
|
188
|
+
|
188
189
|
if source.instance_of? Hash
|
189
|
-
|
190
|
-
groupstr = "#{source[:account]}:#{source[:name]}"
|
191
|
-
group.revoke_port_range(from_port.to_i..to_port.to_i, :ip_protocol => protocol, :group => groupstr)
|
192
|
-
else
|
193
|
-
group.revoke_group_and_owner(source[:name], source[:account])
|
194
|
-
end
|
190
|
+
opts[:group] = {source[:account] => source[:name]}
|
195
191
|
else
|
196
|
-
|
192
|
+
opts[:cidr_ip] = source
|
197
193
|
end
|
194
|
+
|
195
|
+
group.revoke_port_range(from_port.to_i..to_port.to_i, opts)
|
198
196
|
end
|
199
197
|
|
200
198
|
def destroy_security_group(group_name)
|
data/lib/rubber/configuration.rb
CHANGED
data/lib/rubber/environment.rb
CHANGED
@@ -9,11 +9,14 @@ module Rubber
|
|
9
9
|
# the host/role passed into bind
|
10
10
|
class Environment
|
11
11
|
attr_reader :config_root
|
12
|
+
attr_reader :config_env
|
12
13
|
attr_reader :config_files
|
13
14
|
attr_reader :config_secret
|
14
15
|
|
15
|
-
def initialize(config_root)
|
16
|
+
def initialize(config_root, env)
|
16
17
|
@config_root = config_root
|
18
|
+
@config_env = env
|
19
|
+
|
17
20
|
@config_files = ["#{@config_root}/rubber.yml"]
|
18
21
|
@config_files += Dir["#{@config_root}/rubber-*.yml"].sort
|
19
22
|
|
@@ -71,7 +74,7 @@ module Rubber
|
|
71
74
|
end
|
72
75
|
|
73
76
|
def bind(roles = nil, host = nil)
|
74
|
-
BoundEnv.new(@items, roles, host)
|
77
|
+
BoundEnv.new(@items, roles, host, config_env)
|
75
78
|
end
|
76
79
|
|
77
80
|
# combine old and new into a single value:
|
@@ -160,10 +163,12 @@ module Rubber
|
|
160
163
|
class BoundEnv < HashValueProxy
|
161
164
|
attr_reader :roles
|
162
165
|
attr_reader :host
|
166
|
+
attr_reader :env
|
163
167
|
|
164
|
-
def initialize(global, roles, host)
|
168
|
+
def initialize(global, roles, host, env)
|
165
169
|
@roles = roles
|
166
170
|
@host = host
|
171
|
+
@env = env
|
167
172
|
bound_global = bind_config(global)
|
168
173
|
super(nil, bound_global)
|
169
174
|
end
|
@@ -176,12 +181,16 @@ module Rubber
|
|
176
181
|
def bind_config(global)
|
177
182
|
global = global.clone()
|
178
183
|
role_overrides = global.delete("roles") || {}
|
184
|
+
env_overrides = global.delete("environments") || {}
|
179
185
|
host_overrides = global.delete("hosts") || {}
|
180
186
|
Array(roles).each do |role|
|
181
187
|
Array(role_overrides[role]).each do |k, v|
|
182
188
|
global[k] = Environment.combine(global[k], v)
|
183
189
|
end
|
184
190
|
end
|
191
|
+
Array(env_overrides[env]).each do |k, v|
|
192
|
+
global[k] = Environment.combine(global[k], v)
|
193
|
+
end
|
185
194
|
Array(host_overrides[host]).each do |k, v|
|
186
195
|
global[k] = Environment.combine(global[k], v)
|
187
196
|
end
|
@@ -173,7 +173,12 @@ namespace :rubber do
|
|
173
173
|
record[:type] ||= r[:type]
|
174
174
|
record[:ttl] ||= r[:ttl] if r[:ttl]
|
175
175
|
record[:data] ||= []
|
176
|
-
|
176
|
+
case r[:data]
|
177
|
+
when nil then ;
|
178
|
+
when Array then record[:data].concat(r[:data])
|
179
|
+
else
|
180
|
+
record[:data] << r[:data]
|
181
|
+
end
|
177
182
|
end
|
178
183
|
return record
|
179
184
|
end
|
@@ -194,6 +199,7 @@ namespace :rubber do
|
|
194
199
|
rubber_records = {}
|
195
200
|
records.each do |record|
|
196
201
|
record = Rubber::Util.symbolize_keys(record)
|
202
|
+
record = provider.setup_opts(record) # assign defaults
|
197
203
|
key = record_key(record)
|
198
204
|
rubber_records[key] ||= []
|
199
205
|
rubber_records[key] << record
|
@@ -170,9 +170,12 @@ namespace :rubber do
|
|
170
170
|
end
|
171
171
|
|
172
172
|
def sudo_script(name, contents, opts = {})
|
173
|
+
user = opts.delete(:as)
|
173
174
|
args = opts.delete(:script_args)
|
174
175
|
script = prepare_script(name, contents)
|
175
|
-
|
176
|
+
|
177
|
+
sudo_args = user ? "-H -u #{user}" : ""
|
178
|
+
run "#{sudo} #{sudo_args} bash -l #{script} #{args}", opts
|
176
179
|
end
|
177
180
|
|
178
181
|
def top.rsudo(command, opts = {}, &block)
|
data/lib/rubber/version.rb
CHANGED
data/rubber.gemspec
CHANGED
@@ -18,14 +18,25 @@ namespace :rubber do
|
|
18
18
|
fi
|
19
19
|
ENDSCRIPT
|
20
20
|
end
|
21
|
+
|
22
|
+
after "rubber:bootstrap", "rubber:apache:bootstrap"
|
23
|
+
|
24
|
+
task :bootstrap, :roles => :apache do
|
25
|
+
exists = capture("grep 'empty ports file' /etc/apache2/ports.conf || true")
|
26
|
+
if exists.strip.size == 0
|
27
|
+
rubber.update_code_for_bootstrap
|
28
|
+
rubber.run_config(:file => "role/apache", :force => true, :deploy_path => release_path)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
21
32
|
|
22
33
|
# serial_task can only be called after roles defined - not normally a problem, but
|
23
34
|
# rubber auto-roles don't get defined till after all tasks are defined
|
24
35
|
on :load do
|
25
|
-
rubber.serial_task self, :serial_restart, :roles => :apache do
|
36
|
+
rubber.serial_task self, :serial_restart, :roles => [:app, :apache] do
|
26
37
|
rsudo "service apache2 stop; service apache2 start"
|
27
38
|
end
|
28
|
-
rubber.serial_task self, :serial_reload, :roles => :apache do
|
39
|
+
rubber.serial_task self, :serial_reload, :roles => [:app, :apache] do
|
29
40
|
rsudo "if ! ps ax | grep -v grep | grep -c apache2 &> /dev/null; then service apache2 start; else service apache2 reload; fi"
|
30
41
|
end
|
31
42
|
end
|
@@ -302,8 +302,8 @@ stop_on_error_cmd: "function error_exit { exit 99; }; trap error_exit ERR"
|
|
302
302
|
#
|
303
303
|
# var_name: var_value
|
304
304
|
|
305
|
-
# All variables can also be overridden on the role and/or host level by creating
|
306
|
-
# a sub level to the config under roles and hosts
|
305
|
+
# All variables can also be overridden on the role, environment and/or host level by creating
|
306
|
+
# a sub level to the config under roles, environments and hosts. The precedence is host, environment, role
|
307
307
|
# e.g. to install mysql only on db role, and awstats only on web01:
|
308
308
|
|
309
309
|
# OPTIONAL: Role specific overrides
|
@@ -313,6 +313,13 @@ stop_on_error_cmd: "function error_exit { exit 99; }; trap error_exit ERR"
|
|
313
313
|
# somerole2:
|
314
314
|
# myconfig: someval
|
315
315
|
|
316
|
+
# OPTIONAL: Environment specific overrides
|
317
|
+
# environments:
|
318
|
+
# staging:
|
319
|
+
# myconfig: otherval
|
320
|
+
# production:
|
321
|
+
# myconfig: val
|
322
|
+
|
316
323
|
# OPTIONAL: Host specific overrides
|
317
324
|
# hosts:
|
318
325
|
# somehost:
|
@@ -8,14 +8,21 @@
|
|
8
8
|
%>
|
9
9
|
|
10
10
|
listen passenger_proxy 0.0.0.0:<%= rubber_env.web_port %>
|
11
|
+
monitor-uri /haproxy_test
|
11
12
|
option forwardfor
|
13
|
+
<% if Rubber.env == 'production' %>
|
14
|
+
option httpchk OPTIONS /httpchk.txt
|
15
|
+
<% end %>
|
12
16
|
<% backend_hosts.each do |server| %>
|
13
17
|
server <%= server %> <%= server %>:<%= rubber_env.passenger_listen_port %> maxconn <%= rubber_env.max_app_connections %> check
|
14
18
|
<% end %>
|
15
19
|
|
16
20
|
listen passenger_proxy_ssl 0.0.0.0:<%= rubber_env.web_ssl_port %>
|
17
21
|
mode tcp
|
18
|
-
|
22
|
+
<% if Rubber.env == 'production' %>
|
23
|
+
# only uncomment if you have a valid ssl cert
|
24
|
+
# option httpchk OPTIONS /httpchk.txt
|
25
|
+
<% end %>
|
19
26
|
<% backend_hosts.each do |server| %>
|
20
27
|
server <%= server %> <%= server %>:<%= rubber_env.passenger_listen_ssl_port %> maxconn <%= rubber_env.max_app_connections %> check
|
21
28
|
<% end %>
|
@@ -0,0 +1,105 @@
|
|
1
|
+
namespace :rubber do
|
2
|
+
|
3
|
+
namespace :couchbase do
|
4
|
+
|
5
|
+
rubber.allow_optional_tasks(self)
|
6
|
+
|
7
|
+
before "rubber:install_packages", "rubber:couchbase:setup_apt_sources"
|
8
|
+
|
9
|
+
# sources needed for couchbase ruby client, not server
|
10
|
+
task :setup_apt_sources do
|
11
|
+
sources = <<-SOURCES
|
12
|
+
# Ubuntu 11.10 Oneiric Ocelot (Debian unstable)
|
13
|
+
#
|
14
|
+
# preview version needed for ruby client that has rails cache/session
|
15
|
+
#
|
16
|
+
# deb http://packages.couchbase.com/ubuntu oneiric oneiric/main
|
17
|
+
deb http://packages.couchbase.com/preview/ubuntu oneiric oneiric/main
|
18
|
+
SOURCES
|
19
|
+
sources.gsub!(/^[ \t]*/, '')
|
20
|
+
put(sources, "/etc/apt/sources.list.d/couchbase.list")
|
21
|
+
rsudo "wget -O- http://packages.couchbase.com/ubuntu/couchbase.key | sudo apt-key add -"
|
22
|
+
end
|
23
|
+
|
24
|
+
after "rubber:install_packages", "rubber:couchbase:install"
|
25
|
+
|
26
|
+
task :install, :roles => :couchbase do
|
27
|
+
rubber.sudo_script 'install_couchbase', <<-ENDSCRIPT
|
28
|
+
if ! grep "^#{rubber_env.couchbase_version}" /opt/couchbase/VERSION.txt &> /dev/null; then
|
29
|
+
# Fetch and install the pkg
|
30
|
+
rm -rf /tmp/couchbase*
|
31
|
+
wget -qNP /tmp #{rubber_env.couchbase_pkg_url}
|
32
|
+
dpkg -i /tmp/couchbase*
|
33
|
+
|
34
|
+
# Clean up after ourselves.
|
35
|
+
rm -rf /tmp/couchbase*
|
36
|
+
fi
|
37
|
+
ENDSCRIPT
|
38
|
+
end
|
39
|
+
|
40
|
+
after "rubber:bootstrap", "rubber:couchbase:bootstrap"
|
41
|
+
|
42
|
+
task :bootstrap, :roles => :couchbase do
|
43
|
+
exists = capture("echo $(ls #{rubber_env.couchbase_db_dir} 2> /dev/null)")
|
44
|
+
if exists.strip.size == 0
|
45
|
+
|
46
|
+
cli = rubber_env.couchbase_cli
|
47
|
+
create_bucket_lines = []
|
48
|
+
ram_size = 0
|
49
|
+
rubber_env.couchbase_buckets.each do |bucket_spec|
|
50
|
+
create_bucket_lines << "#{cli} bucket-create $cluster --bucket=#{bucket_spec['name']} --bucket-type=#{bucket_spec['type']} --bucket-port=#{bucket_spec['port']} --bucket-ramsize=#{bucket_spec['size']} --bucket-replica=#{bucket_spec['replicas']}"
|
51
|
+
ram_size += bucket_spec['size'].to_i
|
52
|
+
end
|
53
|
+
|
54
|
+
rubber.sudo_script 'bootstrap_couchbase', <<-ENDSCRIPT
|
55
|
+
mkdir -p #{rubber_env.couchbase_db_dir}
|
56
|
+
chown -R couchbase:couchbase #{rubber_env.couchbase_db_dir}
|
57
|
+
local_ip=$(ifconfig eth0 | awk -F"[: ]+" 'NR==2 {print $4}')
|
58
|
+
cluster="-c $local_ip:8091 -u #{rubber_env.couchbase_admin_username} -p #{rubber_env.couchbase_admin_password}"
|
59
|
+
|
60
|
+
# Setup cluster
|
61
|
+
#{cli} cluster-init $cluster --cluster-init-ramsize=#{ram_size}
|
62
|
+
|
63
|
+
# initialize the node
|
64
|
+
#{cli} node-init $cluster --node-init-data-path=#{rubber_env.couchbase_db_dir}
|
65
|
+
|
66
|
+
# create the buckets
|
67
|
+
#{create_bucket_lines.join("\n")}
|
68
|
+
|
69
|
+
ENDSCRIPT
|
70
|
+
|
71
|
+
# After everything installed on machines, we need the source tree
|
72
|
+
# on hosts in order to run rubber:config for bootstrapping the db
|
73
|
+
rubber.update_code_for_bootstrap
|
74
|
+
|
75
|
+
# Gen just the conf for couchbase
|
76
|
+
rubber.run_config(:file => "role/couchbase/", :force => true, :deploy_path => release_path)
|
77
|
+
|
78
|
+
restart
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
desc "Stops the couchbase server"
|
83
|
+
task :stop, :roles => :couchbase, :on_error => :continue do
|
84
|
+
rsudo "service couchbase-server stop || true"
|
85
|
+
end
|
86
|
+
|
87
|
+
desc "Starts the couchbase server"
|
88
|
+
task :start, :roles => :couchbase do
|
89
|
+
rsudo "service couchbase-server start"
|
90
|
+
end
|
91
|
+
|
92
|
+
desc "Restarts the couchbase server"
|
93
|
+
task :restart, :roles => :couchbase do
|
94
|
+
stop
|
95
|
+
start
|
96
|
+
end
|
97
|
+
|
98
|
+
desc "Reloads the couchbase server"
|
99
|
+
task :reload, :roles => :couchbase do
|
100
|
+
restart
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%
|
2
|
+
@read_cmd = 'crontab -l'
|
3
|
+
@write_cmd = 'crontab -'
|
4
|
+
@additive = ['# start-couchbase-crontab', '# end-couchbase-crontab']
|
5
|
+
%>
|
6
|
+
|
7
|
+
# Backup couchbase DBs every 3 hours.
|
8
|
+
# 0 */3 * * * <%= Rubber.root %>/script/rubber cron --task util:backup --directory=/mnt/couchbase_backups --name=couchbase --command="nice cbbackup <%= rubber_env.couchbase_db_dir %> \%dir\%/\%name\%_<%= rubber_env.host %>_\%time_stamp\%"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
couchbase_version: 1.8.1
|
2
|
+
couchbase_pkg_url: "http://packages.couchbase.com/releases/#{couchbase_version}/couchbase-server-community_x86_64_#{couchbase_version}.deb"
|
3
|
+
|
4
|
+
couchbase_pid_file: /opt/couchbase/var/lib/couchbase/couchbase-server.pid
|
5
|
+
couchbase_cli: /opt/couchbase/bin/couchbase-cli
|
6
|
+
couchbase_db_dir: /mnt/couchbase/data
|
7
|
+
|
8
|
+
couchbase_admin_username: Administrator
|
9
|
+
couchbase_admin_password: password
|
10
|
+
|
11
|
+
couchbase_buckets:
|
12
|
+
- name: "default"
|
13
|
+
type: couchbase
|
14
|
+
size: 200
|
15
|
+
replicas: 1
|
16
|
+
port: 11211
|
17
|
+
- name: "#{app_name}"
|
18
|
+
type: couchbase
|
19
|
+
size: 200
|
20
|
+
replicas: 1
|
21
|
+
port: 11222
|
22
|
+
|
23
|
+
gems: [couchbase]
|
24
|
+
|
25
|
+
packages: [libcouchbase-dev]
|
@@ -0,0 +1 @@
|
|
1
|
+
description: The couchbase module
|
@@ -81,9 +81,13 @@ namespace :rubber do
|
|
81
81
|
rubber.update_code_for_bootstrap
|
82
82
|
|
83
83
|
rubber.run_config(:file => "role/graylog_web/", :force => true, :deploy_path => release_path)
|
84
|
-
|
84
|
+
|
85
85
|
rubber.sudo_script 'bootstrap_graylog_web', <<-ENDSCRIPT
|
86
86
|
cd #{rubber_env.graylog_web_dir}
|
87
|
+
|
88
|
+
# Add puma to the Gemfile so we can run the server.
|
89
|
+
echo "gem 'puma'" >> Gemfile
|
90
|
+
|
87
91
|
export RAILS_ENV=production
|
88
92
|
bundle install
|
89
93
|
|