ec2onrails 0.9.7 → 0.9.8
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +26 -0
- data/config/hoe.rb +1 -1
- data/lib/ec2onrails/capistrano_utils.rb +8 -3
- data/lib/ec2onrails/recipes.rb +126 -88
- data/lib/ec2onrails/version.rb +3 -3
- data/script/destroy +0 -0
- data/script/generate +0 -0
- data/script/txt2html +0 -0
- data/website/index.html +54 -33
- data/website/index.txt +50 -32
- metadata +4 -4
data/History.txt
CHANGED
@@ -1,3 +1,29 @@
|
|
1
|
+
== 0.9.8 XXXX-XX-XX
|
2
|
+
|
3
|
+
* ami-XXXX (32-bit) and ami-XXXX (64-bit)
|
4
|
+
* This is another test release, still not intended to be production-ready. Look for version 1.0. Almost there!!
|
5
|
+
* Incremental database backups instead of doing a full mysqldump each time (full dump is done once nightly). (Thanks to Markus Bengts for the bug fix)
|
6
|
+
* Added monit monitoring daemon: monitors mysqld, apache, memcached, mongrels, system load and free drive space
|
7
|
+
* Enabled postfix by default, mail is delivered to admin user (or use new ec2onrails[:admin_mail_forward_address] option in deploy.rb to forward admin mail to an email address)
|
8
|
+
* Apache now supports SSL, set :ec2onrails[:enable_ssl] = true to enable and upload ssl cert & key (there is also a self-signed cert generated for each instance on first startup)
|
9
|
+
* Base image now built with Eric Hammond's EC2 Ubuntu script: http://alestic.com/ (using svn revision 44)
|
10
|
+
* Now installing latest rubygems (version 1.1.1) from source instead of using Ubuntu package
|
11
|
+
* Apache now denies access to any file in a directory named .svn, to protect the subversion info of those who deploy with Capistrano "checkout" method
|
12
|
+
* Added force-proxy-request-1.0 and proxy-nokeepalive for proxy requests to mongrel to fix occasional "proxy: error reading status line from remote server" error (mongrel doesn't support keep-alive anyway), see apache bug #37770
|
13
|
+
* Increased default memcache size to 128m, and memcache now listens on all interfaces for clustered use
|
14
|
+
* Tuned MySQL setting defaults for better performance
|
15
|
+
* restore_db_and_deploy task now runs migrations after restoring db
|
16
|
+
* upgrade_packages task now does "safe upgrade" instead of "full upgrade"
|
17
|
+
* Now requires Capistrano 2.3.0
|
18
|
+
* Bug fix: #20040: installing or upgrading packages no longer breaks - /etc/apt/sources.list is now correct
|
19
|
+
* Bug fix: #19808: Capistrano database tasks don't try to load database config if there are no hosts in the "db" role (with :primary => true, slave roles not yet supported)
|
20
|
+
* Bug fix: #19791: MySQL no longer fails after rebundling due to missing /mnt/mysql_data
|
21
|
+
* Bug fix: #14555: Syslog messages about unacknowledged DHCP requests is no longer occurring
|
22
|
+
* Bug fix: Database backup and restore scripts now exit if already backing up or restoring.
|
23
|
+
* Bug fix: EC2 ephemeral store and swap volumes were not correctly mounted
|
24
|
+
* Bug fix: Reload apache config when setting roles to find new app hosts.
|
25
|
+
|
26
|
+
|
1
27
|
== 0.9.7 2008-03-03
|
2
28
|
|
3
29
|
* ami-5c0aef35 (32-bit) and ami-540aef3d (64-bit)
|
data/config/hoe.rb
CHANGED
@@ -59,7 +59,7 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
59
59
|
|
60
60
|
# == Optional
|
61
61
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\\n\\n")
|
62
|
-
p.extra_deps = [['capistrano', '>= 2.
|
62
|
+
p.extra_deps = [['capistrano', '>= 2.3.0'], ['archive-tar-minitar', '>= 0.5.1'], ['optiflag', '>= 0.6.5']] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
63
63
|
|
64
64
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
65
65
|
|
@@ -5,6 +5,11 @@ module Ec2onrails
|
|
5
5
|
raise("error: #{$?}") unless result
|
6
6
|
end
|
7
7
|
|
8
|
+
def run_init_script(script, arg)
|
9
|
+
# since init scripts might have the execute bit unset by the set_roles script we need to check
|
10
|
+
sudo "sh -c 'if [ -x /etc/init.d/#{script} ] ; then /etc/init.d/#{script} #{arg}; fi'"
|
11
|
+
end
|
12
|
+
|
8
13
|
def make_admin_role_for(role)
|
9
14
|
newrole = "#{role.to_s}_admin".to_sym
|
10
15
|
roles[role].each do |srv_def|
|
@@ -16,13 +21,13 @@ module Ec2onrails
|
|
16
21
|
end
|
17
22
|
end
|
18
23
|
|
19
|
-
# return hostnames for the role named role_sym
|
24
|
+
# return hostnames for the role named role_sym that has the specified options
|
20
25
|
def hostnames_for_role(role_sym, options = {})
|
21
26
|
role = roles[role_sym]
|
22
27
|
unless role
|
23
28
|
return []
|
24
29
|
end
|
25
|
-
role.
|
30
|
+
role.select{|s| s.options == options}.collect{|s| s.host}
|
26
31
|
end
|
27
32
|
end
|
28
|
-
end
|
33
|
+
end
|
data/lib/ec2onrails/recipes.rb
CHANGED
@@ -19,6 +19,7 @@
|
|
19
19
|
require 'fileutils'
|
20
20
|
include FileUtils
|
21
21
|
require 'tmpdir'
|
22
|
+
require 'pp'
|
22
23
|
require 'zlib'
|
23
24
|
require 'archive/tar/minitar'
|
24
25
|
include Archive::Tar
|
@@ -41,39 +42,47 @@ Capistrano::Configuration.instance.load do
|
|
41
42
|
set :deploy_to, "/mnt/app"
|
42
43
|
set :use_sudo, false
|
43
44
|
set :user, "app"
|
45
|
+
|
46
|
+
# make an "admin" role for each role, and create arrays containing
|
47
|
+
# the names of admin roles and non-admin roles for convenience
|
48
|
+
set :all_admin_role_names, []
|
49
|
+
set :all_non_admin_role_names, []
|
50
|
+
roles.keys.clone.each do |name|
|
51
|
+
make_admin_role_for(name)
|
52
|
+
all_non_admin_role_names << name
|
53
|
+
all_admin_role_names << "#{name.to_s}_admin".to_sym
|
54
|
+
end
|
44
55
|
|
45
|
-
|
46
|
-
|
47
|
-
make_admin_role_for :db
|
48
|
-
|
49
|
-
roles[:web_admin].to_s
|
50
|
-
roles[:app_admin].to_s
|
51
|
-
roles[:db_admin].to_s
|
56
|
+
after "deploy:symlink", "ec2onrails:server:set_roles"
|
57
|
+
after "deploy:cold", "ec2onrails:db:init_backup"
|
52
58
|
|
53
59
|
# override default start/stop/restart tasks
|
54
60
|
namespace :deploy do
|
55
61
|
desc <<-DESC
|
56
|
-
Overrides the default Capistrano deploy:
|
62
|
+
Overrides the default Capistrano deploy:restart, uses \
|
57
63
|
/etc/init.d/mongrel
|
58
64
|
DESC
|
59
|
-
task :start, :roles => :
|
60
|
-
|
65
|
+
task :start, :roles => :app_admin do
|
66
|
+
run_init_script("mongrel", "start")
|
67
|
+
sudo "sleep 30 && monit -g app monitor all" # give the service 30 seconds to start before attempting to monitor it
|
61
68
|
end
|
62
69
|
|
63
70
|
desc <<-DESC
|
64
|
-
Overrides the default Capistrano deploy:
|
71
|
+
Overrides the default Capistrano deploy:restart, uses \
|
65
72
|
/etc/init.d/mongrel
|
66
73
|
DESC
|
67
|
-
task :stop, :roles => :
|
68
|
-
|
74
|
+
task :stop, :roles => :app_admin do
|
75
|
+
sudo "monit -g app unmonitor all"
|
76
|
+
run_init_script("mongrel", "stop")
|
69
77
|
end
|
70
78
|
|
71
79
|
desc <<-DESC
|
72
|
-
Overrides the default Capistrano deploy:restart,
|
80
|
+
Overrides the default Capistrano deploy:restart, uses \
|
73
81
|
/etc/init.d/mongrel
|
74
82
|
DESC
|
75
|
-
task :restart, :roles => :
|
76
|
-
|
83
|
+
task :restart, :roles => :app_admin do
|
84
|
+
deploy.stop
|
85
|
+
deploy.start
|
77
86
|
end
|
78
87
|
end
|
79
88
|
|
@@ -82,7 +91,7 @@ Capistrano::Configuration.instance.load do
|
|
82
91
|
Show the AMI id's of the current images for this version of \
|
83
92
|
EC2 on Rails.
|
84
93
|
DESC
|
85
|
-
task :ami_ids
|
94
|
+
task :ami_ids do
|
86
95
|
puts "32-bit server image for EC2 on Rails #{ec2onrails_version}: #{image_id_32_bit}"
|
87
96
|
puts "64-bit server image for EC2 on Rails #{ec2onrails_version}: #{image_id_64_bit}"
|
88
97
|
end
|
@@ -114,42 +123,35 @@ Capistrano::Configuration.instance.load do
|
|
114
123
|
run_local "scp -i '#{privkey}' app@#{host}:.ssh/authorized_keys #{pubkey}"
|
115
124
|
end
|
116
125
|
end
|
117
|
-
|
126
|
+
|
118
127
|
desc <<-DESC
|
119
|
-
|
128
|
+
Prepare a newly-started instance for a cold deploy.
|
120
129
|
DESC
|
121
|
-
task :setup, :roles =>
|
122
|
-
|
130
|
+
task :setup, :roles => all_admin_role_names do
|
131
|
+
server.set_admin_mail_forward_address
|
123
132
|
server.set_timezone
|
124
133
|
server.install_packages
|
125
134
|
server.install_gems
|
126
135
|
server.deploy_files
|
136
|
+
server.enable_ssl if cfg[:enable_ssl]
|
127
137
|
server.set_rails_env
|
128
138
|
server.restart_services
|
129
139
|
deploy.setup
|
130
|
-
server.set_roles
|
131
140
|
db.create
|
132
141
|
end
|
133
142
|
|
134
143
|
desc <<-DESC
|
135
144
|
Deploy and restore database from S3
|
136
145
|
DESC
|
137
|
-
task :restore_db_and_deploy
|
146
|
+
task :restore_db_and_deploy do
|
138
147
|
db.recreate
|
139
148
|
deploy.update_code
|
140
149
|
deploy.symlink
|
141
|
-
# don't need to migrate because we're restoring the db
|
142
150
|
db.restore
|
143
|
-
deploy.
|
151
|
+
deploy.migrations
|
144
152
|
end
|
145
153
|
|
146
|
-
namespace :ec2 do
|
147
|
-
desc <<-DESC
|
148
|
-
DESC
|
149
|
-
task :start_instance, :roles => [:web, :db, :app] do
|
150
|
-
# TODO
|
151
|
-
end
|
152
|
-
|
154
|
+
namespace :ec2 do
|
153
155
|
desc <<-DESC
|
154
156
|
DESC
|
155
157
|
task :configure_firewall do
|
@@ -160,27 +162,28 @@ Capistrano::Configuration.instance.load do
|
|
160
162
|
namespace :db do
|
161
163
|
desc <<-DESC
|
162
164
|
[internal] Load configuration info for the database from
|
163
|
-
config/database.yml
|
165
|
+
config/database.yml, and start mysql (it must be running
|
166
|
+
in order to interact with it).
|
164
167
|
DESC
|
165
|
-
task :load_config
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
168
|
+
task :load_config do
|
169
|
+
unless hostnames_for_role(:db, :primary => true).empty?
|
170
|
+
db_config = YAML::load(ERB.new(File.read("config/database.yml")).result)[rails_env.to_s]
|
171
|
+
cfg[:db_name] = db_config['database']
|
172
|
+
cfg[:db_user] = db_config['username']
|
173
|
+
cfg[:db_password] = db_config['password']
|
174
|
+
cfg[:db_host] = db_config['host']
|
175
|
+
cfg[:db_socket] = db_config['socket']
|
172
176
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
raise "ERROR: missing database config. Make sure database.yml contains a '#{rails_env}' section with either 'host: localhost' or 'socket: /var/run/mysqld/mysqld.sock'."
|
177
|
-
end
|
177
|
+
if (cfg[:db_host].nil? || cfg[:db_host].empty?) && (cfg[:db_socket].nil? || cfg[:db_socket].empty?)
|
178
|
+
raise "ERROR: missing database config. Make sure database.yml contains a '#{rails_env}' section with either 'host: hostname' or 'socket: /var/run/mysqld/mysqld.sock'."
|
179
|
+
end
|
178
180
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
181
|
+
[cfg[:db_name], cfg[:db_user], cfg[:db_password]].each do |s|
|
182
|
+
if s.nil? || s.empty?
|
183
|
+
raise "ERROR: missing database config. Make sure database.yml contains a '#{rails_env}' section with a database name, user, and password."
|
184
|
+
elsif s.match(/['"]/)
|
185
|
+
raise "ERROR: database config string '#{s}' contains quotes."
|
186
|
+
end
|
184
187
|
end
|
185
188
|
end
|
186
189
|
end
|
@@ -193,8 +196,21 @@ Capistrano::Configuration.instance.load do
|
|
193
196
|
task :create, :roles => :db do
|
194
197
|
on_rollback { drop }
|
195
198
|
load_config
|
196
|
-
|
197
|
-
run
|
199
|
+
start
|
200
|
+
run %{mysql -u root -e "create database if not exists #{cfg[:db_name]};"}
|
201
|
+
run %{mysql -u root -e "grant all on #{cfg[:db_name]}.* to '#{cfg[:db_user]}'@'%' identified by '#{cfg[:db_password]}';"}
|
202
|
+
run %{mysql -u root -e "grant reload on *.* to '#{cfg[:db_user]}'@'%' identified by '#{cfg[:db_password]}';"}
|
203
|
+
run %{mysql -u root -e "grant super on *.* to '#{cfg[:db_user]}'@'%' identified by '#{cfg[:db_password]}';"}
|
204
|
+
end
|
205
|
+
|
206
|
+
desc <<-DESC
|
207
|
+
Make sure the MySQL server has been started, just in case the db role
|
208
|
+
hasn't been set, e.g. when called from ec2onrails:setup.
|
209
|
+
(But don't enable monitoring on it.)
|
210
|
+
DESC
|
211
|
+
task :start, :roles => :db_admin do
|
212
|
+
sudo "chmod a+x /etc/init.d/mysql"
|
213
|
+
sudo "/etc/init.d/mysql start"
|
198
214
|
end
|
199
215
|
|
200
216
|
desc <<-DESC
|
@@ -204,7 +220,7 @@ Capistrano::Configuration.instance.load do
|
|
204
220
|
DESC
|
205
221
|
task :drop, :roles => :db do
|
206
222
|
load_config
|
207
|
-
run "
|
223
|
+
run %{mysql -u root -e "drop database if exists #{cfg[:db_name]};"}
|
208
224
|
end
|
209
225
|
|
210
226
|
desc <<-DESC
|
@@ -221,7 +237,7 @@ Capistrano::Configuration.instance.load do
|
|
221
237
|
DESC
|
222
238
|
task :set_root_password, :roles => :db do
|
223
239
|
if cfg[:mysql_root_password]
|
224
|
-
run %{
|
240
|
+
run %{mysql -u root -e "UPDATE mysql.user SET Password=PASSWORD('#{cfg[:mysql_root_password]}') WHERE User='root'; FLUSH PRIVILEGES;"}
|
225
241
|
end
|
226
242
|
end
|
227
243
|
|
@@ -230,17 +246,26 @@ Capistrano::Configuration.instance.load do
|
|
230
246
|
ec2onrails_config[:archive_to_bucket]. The filename will be \
|
231
247
|
"app-<timestamp>.sql.gz".
|
232
248
|
DESC
|
233
|
-
task :archive, :roles =>
|
234
|
-
run "/usr/local/ec2onrails/bin/backup_app_db.rb --bucket #{cfg[:archive_to_bucket]} --
|
249
|
+
task :archive, :roles => :db do
|
250
|
+
run "/usr/local/ec2onrails/bin/backup_app_db.rb --noreset --bucket #{cfg[:archive_to_bucket]} --dir database-#{Time.new.strftime('%Y-%m-%d--%H-%M-%S')}"
|
235
251
|
end
|
236
252
|
|
237
253
|
desc <<-DESC
|
238
254
|
Restore the MySQL database from the S3 bucket specified by \
|
239
255
|
ec2onrails_config[:restore_from_bucket]. The archive filename is \
|
240
|
-
expected to be the default, "
|
256
|
+
expected to be the default, "mysqldump.sql.gz".
|
257
|
+
DESC
|
258
|
+
task :restore, :roles => :db do
|
259
|
+
run "/usr/local/ec2onrails/bin/restore_app_db.rb --bucket #{cfg[:restore_from_bucket]} --dir #{cfg[:restore_from_bucket_subdir]}"
|
260
|
+
end
|
261
|
+
|
262
|
+
desc <<-DESC
|
263
|
+
[internal] Initialize the default backup folder on S3 (i.e. do a full
|
264
|
+
backup of the newly-created db so the automatic incremental backups
|
265
|
+
make sense).
|
241
266
|
DESC
|
242
|
-
task :
|
243
|
-
run "/usr/local/ec2onrails/bin/
|
267
|
+
task :init_backup, :roles => :db do
|
268
|
+
run "/usr/local/ec2onrails/bin/backup_app_db.rb"
|
244
269
|
end
|
245
270
|
end
|
246
271
|
|
@@ -250,36 +275,45 @@ Capistrano::Configuration.instance.load do
|
|
250
275
|
the appropriate settings for each role, and starts and/or stops the \
|
251
276
|
relevant services.
|
252
277
|
DESC
|
253
|
-
task :set_roles, :roles =>
|
278
|
+
task :set_roles, :roles => all_admin_role_names do
|
254
279
|
# TODO generate this based on the roles that actually exist so arbitrary new ones can be added
|
255
|
-
|
280
|
+
roles = {
|
281
|
+
:web => hostnames_for_role(:web),
|
282
|
+
:app => hostnames_for_role(:app),
|
283
|
+
:db_primary => hostnames_for_role(:db, :primary => true),
|
284
|
+
:memcache => hostnames_for_role(:memcache)
|
285
|
+
}
|
286
|
+
roles_yml = YAML::dump(roles)
|
287
|
+
put roles_yml, "/tmp/roles.yml"
|
288
|
+
sudo "cp /tmp/roles.yml /etc/ec2onrails"
|
289
|
+
sudo "/usr/local/ec2onrails/bin/set_roles.rb"
|
256
290
|
end
|
257
291
|
|
258
292
|
desc <<-DESC
|
259
293
|
Change the default value of RAILS_ENV on the server. Technically
|
260
294
|
this changes the server's mongrel config to use a different value
|
261
|
-
for "environment". The value is specified in :rails_env
|
295
|
+
for "environment". The value is specified in :rails_env.
|
296
|
+
Be sure to do deploy:restart after this.
|
262
297
|
DESC
|
263
|
-
task :set_rails_env, :roles =>
|
298
|
+
task :set_rails_env, :roles => all_admin_role_names do
|
264
299
|
rails_env = fetch(:rails_env, "production")
|
265
300
|
sudo "/usr/local/ec2onrails/bin/set_rails_env #{rails_env}"
|
266
|
-
deploy.restart
|
267
301
|
end
|
268
302
|
|
269
303
|
desc <<-DESC
|
270
304
|
Upgrade to the newest versions of all Ubuntu packages.
|
271
305
|
DESC
|
272
|
-
task :upgrade_packages, :roles =>
|
306
|
+
task :upgrade_packages, :roles => all_admin_role_names do
|
273
307
|
sudo "aptitude -q update"
|
274
|
-
run "export DEBIAN_FRONTEND=noninteractive; sudo aptitude -q -y
|
308
|
+
run "export DEBIAN_FRONTEND=noninteractive; sudo aptitude -q -y safe-upgrade"
|
275
309
|
end
|
276
310
|
|
277
311
|
desc <<-DESC
|
278
312
|
Upgrade to the newest versions of all rubygems.
|
279
313
|
DESC
|
280
|
-
task :upgrade_gems, :roles =>
|
314
|
+
task :upgrade_gems, :roles => all_admin_role_names do
|
281
315
|
sudo "gem update --system --no-rdoc --no-ri"
|
282
|
-
sudo "gem update
|
316
|
+
sudo "gem update --no-rdoc --no-ri" do |ch, str, data|
|
283
317
|
ch[:data] ||= ""
|
284
318
|
ch[:data] << data
|
285
319
|
if data =~ />\s*$/
|
@@ -301,7 +335,7 @@ Capistrano::Configuration.instance.load do
|
|
301
335
|
'dpkg-reconfigure packagename' or replace the package's config files \
|
302
336
|
using the 'ec2onrails:server:deploy_files' task.
|
303
337
|
DESC
|
304
|
-
task :install_packages, :roles =>
|
338
|
+
task :install_packages, :roles => all_admin_role_names do
|
305
339
|
if cfg[:packages] && cfg[:packages].any?
|
306
340
|
run "export DEBIAN_FRONTEND=noninteractive; sudo aptitude -q -y install #{cfg[:packages].join(' ')}"
|
307
341
|
end
|
@@ -311,10 +345,10 @@ Capistrano::Configuration.instance.load do
|
|
311
345
|
Install extra rubygems. Set ec2onrails_config[:rubygems], it should \
|
312
346
|
be with an array of strings.
|
313
347
|
DESC
|
314
|
-
task :install_gems, :roles =>
|
348
|
+
task :install_gems, :roles => all_admin_role_names do
|
315
349
|
if cfg[:rubygems]
|
316
350
|
cfg[:rubygems].each do |gem|
|
317
|
-
sudo "gem install #{gem}
|
351
|
+
sudo "gem install #{gem} --no-rdoc --no-ri" do |ch, str, data|
|
318
352
|
ch[:data] ||= ""
|
319
353
|
ch[:data] << data
|
320
354
|
if data =~ />\s*$/
|
@@ -333,7 +367,7 @@ Capistrano::Configuration.instance.load do
|
|
333
367
|
A convenience task to upgrade existing packages and gems and install \
|
334
368
|
specified new ones.
|
335
369
|
DESC
|
336
|
-
task :upgrade_and_install_all, :roles =>
|
370
|
+
task :upgrade_and_install_all, :roles => all_admin_role_names do
|
337
371
|
upgrade_packages
|
338
372
|
upgrade_gems
|
339
373
|
install_packages
|
@@ -349,7 +383,7 @@ Capistrano::Configuration.instance.load do
|
|
349
383
|
directory and file as the value. For example 'Africa/Abidjan' or \
|
350
384
|
'posix/GMT' or 'Canada/Eastern'.
|
351
385
|
DESC
|
352
|
-
task :set_timezone, :roles =>
|
386
|
+
task :set_timezone, :roles => all_admin_role_names do
|
353
387
|
if cfg[:timezone]
|
354
388
|
sudo "bash -c 'echo #{cfg[:timezone]} > /etc/timezone'"
|
355
389
|
sudo "cp /usr/share/zoneinfo/#{cfg[:timezone]} /etc/localtime"
|
@@ -358,9 +392,13 @@ Capistrano::Configuration.instance.load do
|
|
358
392
|
|
359
393
|
desc <<-DESC
|
360
394
|
Deploy a set of config files to the server, the files will be owned by \
|
361
|
-
root. This doesn't delete any files from the server.
|
395
|
+
root. This doesn't delete any files from the server. This is intended
|
396
|
+
mainly for customized config files for new packages installed via the \
|
397
|
+
ec2onrails:server:install_packages task. Subdirectories and files \
|
398
|
+
inside here will be placed within the same directory structure \
|
399
|
+
relative to the root of the server's filesystem.
|
362
400
|
DESC
|
363
|
-
task :deploy_files, :roles =>
|
401
|
+
task :deploy_files, :roles => all_admin_role_names do
|
364
402
|
if cfg[:server_config_files_root]
|
365
403
|
begin
|
366
404
|
filename = "config_files.tar"
|
@@ -383,30 +421,30 @@ Capistrano::Configuration.instance.load do
|
|
383
421
|
to an array of strings. It's assumed that each service has a script \
|
384
422
|
in /etc/init.d
|
385
423
|
DESC
|
386
|
-
task :restart_services, :roles =>
|
424
|
+
task :restart_services, :roles => all_admin_role_names do
|
387
425
|
if cfg[:services_to_restart] && cfg[:services_to_restart].any?
|
388
426
|
cfg[:services_to_restart].each do |service|
|
389
|
-
|
427
|
+
run_init_script(service, "restart")
|
390
428
|
end
|
391
429
|
end
|
392
430
|
end
|
393
431
|
|
394
432
|
desc <<-DESC
|
433
|
+
Set the email address that mail to the admin user forwards to.
|
395
434
|
DESC
|
396
|
-
task :
|
397
|
-
|
435
|
+
task :set_admin_mail_forward_address, :roles => all_admin_role_names do
|
436
|
+
put cfg[:admin_mail_forward_address], "/home/admin/.forward"
|
398
437
|
end
|
399
|
-
|
400
|
-
desc <<-DESC
|
401
|
-
DESC
|
402
|
-
task :add_user, :roles => [:web_admin, :db_admin, :app_admin] do
|
403
|
-
# TODO
|
404
|
-
end
|
405
|
-
|
438
|
+
|
406
439
|
desc <<-DESC
|
440
|
+
Enable ssl for the web server. The SSL cert file should be in
|
441
|
+
/etc/ssl/certs/default.pem and the SSL key file should be in
|
442
|
+
/etc/ssl/private/default.key (use the deploy_files task).
|
407
443
|
DESC
|
408
|
-
task :
|
409
|
-
|
444
|
+
task :enable_ssl, :roles => :web_admin do
|
445
|
+
sudo "a2enmod ssl"
|
446
|
+
sudo "a2ensite default-ssl"
|
447
|
+
sudo "/etc/init.d/apache2 restart"
|
410
448
|
end
|
411
449
|
end
|
412
450
|
|
data/lib/ec2onrails/version.rb
CHANGED
@@ -20,10 +20,10 @@ module Ec2onrails #:nodoc:
|
|
20
20
|
module VERSION #:nodoc:
|
21
21
|
MAJOR = 0
|
22
22
|
MINOR = 9
|
23
|
-
TINY =
|
23
|
+
TINY = 8
|
24
24
|
STRING = [MAJOR, MINOR, TINY].join('.')
|
25
25
|
|
26
|
-
AMI_ID_32_BIT = 'ami-
|
27
|
-
AMI_ID_64_BIT = 'ami-
|
26
|
+
AMI_ID_32_BIT = 'ami-b657b2df'
|
27
|
+
AMI_ID_64_BIT = 'ami-8957b2e0'
|
28
28
|
end
|
29
29
|
end
|
data/script/destroy
CHANGED
File without changes
|
data/script/generate
CHANGED
File without changes
|
data/script/txt2html
CHANGED
File without changes
|
data/website/index.html
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
<h1>EC2 on Rails</h1>
|
34
34
|
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/ec2onrails"; return false'>
|
35
35
|
<p>Get Version</p>
|
36
|
-
<a href="http://rubyforge.org/projects/ec2onrails" class="numbers">0.9.
|
36
|
+
<a href="http://rubyforge.org/projects/ec2onrails" class="numbers">0.9.8</a>
|
37
37
|
</div>
|
38
38
|
<h2>Deploy a Ruby on Rails app on <span class="caps">EC2</span> in five minutes</h2>
|
39
39
|
|
@@ -55,22 +55,27 @@ your Rails app.</p>
|
|
55
55
|
|
56
56
|
|
57
57
|
<ul>
|
58
|
-
<li>Ready to deploy a Rails app with little or no configuration of the server required
|
59
|
-
<li>Automatic backup of MySQL database to S3
|
60
|
-
<li>Capistrano tasks to customize the server image, archive and restore the database to/from S3, and more (available as a rubygem)
|
58
|
+
<li>Ready to deploy a Rails app with little or no configuration of the server required</li>
|
59
|
+
<li>Automatic backup of MySQL database to S3 (full backup nightly + incremental backup using binary logs every 10 minutes)</li>
|
60
|
+
<li>Capistrano tasks to customize the server image, archive and restore the database to/from S3, and more (available as a rubygem)</li>
|
61
61
|
<li>Mongrel_cluster behind Apache 2.2, configured according to
|
62
62
|
<a href="http://blog.codahale.com/2006/06/19/time-for-a-grown-up-server-rails-mongrel-apache-capistrano-and-you/">Coda Hale’s excellent guide</a></li>
|
63
|
-
<li>Ruby on Rails 1.2.
|
63
|
+
<li>Ruby on Rails 2.0.2 and 1.2.6</li>
|
64
64
|
<li>Ruby 1.8.6</li>
|
65
65
|
<li>MySQL 5</li>
|
66
|
-
<li
|
66
|
+
<li><a href="http://www.danga.com/memcached/">memcached</a></li>
|
67
|
+
<li><a href="http://www.tildeslash.com/monit/">monit</a> system monitoring</li>
|
68
|
+
<li>Ubuntu 7.10 “Gutsy” base image built using <a href="http://alestic.com/">Eric Hammond’s <span class="caps">EC2</span> Ubuntu script</a></li>
|
69
|
+
<li><span class="caps">SSL</span> support</li>
|
67
70
|
<li>Amazon <span class="caps">AMI</span> tools installed</li>
|
68
71
|
<li>A script to rebundle a customized version of the image in one step if required</li>
|
69
72
|
<li>MySQL, Apache, and syslog configured to use /mnt for data and logging so you don’t fill up <span class="caps">EC2</span>’s small root filesystem</li>
|
70
73
|
<li>Automatically archives Rails and Apache logs to S3 nightly.</li>
|
71
74
|
<li>32-bit and 64-bit images available (supports all instance types, small to extra large).</li>
|
72
|
-
<li>Created using a build file, full source is available
|
73
|
-
<li>
|
75
|
+
<li>Created using a build file, full source is <a href="http://rubyforge.org/scm/?group_id=4552">available</a> (the <span class="caps">EC2</span> on Rails script is run from <a href="http://alestic.com/">Eric Hammond’s <span class="caps">EC2</span> Ubuntu script</a>)</li>
|
76
|
+
<li>Supports multiple instances</li>
|
77
|
+
<li>Automatically runs hourly, daily, weekly and monthly scripts if they exist in Rails application’s script directory</li>
|
78
|
+
<li>Local <span class="caps">SMTP</span> server (postfix)</li>
|
74
79
|
</ul>
|
75
80
|
|
76
81
|
|
@@ -108,7 +113,8 @@ to the instance defined in your Capistrano “db” role.</p>
|
|
108
113
|
<h4>4. Start up one or more instances of the image.</h4>
|
109
114
|
|
110
115
|
|
111
|
-
<p>Soon there will be a Capistrano task to do this for you. In the meantime
|
116
|
+
<p>Soon there will be a Capistrano task to do this for you. In the meantime I’m not going to lie, this part is complicated
|
117
|
+
the first time. Read the
|
112
118
|
<a href="http://docs.amazonwebservices.com/AWSEC2/2007-08-29/GettingStartedGuide/running-an-instance.html">running an instance section</a>
|
113
119
|
in Amazon’s getting started guide.</p>
|
114
120
|
|
@@ -117,6 +123,9 @@ in Amazon’s getting started guide.</p>
|
|
117
123
|
or do <code>cap ec2onrails:ami_ids</code> from within the app that you configured in the previous step.</p>
|
118
124
|
|
119
125
|
|
126
|
+
<p><em><span class="caps">NOTE</span>: Only use the images that match the current version of the gem.</em></p>
|
127
|
+
|
128
|
+
|
120
129
|
<p>Please see the <a href="http://ec2onrails.rubyforge.org/svn/trunk/gem/History.txt">change log</a> for release notes, and
|
121
130
|
see the <a href="http://rubyforge.org/tracker/?atid=17558&group_id=4552&func=browse">list of open issues</a>.</p>
|
122
131
|
|
@@ -142,7 +151,8 @@ If you’re using multiple instances, be sure to allow them network access t
|
|
142
151
|
|
143
152
|
|
144
153
|
<p>Technically all you should need to connect to the server is the private key file, the public key is on the server.
|
145
|
-
But for some reason
|
154
|
+
But for some reason
|
155
|
+
<a href="http://groups.google.com/group/capistrano/browse_thread/thread/1102208ff925d18">Capistrano requires that you have both the public key and the private key files together on the client</a>.</p>
|
146
156
|
|
147
157
|
|
148
158
|
<p>From within the root of your rails app do:</p>
|
@@ -150,12 +160,15 @@ But for some reason Capistrano requires that you have both the public key and th
|
|
150
160
|
|
151
161
|
<pre>cap ec2onrails:get_public_key_from_server</pre>
|
152
162
|
|
163
|
+
<p>Note, this will only work if you have an external ssh command in the path, it won’t work for most Windows users.</p>
|
164
|
+
|
165
|
+
|
153
166
|
<h4>6. Deploy the app with Capistrano</h4>
|
154
167
|
|
155
168
|
|
156
169
|
<pre>
|
157
170
|
cap ec2onrails:setup
|
158
|
-
cap deploy:
|
171
|
+
cap deploy:cold
|
159
172
|
</pre>
|
160
173
|
|
161
174
|
<p>Yes, it’s that easy! The setup task will set the server’s timezone, install any
|
@@ -178,15 +191,15 @@ files to the server (they will be owned by root). It’s intended mainly for
|
|
178
191
|
customized config files for new packages installed via the install_packages
|
179
192
|
task.
|
180
193
|
<ul>
|
181
|
-
<li>ec2onrails:server:deploy_files</li>
|
182
|
-
<li>ec2onrails:server:set_timezone</li>
|
183
|
-
<li>ec2onrails:server:upgrade_gems</li>
|
184
|
-
<li>ec2onrails:server:upgrade_packages</li>
|
185
|
-
<li>ec2onrails:server:install_gems</li>
|
186
|
-
<li>ec2onrails:server:install_packages</li>
|
187
|
-
<li>ec2onrails:server:upgrade_and_install_all</li>
|
188
|
-
<li>ec2onrails:server:restart_services</li>
|
189
|
-
<li>ec2onrails:server:set_roles
|
194
|
+
<li><code>cap ec2onrails:server:deploy_files</code></li>
|
195
|
+
<li><code>cap ec2onrails:server:set_timezone</code></li>
|
196
|
+
<li><code>cap ec2onrails:server:upgrade_gems</code></li>
|
197
|
+
<li><code>cap ec2onrails:server:upgrade_packages</code></li>
|
198
|
+
<li><code>cap ec2onrails:server:install_gems</code></li>
|
199
|
+
<li><code>cap ec2onrails:server:install_packages</code></li>
|
200
|
+
<li><code>cap ec2onrails:server:upgrade_and_install_all</code></li>
|
201
|
+
<li><code>cap ec2onrails:server:restart_services</code></li>
|
202
|
+
<li><code>cap ec2onrails:server:set_roles</code>
|
190
203
|
- Customizes each instance for it’s role(s) (as defined in your Capistrano deploy.rb file).
|
191
204
|
For now this just makes sure that only the appropriate services (Apache, Mongrel, and/or MySQL)
|
192
205
|
are running. Eventually this will customize settings for the running services also. Note that
|
@@ -200,30 +213,30 @@ bucket) onto a staging server that has the current production version of my
|
|
200
213
|
app. I then deploy the new version which tests migrations exactly as they’ll
|
201
214
|
run on the production server.
|
202
215
|
<ul>
|
203
|
-
<li>ec2onrails:db:archive</li>
|
204
|
-
<li>ec2onrails:db:restore</li>
|
205
|
-
<li>ec2onrails:db:create</li>
|
206
|
-
<li>ec2onrails:db:drop</li>
|
207
|
-
<li>ec2onrails:db:recreate</li>
|
208
|
-
<li>ec2onrails:db:set_root_password</li>
|
216
|
+
<li><code>cap ec2onrails:db:archive</code></li>
|
217
|
+
<li><code>cap ec2onrails:db:restore</code></li>
|
218
|
+
<li><code>cap ec2onrails:db:create</code></li>
|
219
|
+
<li><code>cap ec2onrails:db:drop</code></li>
|
220
|
+
<li><code>cap ec2onrails:db:recreate</code></li>
|
221
|
+
<li><code>cap ec2onrails:db:set_root_password</code></li>
|
209
222
|
</ul>
|
210
223
|
|
211
224
|
|
212
225
|
<ul>
|
213
|
-
<li>ec2onrails:ami_ids
|
226
|
+
<li><code>cap ec2onrails:ami_ids</code>
|
214
227
|
- Shows the <span class="caps">AMI</span> id’s of the images that match the current version of the gem.</li>
|
215
228
|
</ul>
|
216
229
|
|
217
230
|
|
218
231
|
<ul>
|
219
|
-
<li>ec2onrails:setup
|
232
|
+
<li><code>cap ec2onrails:setup</code>
|
220
233
|
- This is a convenience task to get a new instance completely set up in one
|
221
234
|
step, everything except deploying the app.</li>
|
222
235
|
</ul>
|
223
236
|
|
224
237
|
|
225
238
|
<ul>
|
226
|
-
<li>ec2onrails:restore_db_and_deploy
|
239
|
+
<li><code>cap ec2onrails:restore_db_and_deploy</code>
|
227
240
|
- Another convenience task to recreate the db, restore data to it from an s3
|
228
241
|
bucket and deploy the app, useful to set up a staging server.</li>
|
229
242
|
</ul>
|
@@ -299,18 +312,26 @@ or send me an <a href="http://pauldowman.com/contact/">email</a>.</p>
|
|
299
312
|
<h2>How to submit patches</h2>
|
300
313
|
|
301
314
|
|
302
|
-
|
303
|
-
|
315
|
+
Pleae read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people’s code</a>.
|
316
|
+
The source code can be checked out anonymously using:
|
317
|
+
<pre>
|
318
|
+
svn checkout http://ec2onrails.rubyforge.org/svn/trunk ec2onrails
|
319
|
+
</pre>
|
304
320
|
|
305
|
-
<p>
|
321
|
+
<p>Patches can be submitted to the <a href="http://rubyforge.org/tracker/?atid=17560&group_id=4552&func=browse">RubyForge Tracker</a>
|
322
|
+
or <a href="http://pauldowman.com/contact/">emailed directly to me</a> .</p>
|
306
323
|
|
307
324
|
|
308
325
|
<h2>License</h2>
|
309
326
|
|
310
327
|
|
311
328
|
<p>This code is free to use under the terms of the <span class="caps">GPL</span> v2.</p>
|
329
|
+
|
330
|
+
|
331
|
+
<p>If you find <span class="caps">EC2</span> on Rails useful please <a href="http://www.workingwithrails.com/person/10131-paul-dowman">recommend Paul Dowman</a>
|
332
|
+
at Working With Rails.</p>
|
312
333
|
<p class="coda">
|
313
|
-
<a href="http://pauldowman.com/contact/">Paul Dowman</a>,
|
334
|
+
<a href="http://pauldowman.com/contact/">Paul Dowman</a>, 19th May 2008<br>
|
314
335
|
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
315
336
|
</p>
|
316
337
|
</div>
|
data/website/index.txt
CHANGED
@@ -15,22 +15,27 @@ _Deploying a simple rails app is simple, and complex customization (if required)
|
|
15
15
|
|
16
16
|
Features of the EC2 image:
|
17
17
|
|
18
|
-
* Ready to deploy a Rails app with little or no configuration of the server required
|
19
|
-
* Automatic backup of MySQL database to S3
|
20
|
-
* Capistrano tasks to customize the server image, archive and restore the database to/from S3, and more (available as a rubygem)
|
18
|
+
* Ready to deploy a Rails app with little or no configuration of the server required
|
19
|
+
* Automatic backup of MySQL database to S3 (full backup nightly + incremental backup using binary logs every 10 minutes)
|
20
|
+
* Capistrano tasks to customize the server image, archive and restore the database to/from S3, and more (available as a rubygem)
|
21
21
|
* Mongrel_cluster behind Apache 2.2, configured according to
|
22
22
|
"Coda Hale's excellent guide":http://blog.codahale.com/2006/06/19/time-for-a-grown-up-server-rails-mongrel-apache-capistrano-and-you/
|
23
|
-
* Ruby on Rails 1.2.
|
23
|
+
* Ruby on Rails 2.0.2 and 1.2.6
|
24
24
|
* Ruby 1.8.6
|
25
25
|
* MySQL 5
|
26
|
-
*
|
26
|
+
* "memcached":http://www.danga.com/memcached/
|
27
|
+
* "monit":http://www.tildeslash.com/monit/ system monitoring
|
28
|
+
* Ubuntu 7.10 "Gutsy" base image built using "Eric Hammond's EC2 Ubuntu script":http://alestic.com/
|
29
|
+
* SSL support
|
27
30
|
* Amazon AMI tools installed
|
28
31
|
* A script to rebundle a customized version of the image in one step if required
|
29
32
|
* MySQL, Apache, and syslog configured to use /mnt for data and logging so you don't fill up EC2's small root filesystem
|
30
33
|
* Automatically archives Rails and Apache logs to S3 nightly.
|
31
34
|
* 32-bit and 64-bit images available (supports all instance types, small to extra large).
|
32
|
-
* Created using a build file, full source is available.
|
33
|
-
*
|
35
|
+
* Created using a build file, full source is "available":http://rubyforge.org/scm/?group_id=4552 (the EC2 on Rails script is run from "Eric Hammond's EC2 Ubuntu script":http://alestic.com/)
|
36
|
+
* Supports multiple instances
|
37
|
+
* Automatically runs hourly, daily, weekly and monthly scripts if they exist in Rails application's script directory
|
38
|
+
* Local SMTP server (postfix)
|
34
39
|
|
35
40
|
|
36
41
|
h2. Using the image
|
@@ -60,13 +65,16 @@ to the instance defined in your Capistrano "db" role.
|
|
60
65
|
|
61
66
|
h4. 4. Start up one or more instances of the image.
|
62
67
|
|
63
|
-
Soon there will be a Capistrano task to do this for you. In the meantime
|
68
|
+
Soon there will be a Capistrano task to do this for you. In the meantime I'm not going to lie, this part is complicated
|
69
|
+
the first time. Read the
|
64
70
|
"running an instance section":http://docs.amazonwebservices.com/AWSEC2/2007-08-29/GettingStartedGuide/running-an-instance.html
|
65
71
|
in Amazon's getting started guide.
|
66
72
|
|
67
73
|
For the AMI id's of the current images see the "change log":http://ec2onrails.rubyforge.org/svn/trunk/gem/History.txt
|
68
74
|
or do <code>cap ec2onrails:ami_ids</code> from within the app that you configured in the previous step.
|
69
75
|
|
76
|
+
_NOTE: Only use the images that match the current version of the gem._
|
77
|
+
|
70
78
|
Please see the "change log":http://ec2onrails.rubyforge.org/svn/trunk/gem/History.txt for release notes, and
|
71
79
|
see the "list of open issues":http://rubyforge.org/tracker/?atid=17558&group_id=4552&func=browse.
|
72
80
|
|
@@ -88,18 +96,21 @@ If you're using multiple instances, be sure to allow them network access to each
|
|
88
96
|
h4. 5. Copy your public key from the server to keep Capistrano happy
|
89
97
|
|
90
98
|
Technically all you should need to connect to the server is the private key file, the public key is on the server.
|
91
|
-
But for some reason
|
99
|
+
But for some reason
|
100
|
+
"Capistrano requires that you have both the public key and the private key files together on the client":http://groups.google.com/group/capistrano/browse_thread/thread/1102208ff925d18.
|
92
101
|
|
93
102
|
From within the root of your rails app do:
|
94
103
|
|
95
104
|
<pre>cap ec2onrails:get_public_key_from_server</pre>
|
96
105
|
|
106
|
+
Note, this will only work if you have an external ssh command in the path, it won't work for most Windows users.
|
107
|
+
|
97
108
|
|
98
109
|
h4. 6. Deploy the app with Capistrano
|
99
110
|
|
100
111
|
<pre>
|
101
112
|
cap ec2onrails:setup
|
102
|
-
cap deploy:
|
113
|
+
cap deploy:cold
|
103
114
|
</pre>
|
104
115
|
|
105
116
|
Yes, it's that easy! The setup task will set the server's timezone, install any
|
@@ -117,15 +128,15 @@ gems and Ubuntu packages to be installed. The deploy_files task uploads
|
|
117
128
|
files to the server (they will be owned by root). It's intended mainly for
|
118
129
|
customized config files for new packages installed via the install_packages
|
119
130
|
task.
|
120
|
-
* ec2onrails:server:deploy_files
|
121
|
-
* ec2onrails:server:set_timezone
|
122
|
-
* ec2onrails:server:upgrade_gems
|
123
|
-
* ec2onrails:server:upgrade_packages
|
124
|
-
* ec2onrails:server:install_gems
|
125
|
-
* ec2onrails:server:install_packages
|
126
|
-
* ec2onrails:server:upgrade_and_install_all
|
127
|
-
* ec2onrails:server:restart_services
|
128
|
-
* ec2onrails:server:set_roles
|
131
|
+
* <code>cap ec2onrails:server:deploy_files</code>
|
132
|
+
* <code>cap ec2onrails:server:set_timezone</code>
|
133
|
+
* <code>cap ec2onrails:server:upgrade_gems</code>
|
134
|
+
* <code>cap ec2onrails:server:upgrade_packages</code>
|
135
|
+
* <code>cap ec2onrails:server:install_gems</code>
|
136
|
+
* <code>cap ec2onrails:server:install_packages</code>
|
137
|
+
* <code>cap ec2onrails:server:upgrade_and_install_all</code>
|
138
|
+
* <code>cap ec2onrails:server:restart_services</code>
|
139
|
+
* <code>cap ec2onrails:server:set_roles</code>
|
129
140
|
- Customizes each instance for it's role(s) (as defined in your Capistrano deploy.rb file).
|
130
141
|
For now this just makes sure that only the appropriate services (Apache, Mongrel, and/or MySQL)
|
131
142
|
are running. Eventually this will customize settings for the running services also. Note that
|
@@ -136,21 +147,21 @@ For example, I use this to restore the current production data (from my actual p
|
|
136
147
|
bucket) onto a staging server that has the current production version of my
|
137
148
|
app. I then deploy the new version which tests migrations exactly as they'll
|
138
149
|
run on the production server.
|
139
|
-
* ec2onrails:db:archive
|
140
|
-
* ec2onrails:db:restore
|
141
|
-
* ec2onrails:db:create
|
142
|
-
* ec2onrails:db:drop
|
143
|
-
* ec2onrails:db:recreate
|
144
|
-
* ec2onrails:db:set_root_password
|
145
|
-
|
146
|
-
* ec2onrails:ami_ids
|
150
|
+
* <code>cap ec2onrails:db:archive</code>
|
151
|
+
* <code>cap ec2onrails:db:restore</code>
|
152
|
+
* <code>cap ec2onrails:db:create</code>
|
153
|
+
* <code>cap ec2onrails:db:drop</code>
|
154
|
+
* <code>cap ec2onrails:db:recreate</code>
|
155
|
+
* <code>cap ec2onrails:db:set_root_password</code>
|
156
|
+
|
157
|
+
* <code>cap ec2onrails:ami_ids</code>
|
147
158
|
- Shows the AMI id's of the images that match the current version of the gem.
|
148
159
|
|
149
|
-
* ec2onrails:setup
|
160
|
+
* <code>cap ec2onrails:setup</code>
|
150
161
|
- This is a convenience task to get a new instance completely set up in one
|
151
162
|
step, everything except deploying the app.
|
152
163
|
|
153
|
-
* ec2onrails:restore_db_and_deploy
|
164
|
+
* <code>cap ec2onrails:restore_db_and_deploy</code>
|
154
165
|
- Another convenience task to recreate the db, restore data to it from an s3
|
155
166
|
bucket and deploy the app, useful to set up a staging server.
|
156
167
|
|
@@ -215,11 +226,18 @@ See the "change log":http://ec2onrails.rubyforge.org/svn/trunk/gem/History.txt.
|
|
215
226
|
|
216
227
|
h2. How to submit patches
|
217
228
|
|
218
|
-
|
219
|
-
|
220
|
-
|
229
|
+
Pleae read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/.
|
230
|
+
The source code can be checked out anonymously using:
|
231
|
+
<pre>
|
232
|
+
svn checkout http://ec2onrails.rubyforge.org/svn/trunk ec2onrails
|
233
|
+
</pre>
|
221
234
|
|
235
|
+
Patches can be submitted to the "RubyForge Tracker":http://rubyforge.org/tracker/?atid=17560&group_id=4552&func=browse
|
236
|
+
or "emailed directly to me":http://pauldowman.com/contact/ .
|
222
237
|
|
223
238
|
h2. License
|
224
239
|
|
225
240
|
This code is free to use under the terms of the GPL v2.
|
241
|
+
|
242
|
+
If you find EC2 on Rails useful please "recommend Paul Dowman":http://www.workingwithrails.com/person/10131-paul-dowman
|
243
|
+
at Working With Rails.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ec2onrails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Dowman
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-05-19 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 2.
|
22
|
+
version: 2.3.0
|
23
23
|
version:
|
24
24
|
- !ruby/object:Gem::Dependency
|
25
25
|
name: archive-tar-minitar
|
@@ -101,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
101
|
requirements: []
|
102
102
|
|
103
103
|
rubyforge_project: ec2onrails
|
104
|
-
rubygems_version: 1.0
|
104
|
+
rubygems_version: 1.1.0
|
105
105
|
signing_key:
|
106
106
|
specification_version: 2
|
107
107
|
summary: Client-side libraries (Capistrano tasks) for managing and deploying to EC2 on Rails servers.
|