AppTower-ubistrano 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/changelog.markdown +12 -0
- data/lib/ubistrano/apache.rb +1 -1
- data/lib/ubistrano/deploy.rb +7 -7
- data/lib/ubistrano/helpers.rb +10 -6
- data/lib/ubistrano/sinatra.rb +3 -1
- data/lib/ubistrano/ssh.rb +13 -7
- data/lib/ubistrano/ubuntu.rb +28 -21
- data/lib/ubistrano.rb +46 -39
- data/templates/apache/virtual_host.erb +2 -3
- data/templates/sinatra/config.ru.erb +13 -4
- data/ubistrano.gemspec +3 -3
- metadata +3 -3
- data/changelog.rdoc +0 -25
data/changelog.markdown
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Version 1.1.0
|
2
|
+
-------------
|
3
|
+
|
4
|
+
* Sinatra apps deploying properly
|
5
|
+
* PHP and Rails apps should be deploying properly
|
6
|
+
* `cap ubuntu` flow hardened
|
7
|
+
|
8
|
+
Version 1.0.3
|
9
|
+
-------------
|
10
|
+
|
11
|
+
* `cap ubuntu` tested on Ubuntu 8.04 LTS Hardy
|
12
|
+
* App deploying not at all tested
|
data/lib/ubistrano/apache.rb
CHANGED
@@ -14,7 +14,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
14
14
|
namespace :virtual_host do
|
15
15
|
desc "Create a new virtual host"
|
16
16
|
task :create, :roles => :web do
|
17
|
-
upload_from_erb "/etc/apache2/sites-available/#{application}_#{stage}", binding, :name => 'virtual_host', :folder => '
|
17
|
+
upload_from_erb "/etc/apache2/sites-available/#{application}_#{stage}", binding, :name => 'virtual_host', :folder => 'apache'
|
18
18
|
end
|
19
19
|
|
20
20
|
desc "Enable a virtual host"
|
data/lib/ubistrano/deploy.rb
CHANGED
@@ -3,10 +3,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
3
3
|
namespace :deploy do
|
4
4
|
desc "Restart application"
|
5
5
|
task :restart, :roles => :app, :except => { :no_release => true } do
|
6
|
-
run_each
|
7
|
-
"mkdir #{current_path}/tmp",
|
8
|
-
"touch #{current_path}/tmp/restart.txt"
|
9
|
-
]
|
6
|
+
run_each "touch #{current_path}/tmp/restart.txt"
|
10
7
|
end
|
11
8
|
|
12
9
|
desc "Start application"
|
@@ -27,25 +24,28 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
27
24
|
]
|
28
25
|
mysql.create.db
|
29
26
|
deploy.setup
|
30
|
-
deploy.update
|
31
|
-
apache.virtual_host.create
|
32
27
|
case platform
|
28
|
+
when :php
|
29
|
+
deploy.update
|
33
30
|
when :rails
|
34
31
|
rails.config.default
|
32
|
+
deploy.update
|
35
33
|
deploy.migrate
|
36
34
|
when :sinatra
|
37
35
|
sinatra.config.default
|
36
|
+
deploy.update
|
38
37
|
sinatra.install
|
39
38
|
end
|
39
|
+
apache.virtual_host.create
|
40
40
|
deploy.start
|
41
41
|
apache.reload
|
42
42
|
end
|
43
43
|
|
44
44
|
desc "Stop servers and destroy all files"
|
45
45
|
task :destroy, :roles => :app do
|
46
|
-
deploy.stop
|
47
46
|
sudo "rm -Rf #{deploy_to}"
|
48
47
|
mysql.destroy.db
|
48
|
+
apache.virtual_host.destroy
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
data/lib/ubistrano/helpers.rb
CHANGED
@@ -113,7 +113,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def space(str)
|
116
|
-
"\n#{'=' *
|
116
|
+
"\n#{'=' * 80}\n#{str}"
|
117
117
|
end
|
118
118
|
|
119
119
|
|
@@ -161,12 +161,13 @@ If not, instructions for doing it manually will be displayed."
|
|
161
161
|
"Please run these manually:
|
162
162
|
sudo aptitude update
|
163
163
|
sudo aptitude upgrade
|
164
|
-
sudo aptitude build-essential
|
164
|
+
sudo aptitude build-essential
|
165
|
+
Continue?"
|
165
166
|
when :create_keys
|
166
167
|
"May I generate an rsa ssh key pair in your ~/.ssh folder?"
|
167
168
|
when :create_server_keys
|
168
|
-
"May I generate an rsa ssh key pair
|
169
|
-
The public key will be displayed."
|
169
|
+
"May I generate an rsa ssh key pair on the server?
|
170
|
+
The public key will be displayed for adding to your GitHub account."
|
170
171
|
when :god
|
171
172
|
"May I install God?"
|
172
173
|
when :god_apache
|
@@ -175,7 +176,7 @@ See #{File.expand_path '../../', File.dirname(__FILE__)}/templates/ubuntu/apache
|
|
175
176
|
when :god_mysql
|
176
177
|
"Would you like God to monitor mysql?
|
177
178
|
See #{File.expand_path '../../', File.dirname(__FILE__)}/templates/ubuntu/mysql.god.erb"
|
178
|
-
when :
|
179
|
+
when :god_sshd
|
179
180
|
"Would you like God to monitor sshd?
|
180
181
|
See #{File.expand_path '../../', File.dirname(__FILE__)}/templates/ubuntu/sshd.god.erb"
|
181
182
|
when :have_keys
|
@@ -199,6 +200,8 @@ Reload apache?"
|
|
199
200
|
"It is highly recommended you run mysql_secure_installation manually.
|
200
201
|
See http://dev.mysql.com/doc/refman/5.1/en/mysql-secure-installation.html
|
201
202
|
Continue?"
|
203
|
+
when :sinatra_install
|
204
|
+
"Would you like to run install.rb (from your app) if it exists?"
|
202
205
|
when :ssh_keys_create
|
203
206
|
"Create rsa ssh key pairs locally or remotely? (default: remote)"
|
204
207
|
when :ssh_keys_upload
|
@@ -215,7 +218,8 @@ Continue?"
|
|
215
218
|
"May I add sudo-without-password privileges for the deploy user?
|
216
219
|
I will have to edit /etc/sudoers."
|
217
220
|
when :ubuntu_restart
|
218
|
-
"
|
221
|
+
"Its probably a good idea to restart the server now.
|
222
|
+
OK?"
|
219
223
|
when :ubuntu_finished
|
220
224
|
"That's it! Glad you made it.
|
221
225
|
|
data/lib/ubistrano/sinatra.rb
CHANGED
@@ -3,7 +3,9 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
3
3
|
namespace :sinatra do
|
4
4
|
desc "Runs install.rb if exists"
|
5
5
|
task :install do
|
6
|
-
|
6
|
+
if yes(msg(:sinatra_install))
|
7
|
+
run_puts "if [ -e #{current_path}/install.rb ]; then sudo ruby #{current_path}/install.rb; fi"
|
8
|
+
end
|
7
9
|
end
|
8
10
|
|
9
11
|
namespace :config do
|
data/lib/ubistrano/ssh.rb
CHANGED
@@ -3,16 +3,22 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
3
3
|
namespace :ssh do
|
4
4
|
desc 'Generate ssh keys and upload to server'
|
5
5
|
task :default do
|
6
|
-
ssh.keys.create
|
6
|
+
ssh.keys.create.remote
|
7
|
+
ssh.keys.create.local
|
7
8
|
ssh.keys.upload
|
8
9
|
end
|
9
10
|
|
10
11
|
namespace :keys do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
namespace :create do
|
13
|
+
desc "Creates an rsa ssh key pair (local)"
|
14
|
+
task :local do
|
15
|
+
if ask(msg(:ssh_keys_create))[0..0].downcase == 'l'
|
16
|
+
system('ssh-keygen -t rsa') if yes(msg(:create_keys))
|
17
|
+
end unless yes(msg(:have_keys))
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Creates an rsa ssh key pair (remote)"
|
21
|
+
task :remote do
|
16
22
|
if yes(msg(:create_server_keys))
|
17
23
|
pass = ask "Enter a password for this key:"
|
18
24
|
sudo_each [
|
@@ -22,7 +28,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
22
28
|
]
|
23
29
|
sudo_puts "tail -1 /home/#{user}/.ssh/id_rsa.pub"
|
24
30
|
end
|
25
|
-
end
|
31
|
+
end
|
26
32
|
end
|
27
33
|
|
28
34
|
desc "Uploads local ssh public keys into remote authorized_keys"
|
data/lib/ubistrano/ubuntu.rb
CHANGED
@@ -4,16 +4,13 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
4
4
|
desc "Set up a fresh Ubuntu server"
|
5
5
|
task :default do
|
6
6
|
puts space(msg(:about_templates))
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
else
|
15
|
-
puts space(msg(:visudo))
|
16
|
-
end
|
7
|
+
puts space(msg(:visudo)) unless yes("Have you already created the user defined in deploy.rb?")
|
8
|
+
ssh.default
|
9
|
+
ubuntu.config.default
|
10
|
+
ubuntu.aptitude.default
|
11
|
+
ubuntu.install.default
|
12
|
+
ubuntu.restart
|
13
|
+
puts space(msg(:ubuntu_finished))
|
17
14
|
end
|
18
15
|
|
19
16
|
desc "Restart Ubuntu server"
|
@@ -23,6 +20,14 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
23
20
|
end
|
24
21
|
end
|
25
22
|
|
23
|
+
desc "Restart Ubuntu server and wait"
|
24
|
+
task :restart_and_wait do
|
25
|
+
if yes(msg(:ubuntu_restart))
|
26
|
+
sudo_each 'shutdown -r now'
|
27
|
+
exit unless yes('Please wait a little while for your server to restart. Continue?')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
26
31
|
namespace :aptitude do
|
27
32
|
desc 'Run all aptitude tasks'
|
28
33
|
task :default do
|
@@ -31,8 +36,9 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
31
36
|
aptitude.upgrade
|
32
37
|
aptitude.essential
|
33
38
|
else
|
34
|
-
msg
|
39
|
+
exit unless yes(msg(:aptitude_instructions))
|
35
40
|
end
|
41
|
+
ubuntu.restart_and_wait
|
36
42
|
end
|
37
43
|
|
38
44
|
desc 'Aptitude update'
|
@@ -118,7 +124,8 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
118
124
|
if yes("May I install Apache?")
|
119
125
|
sudo_puts [
|
120
126
|
'aptitude install apache2 apache2-mpm-prefork apache2-utils apache2.2-common libapr1 libaprutil1 ssl-cert -q -y',
|
121
|
-
'a2enmod rewrite'
|
127
|
+
'a2enmod rewrite',
|
128
|
+
'a2dissite default'
|
122
129
|
]
|
123
130
|
end
|
124
131
|
end
|
@@ -138,7 +145,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
138
145
|
if yes("May I install MySQL?")
|
139
146
|
sudo_puts 'aptitude install mysql-client-5.0 mysql-common mysql-server mysql-server-5.0 libmysqlclient15-dev libmysqlclient15off -q -y'
|
140
147
|
ROOT.mysql.create.user
|
141
|
-
yes
|
148
|
+
exit unless yes(msg(:secure_mysql))
|
142
149
|
end
|
143
150
|
end
|
144
151
|
|
@@ -151,7 +158,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
151
158
|
"cd #{bin} && sudo chmod 0700 mysqltuner.pl",
|
152
159
|
"cd #{bin} && sudo mv mysqltuner.pl mysqltuner"
|
153
160
|
]
|
154
|
-
yes
|
161
|
+
exit unless yes(msg(:mysqltuner_instructions))
|
155
162
|
end
|
156
163
|
end
|
157
164
|
|
@@ -193,12 +200,12 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
193
200
|
|
194
201
|
desc 'Install Ruby'
|
195
202
|
task :ruby, :roles => :app do
|
196
|
-
|
197
|
-
sudo_puts
|
198
|
-
|
199
|
-
make_install(path)
|
200
|
-
|
201
|
-
end
|
203
|
+
if yes("May I install Ruby?")
|
204
|
+
sudo_puts "aptitude install libopenssl-ruby -q -y"
|
205
|
+
install_source(:ruby) do |path|
|
206
|
+
sudo_puts make_install(path)
|
207
|
+
end
|
208
|
+
end
|
202
209
|
end
|
203
210
|
|
204
211
|
desc 'Install RubyGems'
|
@@ -235,7 +242,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
235
242
|
upload_from_erb('/usr/local/etc/god/sshd.god', binding, :folder => 'ubuntu') if yes(msg(:god_sshd))
|
236
243
|
sudo_puts [
|
237
244
|
'update-rc.d god defaults',
|
238
|
-
'
|
245
|
+
'/etc/init.d/god start'
|
239
246
|
]
|
240
247
|
end
|
241
248
|
end
|
data/lib/ubistrano.rb
CHANGED
@@ -5,19 +5,42 @@ Dir["#{File.dirname(__FILE__)}/ubistrano/*.rb"].each { |f| require f }
|
|
5
5
|
|
6
6
|
Capistrano::Configuration.instance(:must_exist).load do
|
7
7
|
|
8
|
-
#
|
9
|
-
|
8
|
+
# Default capistrano/ubistrano values
|
9
|
+
set :ubistrano, {
|
10
|
+
:base_dir => '/var/www',
|
11
|
+
:db_user => 'app',
|
12
|
+
:db_pass => '',
|
13
|
+
:deploy_via => :remote_cache,
|
14
|
+
:domain => [],
|
15
|
+
:platform => :rails,
|
16
|
+
:plugins => {},
|
17
|
+
:port => 22,
|
18
|
+
:repository_cache => 'git_cache',
|
19
|
+
:scm => :git,
|
20
|
+
:stage => :production,
|
21
|
+
:use_sudo => false,
|
22
|
+
:user => 'deploy',
|
23
|
+
:versions => {}
|
24
|
+
}.merge(ubistrano)
|
25
|
+
|
26
|
+
# Default plugins
|
27
|
+
ubistrano[:plugins] = {
|
28
|
+
:app_helpers => false,
|
29
|
+
:asset_packager => false,
|
30
|
+
:attachment_fu => false,
|
31
|
+
:rails_widget => false,
|
32
|
+
:thinking_sphinx => false
|
33
|
+
}.merge(ubistrano[:plugins])
|
10
34
|
|
11
|
-
# Default
|
12
|
-
ubistrano[:versions]
|
13
|
-
ubistrano[:versions].merge!(
|
35
|
+
# Default versions
|
36
|
+
ubistrano[:versions] = {
|
14
37
|
:git => '1.6.0.4',
|
15
38
|
:mysecureshell => '1.1',
|
16
39
|
:rails => '2.2.2',
|
17
40
|
:ruby => '1.8.7-p72',
|
18
41
|
:rubygems => '1.3.1',
|
19
42
|
:sphinx => '0.9.8.1'
|
20
|
-
)
|
43
|
+
}.merge(ubistrano[:versions])
|
21
44
|
|
22
45
|
# Merge ubistrano hash with capistrano
|
23
46
|
ubistrano.each do |key, value|
|
@@ -26,46 +49,30 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
26
49
|
set(key, value)
|
27
50
|
end
|
28
51
|
|
29
|
-
#
|
30
|
-
set :
|
31
|
-
set :db_pass, fetch(:db_pass, '')
|
32
|
-
set :platform, fetch(:platform, :rails)
|
33
|
-
set :port, fetch(:port, 22)
|
34
|
-
set :stage, fetch(:stage, :production)
|
35
|
-
set :use_sudo, fetch(:use_sudo, false)
|
36
|
-
set :user, fetch(:user, 'deploy')
|
37
|
-
set :sources, fetch(:sources, {
|
52
|
+
# Default sources
|
53
|
+
set :sources, {
|
38
54
|
:git => "http://kernel.org/pub/software/scm/git/git-#{versions_git}.tar.gz",
|
39
55
|
:mysecureshell => "http://internap.dl.sourceforge.net/sourceforge/mysecureshell/MySecureShell-#{versions_mysecureshell}_source.tgz",
|
40
56
|
:mysqltuner => "http://mysqltuner.com/mysqltuner.pl",
|
41
57
|
:ruby => "ftp://ftp.ruby-lang.org/pub/ruby/#{versions_ruby.split('.')[0..1].join('.')}/ruby-#{versions_ruby}.tar.gz",
|
42
58
|
:rubygems => "http://rubyforge.org/frs/download.php/45905/rubygems-#{versions_rubygems}.tgz",
|
43
59
|
:sphinx => "http://www.sphinxsearch.com/downloads/sphinx-#{versions_sphinx}.tar.gz"
|
44
|
-
})
|
60
|
+
}.merge(fetch(:sources, {}))
|
45
61
|
|
46
|
-
# Rails plugins
|
47
|
-
set :app_helpers, fetch(:app_helpers, false)
|
48
|
-
set :rails_widget, fetch(:rails_widget, false)
|
49
|
-
set :ultrasphinx, fetch(:ultrasphinx, false)
|
50
|
-
set :thinking_sphinx, fetch(:thinking_sphinx, false)
|
51
|
-
set :attachment_fu, fetch(:attachment_fu, false)
|
52
|
-
set :asset_packager, fetch(:asset_packager, false)
|
53
|
-
after('deploy:update_code', 'rails:config:app_helpers') if app_helpers
|
54
|
-
after('deploy:update_code', 'rails:config:asset_packager') if asset_packager
|
55
|
-
after('deploy:update_code', 'rails:config:attachment_fu') if attachment_fu
|
56
|
-
after('deploy:update_code', 'rails:config:rails_widget') if rails_widget
|
57
|
-
after('deploy:update_code', 'rails:config:ultrasphinx') if ultrasphinx
|
58
|
-
after('deploy:update_code', 'rails:config:thinking_sphinx') if thinking_sphinx
|
59
|
-
|
60
|
-
# Git by default
|
61
|
-
set :scm, :git
|
62
|
-
set :deploy_via, :remote_cache
|
63
|
-
set :repository_cache, 'git_cache'
|
64
|
-
ssh_options[:paranoid] = false
|
65
|
-
|
66
62
|
# Events
|
67
|
-
on :before, 'setup_stage', :except => [ :staging, :testing ]
|
68
|
-
after('deploy:update_code', 'rails:config:to_app' )
|
69
|
-
after('deploy:update_code', 'sinatra:config:to_app')
|
63
|
+
on :before, 'setup_stage', :except => [ :staging, :testing ] # Executed before every task
|
64
|
+
after('deploy:update_code', 'rails:config:to_app' ) if platform == :rails
|
65
|
+
after('deploy:update_code', 'sinatra:config:to_app') if platform == :sinatra
|
66
|
+
after('deploy:update_code', 'rails:config:app_helpers') if plugins_app_helpers
|
67
|
+
after('deploy:update_code', 'rails:config:asset_packager') if plugins_asset_packager
|
68
|
+
after('deploy:update_code', 'rails:config:attachment_fu') if plugins_attachment_fu
|
69
|
+
after('deploy:update_code', 'rails:config:rails_widget') if plugins_rails_widget
|
70
|
+
after('deploy:update_code', 'rails:config:thinking_sphinx') if plugins_thinking_sphinx
|
71
|
+
|
72
|
+
# Other options
|
73
|
+
ssh_options[:paranoid] = false
|
74
|
+
|
75
|
+
# Reference ROOT when namespaces clash
|
76
|
+
ROOT = self
|
70
77
|
|
71
78
|
end
|
@@ -1,10 +1,19 @@
|
|
1
1
|
require 'sinatra'
|
2
2
|
require 'rubygems'
|
3
|
-
|
3
|
+
|
4
4
|
Sinatra::Application.default_options.merge!(
|
5
5
|
:run => false,
|
6
|
-
:env => :production
|
6
|
+
:env => :production,
|
7
|
+
:raise_errors => true,
|
8
|
+
:app_file => 'app.rb',
|
9
|
+
:root => '<%= deploy_to %>/current',
|
10
|
+
:views => '<%= deploy_to %>/current/views',
|
11
|
+
:public => '<%= deploy_to %>/current/public'
|
7
12
|
)
|
8
|
-
|
9
|
-
|
13
|
+
|
14
|
+
log = File.new('<%= deploy_to %>/shared/log/sinatra.log', 'a')
|
15
|
+
STDOUT.reopen(log)
|
16
|
+
STDERR.reopen(log)
|
17
|
+
|
18
|
+
require 'app'
|
10
19
|
run Sinatra.application
|
data/ubistrano.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'ubistrano'
|
3
|
-
s.version = '1.0
|
4
|
-
s.date = '2008-12-
|
3
|
+
s.version = '1.1.0'
|
4
|
+
s.date = '2008-12-14'
|
5
5
|
|
6
6
|
s.summary = "Provision and deploy to an Ubuntu/God/Apache/Passenger stack using Capistrano"
|
7
7
|
s.description = "Provision and deploy to an Ubuntu/God/Apache/Passenger stack using Capistrano"
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
MIT-LICENSE
|
18
18
|
README.markdown
|
19
19
|
Rakefile
|
20
|
-
changelog.
|
20
|
+
changelog.markdown
|
21
21
|
example/deploy.rb
|
22
22
|
lib/ubistrano.rb
|
23
23
|
lib/ubistrano/apache.rb
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: AppTower-ubistrano
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AppTower
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-12-
|
12
|
+
date: 2008-12-14 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -25,7 +25,7 @@ files:
|
|
25
25
|
- MIT-LICENSE
|
26
26
|
- README.markdown
|
27
27
|
- Rakefile
|
28
|
-
- changelog.
|
28
|
+
- changelog.markdown
|
29
29
|
- example/deploy.rb
|
30
30
|
- lib/ubistrano.rb
|
31
31
|
- lib/ubistrano/apache.rb
|
data/changelog.rdoc
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
|
2
|
-
Version 2.0.0
|
3
|
-
* Tested on Ubuntu 8.04 LTS Hardy
|
4
|
-
* Deploys PHP, Rails, and Sinatra apps
|
5
|
-
* Redux version with new stack
|
6
|
-
* Apache
|
7
|
-
* Git
|
8
|
-
* God
|
9
|
-
* MySQL
|
10
|
-
* Passenger (mod_rails)
|
11
|
-
* Rails
|
12
|
-
* Ruby Enterprise Edition
|
13
|
-
|
14
|
-
Version 1.1.0
|
15
|
-
* Tested on Debian Etch
|
16
|
-
* Git
|
17
|
-
* Nginx
|
18
|
-
* Mongrel cluster
|
19
|
-
* Monit
|
20
|
-
* MySQL
|
21
|
-
* PHP (Nginx w/ spawn-fcgi)
|
22
|
-
* Rails
|
23
|
-
* Ruby
|
24
|
-
* RubyGems
|
25
|
-
* Sphinx
|