rubber 2.1.0 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|