railslove_deploy 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +20 -0
- data/README +12 -0
- data/TODO +4 -0
- data/bin/deployify +31 -0
- data/lib/railslove/recipes/apache.rb +45 -0
- data/lib/railslove/recipes/backup.rb +8 -0
- data/lib/railslove/recipes/db.rb +52 -0
- data/lib/railslove/recipes/deploy.rb +49 -0
- data/lib/railslove/recipes/ferm.rb +12 -0
- data/lib/railslove/recipes/gems.rb +50 -0
- data/lib/railslove/recipes/helpers.rb +35 -0
- data/lib/railslove/recipes/hooks.rb +31 -0
- data/lib/railslove/recipes/job_runner.rb +17 -0
- data/lib/railslove/recipes/logrotate.rb +35 -0
- data/lib/railslove/recipes/memcache.rb +21 -0
- data/lib/railslove/recipes/misc.rb +36 -0
- data/lib/railslove/recipes/monit.rb +32 -0
- data/lib/railslove/recipes/passenger.rb +25 -0
- data/lib/railslove/recipes/shared.rb +16 -0
- data/lib/railslove/recipes/sphinx.rb +37 -0
- data/lib/railslove/recipes/workling.rb +26 -0
- data/lib/railslove/recipes.rb +7 -0
- data/lib/railslove/sprinkle/apache.rb +45 -0
- data/lib/railslove/sprinkle/essentials.rb +14 -0
- data/lib/railslove/sprinkle/ferm.rb +23 -0
- data/lib/railslove/sprinkle/git.rb +15 -0
- data/lib/railslove/sprinkle/image_magick.rb +5 -0
- data/lib/railslove/sprinkle/memcache.rb +42 -0
- data/lib/railslove/sprinkle/monit.rb +34 -0
- data/lib/railslove/sprinkle/mysql.rb +20 -0
- data/lib/railslove/sprinkle/nginx.rb +16 -0
- data/lib/railslove/sprinkle/passenger.rb +68 -0
- data/lib/railslove/sprinkle/rails_user.rb +19 -0
- data/lib/railslove/sprinkle/ruby_enterprise.rb +38 -0
- data/lib/railslove/sprinkle/sphinx.rb +14 -0
- data/lib/railslove/sprinkle/sqlite.rb +15 -0
- data/lib/railslove/sprinkle/subversion.rb +4 -0
- data/lib/railslove/sprinkle/usefull_gems.rb +10 -0
- data/lib/railslove/sprinkle.rb +3 -0
- data/lib/railslove/templates/deploy.rb +177 -0
- data/lib/railslove/templates/ferm.conf.erb +56 -0
- data/lib/railslove/templates/maintenance.html +0 -0
- data/lib/railslove/templates/memcache_init +31 -0
- data/lib/railslove/templates/monit_init +115 -0
- data/lib/railslove/templates/monitoring/apache.monit.erb +18 -0
- data/lib/railslove/templates/monitoring/job_worker.monit.erb +4 -0
- data/lib/railslove/templates/monitoring/memcached.monit.erb +4 -0
- data/lib/railslove/templates/monitoring/mysql.monit.erb +5 -0
- data/lib/railslove/templates/monitoring/nginx.monit.erb +4 -0
- data/lib/railslove/templates/monitoring/sphinx.monit.erb +0 -0
- data/lib/railslove/templates/monitoring/sshd.monit.erb +5 -0
- data/lib/railslove/templates/monitrc.erb +236 -0
- data/lib/railslove/templates/nginx.conf +0 -0
- data/lib/railslove/templates/nginx_init +65 -0
- data/lib/railslove/templates/passenger.conf +3 -0
- data/lib/railslove/templates/passenger.load +1 -0
- data/lib/railslove/templates/post_logrotate +1 -0
- data/lib/railslove/templates/safe.rb +42 -0
- data/lib/railslove/templates/sprinkle.rb +43 -0
- data/lib/railslove/templates/sprinkle_config.rb +2 -0
- data/lib/railslove/templates/sshd_config.erb +81 -0
- data/lib/railslove/templates/stack_readme.txt +4 -0
- data/lib/railslove/templates/vhost.erb +42 -0
- data/lib/railslove_deploy.rb +0 -0
- data/test/railslove_deploy_test.rb +7 -0
- data/test/test_helper.rb +7 -0
- metadata +132 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008 Michael Bumann
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
railslove_deploy
|
2
|
+
================
|
3
|
+
|
4
|
+
The Railslove deploy gem to setup a full ruby server stack. Includes Sprinkle setup scripts and Capistrano deployment recipes.
|
5
|
+
|
6
|
+
TODO: README
|
7
|
+
|
8
|
+
|
9
|
+
COPYRIGHT
|
10
|
+
=========
|
11
|
+
|
12
|
+
Copyright (c) 2008 Michael Bumann. See LICENSE for details.
|
data/TODO
ADDED
data/bin/deployify
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
if ARGV.first == "install"
|
3
|
+
require "#{File.dirname(__FILE__)}/../lib/railslove/sprinkle"
|
4
|
+
Sprinkle::Script.sprinkle File.read("config/server/policy.rb"), "config/server/policy.rb"
|
5
|
+
else
|
6
|
+
require "fileutils"
|
7
|
+
folder = "."
|
8
|
+
|
9
|
+
`capify #{folder}`
|
10
|
+
|
11
|
+
FileUtils.mkdir_p("#{folder}/config/deploy")
|
12
|
+
FileUtils.mkdir_p("#{folder}/config/server")
|
13
|
+
FileUtils.mkdir_p("#{folder}/config/server/monit")
|
14
|
+
|
15
|
+
FileUtils.cp("#{File.dirname(__FILE__)}/../lib/railslove/templates/vhost.erb", "#{folder}/config/server/vhost.erb")
|
16
|
+
FileUtils.cp("#{File.dirname(__FILE__)}/../lib/railslove/templates/sprinkle.rb", "#{folder}/config/server/policy.rb")
|
17
|
+
FileUtils.cp("#{File.dirname(__FILE__)}/../lib/railslove/templates/sprinkle_config.rb", "#{folder}/config/server/config.rb")
|
18
|
+
FileUtils.cp("#{File.dirname(__FILE__)}/../lib/railslove/templates/deploy.rb", "#{folder}/config/deploy.rb")
|
19
|
+
FileUtils.cp("#{File.dirname(__FILE__)}/../lib/railslove/templates/safe.rb", "#{folder}/config/server/backup.rb")
|
20
|
+
FileUtils.cp("#{File.dirname(__FILE__)}/../lib/railslove/templates/maintenance.html", "#{folder}/config/server/maintenance.html")
|
21
|
+
|
22
|
+
FileUtils.cp("#{File.dirname(__FILE__)}/../lib/railslove/templates/monitrc.erb", "#{folder}/config/server/monitrc.erb")
|
23
|
+
#Dir.new("#{File.dirname(__FILE__)}/../lib/railslove/templates/monitoring").each do |monit_config|
|
24
|
+
# next unless File.file?("#{File.dirname(__FILE__)}/../lib/railslove/templates/monitoring/#{monit_config}")
|
25
|
+
# FileUtils.cp("#{File.dirname(__FILE__)}/../lib/railslove/templates/monitoring/#{monit_config}", "#{folder}/config/server/monit/#{monit_config}")
|
26
|
+
#end
|
27
|
+
|
28
|
+
FileUtils.cp("#{File.dirname(__FILE__)}/../lib/railslove/templates/ferm.conf.erb", "#{folder}/config/server/ferm.conf.erb")
|
29
|
+
|
30
|
+
puts "[Deployment files created]"
|
31
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# from josh's (http://joshpeek.com/) slicehost dpeloyment: http://github.com/josh/slicehost/tree/master
|
2
|
+
namespace :apache do
|
3
|
+
desc "Restart Apache"
|
4
|
+
task :restart, :roles => :web do
|
5
|
+
sudo "/etc/init.d/apache2 restart"
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Start Apache"
|
9
|
+
task :start, :roles => :web do
|
10
|
+
sudo "/etc/init.d/apache2 start"
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Stop Apache"
|
14
|
+
task :stop, :roles => :web do
|
15
|
+
sudo "/etc/init.d/apache2 stop"
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Reload Apache"
|
19
|
+
task :reload, :roles => :web do
|
20
|
+
sudo "/etc/init.d/apache2 reload"
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Force reload Apache"
|
24
|
+
task :force_reload, :roles => :web do
|
25
|
+
sudo "/etc/init.d/apache2 force-reload"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Disable Apache site"
|
29
|
+
task :disable_site, :roles => :web do
|
30
|
+
sudo "sudo a2dissite #{application}"
|
31
|
+
reload
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "Enable Apache site"
|
35
|
+
task :enable_site, :roles => :web do
|
36
|
+
sudo "sudo a2ensite #{application}"
|
37
|
+
reload
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "Upload Apache virtual host"
|
41
|
+
task :upload_vhost_config, :roles => :web do
|
42
|
+
put render("config/server/vhost.erb", binding), "/tmp/#{application}"
|
43
|
+
sudo "mv /tmp/#{application} /etc/apache2/sites-available/#{application}"
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
namespace :db do
|
2
|
+
desc "Restarts MySQL database server"
|
3
|
+
task :restart, :roles => :db do
|
4
|
+
sudo "/etc/init.d/mysql restart"
|
5
|
+
end
|
6
|
+
|
7
|
+
desc "Starts MySQL database server"
|
8
|
+
task :start, :roles => :db do
|
9
|
+
sudo "/etc/init.d/mysql start"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Stops MySQL database server"
|
13
|
+
task :stop, :roles => :db do
|
14
|
+
sudo "/etc/init.d/mysql stop"
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Export MySQL database"
|
18
|
+
task :export, :roles => :db do
|
19
|
+
database = Capistrano::CLI.ui.ask("Which database should we export: ")
|
20
|
+
sudo "mysqldump -u root -p #{database} > #{database}.sql"
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "run the rake db:create task for the specific environment"
|
24
|
+
task :create, :roles => :db, :only => { :primary => true } do
|
25
|
+
rake("db:create")
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Upload the database yml from the /config/database.yml"
|
29
|
+
task :upload_config_yml, :roles => :db do
|
30
|
+
put open("config/database.yml").read, "#{shared_path}/database.yml"
|
31
|
+
end
|
32
|
+
desc "Symlink database.yml to shared path"
|
33
|
+
task :symlink_config_yml, :roles => :db do
|
34
|
+
run "ln -nfs #{shared_path}/database.yml #{release_path}/config/database.yml"
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "create a backup of the mysql database save it to shared/backups/database and download it to /backups"
|
38
|
+
task :backup, :roles => :db, :only => { :primary => true } do
|
39
|
+
filename = "#{application}.dump.#{Time.now.to_i}.sql.bz2"
|
40
|
+
dir = backup_dir || "#{shared_dir}/backups"
|
41
|
+
file = "#{dir}/#{filename}"
|
42
|
+
|
43
|
+
on_rollback { delete file }
|
44
|
+
|
45
|
+
db = YAML::load(ERB.new(IO.read(File.join('config', 'database.yml'))).result)[rails_env]
|
46
|
+
run "mysqldump -u #{db['username']} --password=#{db['password']} #{db['database']} | bzip2 -c > #{file}" do |ch, stream, data|
|
47
|
+
puts data
|
48
|
+
end
|
49
|
+
`mkdir -p backups/`
|
50
|
+
get file, "backups/#{filename}"
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
namespace :deploy do
|
2
|
+
|
3
|
+
desc "restart"
|
4
|
+
task :restart, :roles => :web do
|
5
|
+
passenger.restart
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "restart"
|
9
|
+
task :start, :roles => :web do
|
10
|
+
passenger.restart
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "stop"
|
14
|
+
task :stop, :roles => :web do
|
15
|
+
end
|
16
|
+
|
17
|
+
namespace :web do
|
18
|
+
|
19
|
+
desc "disable application by adding a maintenance.html"
|
20
|
+
task :disable, :roles => :web do
|
21
|
+
on_rollback {
|
22
|
+
run "rm #{shared_path}/system/maintenance.html"
|
23
|
+
}
|
24
|
+
put render("config/server/maintenance.html", binding), "#{shared_path}/system/maintenance.html"
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "enable "
|
28
|
+
task :enable, :roles => :web do
|
29
|
+
run "rm #{shared_path}/system/maintenance.html"
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Restart Apache"
|
33
|
+
task :restart, :roles => :web do
|
34
|
+
apache.restart
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "Start Apache"
|
38
|
+
task :start, :roles => :web do
|
39
|
+
apache.start
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "Stop Apache"
|
43
|
+
task :stop, :roles => :web do
|
44
|
+
apache.stop
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
namespace :ferm do
|
2
|
+
|
3
|
+
desc "Configure IPtables using ferm"
|
4
|
+
task :configure do
|
5
|
+
put render("config/server/ferm.conf.erb", binding), "/tmp/ferm"
|
6
|
+
# make sure we have a /etc/ferm directory. we use echo 0 to ignore errors - for example if the folder already exists. ;)
|
7
|
+
sudo "mkdir /etc/ferm;echo 0"
|
8
|
+
sudo "mv /tmp/ferm /etc/ferm/ferm.conf"
|
9
|
+
sudo "/etc/init.d/ferm restart"
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# THANKS: http://dev.animoto.com/articles/capistrano-gem-management
|
2
|
+
# ===========
|
3
|
+
# CAP GEMS
|
4
|
+
# Author: Stevie Clifton
|
5
|
+
# Somewhat hackish tasks for managing/installing remote gems
|
6
|
+
# that is loosely similar to "rake gems" in rails.
|
7
|
+
#
|
8
|
+
# Usage:
|
9
|
+
# > cap gems
|
10
|
+
# [ ] RubyInline >=3.7.0 (box1.yourdomain.com, box2.yourdomain.com)
|
11
|
+
# [I] image_science 1.1.3
|
12
|
+
#
|
13
|
+
# > cap gems:install
|
14
|
+
# ...lots of cap stuff echoed to screen...
|
15
|
+
# Successfully installed RubyInline >=3.7.0
|
16
|
+
#
|
17
|
+
# > cap gems
|
18
|
+
# [I] RubyInline >=3.7.0
|
19
|
+
# [I] image_science 1.1.3
|
20
|
+
#
|
21
|
+
# ===========
|
22
|
+
|
23
|
+
namespace :gems do
|
24
|
+
|
25
|
+
# prints status of all gems on remote system
|
26
|
+
task :default do
|
27
|
+
results = []
|
28
|
+
with_gem_dependencies do |dep, gem, version|
|
29
|
+
install_status = "[#{dep.pass? ? 'I' : ' '}]"
|
30
|
+
hosts = dep.hosts ? "(#{dep.hosts})" : ""
|
31
|
+
results << "#{install_status} #{gem.to_s} #{version} #{hosts}"
|
32
|
+
end
|
33
|
+
results.each {|r| puts r}
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "installs gems listed in depend declarations"
|
37
|
+
task :install do
|
38
|
+
results = []
|
39
|
+
with_gem_dependencies do |dep, gem, version|
|
40
|
+
unless dep.pass?
|
41
|
+
sudo "gem install --no-ri --no-rdoc #{"--version '#{version}' " if version}#{gem}"
|
42
|
+
results << "Successfully installed #{gem} #{version}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
results.each {|r| puts r}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
#====================
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# run a rake task
|
2
|
+
def rake(task, args={})
|
3
|
+
rails_env = args[:rails_env] || fetch(:rails_env, "production")
|
4
|
+
rake_env = args[:rake_env] || fetch(:rake_env, "")
|
5
|
+
rake = fetch(:rake, "rake")
|
6
|
+
directory = args[:directory] || release_path
|
7
|
+
run "sh -c 'cd #{directory}; #{rake} #{task} RAILS_ENV=#{rails_env} #{rake_env}'"
|
8
|
+
end
|
9
|
+
|
10
|
+
def render(template,bind=binding)
|
11
|
+
ERB.new(open(template).read).result(bind)
|
12
|
+
end
|
13
|
+
|
14
|
+
# THANKS: http://dev.animoto.com/articles/capistrano-gem-management
|
15
|
+
# ===========
|
16
|
+
# CAP GEMS
|
17
|
+
# Author: Stevie Clifton
|
18
|
+
def gem_list
|
19
|
+
fetch(:dependencies, {})[:remote][:gem] rescue {}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Passes the Deploy::Dependency after running a check, the gem,
|
23
|
+
# and version to a block. Deploy::Dependency does not have any
|
24
|
+
# internal awareness of which gem it is, which make doing this
|
25
|
+
# a PITA. Probably would be wiser to extend Deploy::Dependency
|
26
|
+
# to save the gem name and args so that we could query them directly
|
27
|
+
#
|
28
|
+
def with_gem_dependencies &block
|
29
|
+
Deploy::Dependencies.new(strategy.configuration) do |d|
|
30
|
+
gem_list.each do |gem, version|
|
31
|
+
dep = d.remote.gem(gem, version, {})
|
32
|
+
yield dep, gem, version
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# thanks to Arya Asemanfa (http://asemanfar.com/) for http://github.com/arya/capistrano_twitter
|
2
|
+
require 'net/http'
|
3
|
+
require 'uri'
|
4
|
+
require 'cgi'
|
5
|
+
|
6
|
+
namespace :hooks do
|
7
|
+
namespace :twitter do
|
8
|
+
desc "Update twitter status"
|
9
|
+
task :update do
|
10
|
+
url = URI.parse("http://twitter.com/statuses/update.json")
|
11
|
+
|
12
|
+
status = Capistrano::CLI.ui.ask("Update Twitter status to: (leave blank to skip)")
|
13
|
+
unless status.empty?
|
14
|
+
|
15
|
+
http = Net::HTTP.new(url.host, 80)
|
16
|
+
http.open_timeout = 20
|
17
|
+
|
18
|
+
headers = {'Authorization' => 'Basic ' + ["#{twitter_user}:#{twitter_password}"].pack('m').delete("\r\n")}
|
19
|
+
|
20
|
+
body = "status=#{CGI.escape(status)}"
|
21
|
+
begin
|
22
|
+
http.send(:post, url.path, body, headers)
|
23
|
+
rescue Timeout::Error => e
|
24
|
+
puts "Timeout after 20s: Seems like Twitter is down."
|
25
|
+
puts "Use \"cap twitter:update\" to update Twitter status later w/o deploying"
|
26
|
+
end
|
27
|
+
# if an exception is thrown, let them see it, they're a developer (most likely)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
namespace :job_runner do
|
2
|
+
desc "Start your Job runner process"
|
3
|
+
task :start, :roles => :app do
|
4
|
+
run "cd #{release_path}; RAILS_ENV=#{fetch(:rails_env, "production")} #{fetch(:job_runner_script, "script/job_runner")} start"
|
5
|
+
end
|
6
|
+
|
7
|
+
desc "Stop your Job runner process"
|
8
|
+
task :stop, :roles => :app do
|
9
|
+
run "cd #{current_path}; RAILS_ENV=#{fetch(:rails_env, "production")} #{fetch(:job_runner_script, "script/job_runner")} stop"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Restart your Job runner process"
|
13
|
+
task :restart, :roles => :app do
|
14
|
+
run "cd #{current_path}; RAILS_ENV=#{fetch(:rails_env, "production")} #{fetch(:job_runner_script, "script/job_runner")} restart"
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
namespace :logrotate do
|
2
|
+
|
3
|
+
desc "generate and save a logrotation config file"
|
4
|
+
task :configure do
|
5
|
+
filename = "/etc/logrotate.d/#{application}"
|
6
|
+
tmp_file = "/tmp/logrotate_#{application}"
|
7
|
+
put generate_logrotate_configuration, tmp_file
|
8
|
+
sudo "mv #{tmp_file} #{filename}"
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Force logrotate to run"
|
13
|
+
task :force do
|
14
|
+
sudo "logrotate -f /etc/logrotate.conf"
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_logrotate_configuration
|
20
|
+
config = []
|
21
|
+
fetch(:logrotate_options, []).each do |option|
|
22
|
+
if option.is_a?(Hash)
|
23
|
+
option.each do |key, value|
|
24
|
+
config << "#{key} #{value}"
|
25
|
+
end
|
26
|
+
else
|
27
|
+
config << option.to_s
|
28
|
+
end
|
29
|
+
end
|
30
|
+
%Q{
|
31
|
+
#{logrotate_directory}/*.log {
|
32
|
+
#{config.join("\n ")}
|
33
|
+
}
|
34
|
+
}
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
namespace :memcache do
|
2
|
+
|
3
|
+
desc "Start Memcached"
|
4
|
+
task :start, :roles => :cache do
|
5
|
+
sudo "/etc/init.d/memcached start"
|
6
|
+
#sudo "memcached -d -m #{memcache_memory} -l #{memcache_ip} -p #{memcache_port}"
|
7
|
+
end
|
8
|
+
|
9
|
+
desc "Stop Memcached using killall"
|
10
|
+
task :stop, :roles => :cache do
|
11
|
+
sudo "/etc/init.d/memcached stop"
|
12
|
+
#sudo "killall memcached; echo 0"
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Restart Memcached"
|
16
|
+
task :restart, :roles => :cache do
|
17
|
+
stop
|
18
|
+
start
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
desc "Connect to the Server(s) via SSH"
|
2
|
+
task :ssh do
|
3
|
+
#sorry I don't know how to make this nice and DRY... *shame on me*
|
4
|
+
don_ips = []
|
5
|
+
# if you enter an role - just connect to these servers
|
6
|
+
role = Capistrano::CLI.ui.ask("Role: (leave blank to connect to all server)")
|
7
|
+
if not role.empty?
|
8
|
+
roles[role.to_sym].each do |server|
|
9
|
+
if don_ips.include?(server.host)
|
10
|
+
puts("we've already hacked on #{server.host}")
|
11
|
+
next
|
12
|
+
end
|
13
|
+
puts server.host
|
14
|
+
|
15
|
+
system("ssh #{user}@#{server.host} -p #{ssh_options[:port]}")
|
16
|
+
don_ips << server.host
|
17
|
+
sleep 1
|
18
|
+
end
|
19
|
+
# else connect to all servers
|
20
|
+
else
|
21
|
+
roles.each do |environment,settings|
|
22
|
+
puts "----------------------"
|
23
|
+
puts "#{environment.to_s.capitalize}:"
|
24
|
+
settings.each do |server|
|
25
|
+
if don_ips.include?(server.host)
|
26
|
+
puts("we've already hacked on #{server.host}")
|
27
|
+
next
|
28
|
+
end
|
29
|
+
puts server.host
|
30
|
+
system("ssh #{user}@#{server.host} -p #{ssh_options[:port]}")
|
31
|
+
don_ips << server.host
|
32
|
+
sleep 1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
namespace :monit do
|
2
|
+
|
3
|
+
desc "Setup the monitrc and enable monit on the server"
|
4
|
+
task :setup do
|
5
|
+
put render("config/server/monitrc.erb", binding), "/tmp/monitrc"
|
6
|
+
sudo "mv /tmp/monitrc /etc/monit/monitrc"
|
7
|
+
sudo "chown -R root:root /etc/monit"
|
8
|
+
sudo "echo 'startup=1' | sudo tee -a /etc/default/monit"
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Upload global monit configurations. This task allows you to install system-wide monit configuration files"
|
12
|
+
task :upload_global do
|
13
|
+
Dir.new("config/server/monit").each do |file|
|
14
|
+
next unless File.file?("config/server/monit/#{file}")
|
15
|
+
file_name = file.gsub('.erb', "")
|
16
|
+
put render("config/server/monit/#{file}", binding), "/tmp/#{file_name}"
|
17
|
+
sudo "mv /tmp/#{file_name} /etc/monit.d/#{file_name}"
|
18
|
+
sudo "chown root:root /etc/monit.d/#{file_name}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Start monit on the server"
|
23
|
+
task :start do
|
24
|
+
sudo "/etc/init.d/monit start"
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "Stop monit on the server"
|
28
|
+
task :stop do
|
29
|
+
sudo "/etc/init.d/monit stop"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
namespace :passenger do
|
2
|
+
|
3
|
+
desc "Restart Passenger"
|
4
|
+
task :restart, :roles => :app do
|
5
|
+
run "touch #{current_path}/tmp/restart.txt"
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
namespace :info do
|
10
|
+
desc "Display the passenger-memory-stats"
|
11
|
+
task :memory, :roles => :app do
|
12
|
+
run "passenger-memory-stats" do |channel, stream, data|
|
13
|
+
puts data
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Display general Passernger status passernger-status"
|
18
|
+
task :general, :roles => :app do
|
19
|
+
run "passenger-status" do |channel, stream, data|
|
20
|
+
puts data
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
namespace :shared do
|
2
|
+
task :setup do
|
3
|
+
fetch(:shared_files,{}).each do |source,target|
|
4
|
+
path = File.directory?(source) ? File.dirname(target) : target
|
5
|
+
run "mkdir -p #{shared_path}/#{path}"
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
task :symlink do
|
10
|
+
fetch(:shared_files,{}).each do |source,target|
|
11
|
+
run "rm -rf #{source}"
|
12
|
+
run "ln -s #{shared_path}/#{target} #{release_path}/#{source}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
namespace :thinking_sphinx do
|
2
|
+
|
3
|
+
desc "Configure Thinkig Sphinx"
|
4
|
+
task :config, :roles => :app do
|
5
|
+
run "cd #{current_path}; rake ts:config RAILS_ENV=#{fetch(:rails_env, "production")}"
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Start Thinkig Sphinx"
|
9
|
+
task :start, :roles => :app do
|
10
|
+
run "cd #{current_path}; rake ts:start RAILS_ENV=#{fetch(:rails_env, "production")}"
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Stop Thinkig Sphinx"
|
14
|
+
task :stop, :roles => :app do
|
15
|
+
run "cd #{current_path}; rake ts:stop RAILS_ENV=#{fetch(:rails_env, "production")};echo 0"
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Run Thinkig Sphinx indexing"
|
19
|
+
task :index, :roles => :app do
|
20
|
+
run "cd #{current_path}; rake ts:index RAILS_ENV=#{fetch(:rails_env, "production")}"
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Bootstrap Thinkig Sphinx"
|
24
|
+
task :bootstrap, :roles => :app do
|
25
|
+
run "cd #{current_path}; rake ts:stop RAILS_ENV=#{fetch(:rails_env, "production")}"
|
26
|
+
run "cd #{current_path}; rake ts:config RAILS_ENV=#{fetch(:rails_env, "production")}"
|
27
|
+
run "cd #{current_path}; rake ts:index RAILS_ENV=#{fetch(:rails_env, "production")}"
|
28
|
+
run "cd #{current_path}; rake ts:start RAILS_ENV=#{fetch(:rails_env, "production")}"
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "Symlink Sphinx index DB"
|
32
|
+
task :symlink, :roles => :app do
|
33
|
+
run "mkdir -p #{shared_path}/db/sphinx"
|
34
|
+
run "rm -fr #{release_path}/db/sphinx && ln -nfs #{shared_path}/db/sphinx #{release_path}/db/sphinx"
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
namespace :workling do
|
2
|
+
|
3
|
+
desc "Restart Workling Client"
|
4
|
+
task :restart, :roles => :app do
|
5
|
+
run "cd #{current_path}; RAILS_ENV=#{fetch(:rails_env, "production")} script/workling_client stop"
|
6
|
+
run "cd #{current_path}; RAILS_ENV=#{fetch(:rails_env, "production")} script/workling_client start"
|
7
|
+
end
|
8
|
+
|
9
|
+
desc "Start Workling Client"
|
10
|
+
task :start, :roles => :app do
|
11
|
+
run "cd #{current_path}; RAILS_ENV=#{fetch(:rails_env, "production")} script/workling_client start"
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Stop Workling Client"
|
15
|
+
task :stop, :roles => :app do
|
16
|
+
run "cd #{current_path}; RAILS_ENV=#{fetch(:rails_env, "production")} script/workling_client stop; echo 0"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
namespace :starling do
|
22
|
+
desc "Start Starling"
|
23
|
+
task :start do
|
24
|
+
run "sudo starling -d -p #{fetch(:starling_port, "15151")}"
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
package :apache, :provides => :webserver do
|
2
|
+
description 'Apache2 web server.'
|
3
|
+
apt 'apache2 apache2.2-common apache2-mpm-prefork apache2-utils libexpat1' do
|
4
|
+
post :install, 'a2enmod rewrite'
|
5
|
+
post :install, 'a2enmod deflate'
|
6
|
+
post :install, 'a2enmod expires'
|
7
|
+
post :install, 'a2enmod headers'
|
8
|
+
post :install, "a2dissite 000-default"
|
9
|
+
|
10
|
+
# configure /server-status module
|
11
|
+
["<Location /server-status>","SetHandler server-status","Order deny,allow", "Deny from all", "Allow from 127.0.0.1", "</Location>"].each do |line|
|
12
|
+
post :install, "echo '#{line}' | sudo tee -a /etc/apache2/status.conf"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
verify do
|
17
|
+
has_process 'apache2'
|
18
|
+
end
|
19
|
+
|
20
|
+
requires :essentials, :apache2_prefork_dev
|
21
|
+
end
|
22
|
+
|
23
|
+
package :apache_xsendfile do
|
24
|
+
description "installs the Apache X-Sendfile module"
|
25
|
+
source "http://tn123.ath.cx/mod_xsendfile/mod_xsendfile-0.9.tar.gz" do
|
26
|
+
# apxs throws an error becaus it can not activate the module. we just ignore that
|
27
|
+
# apxs error:"Error: Activation failed for custom /etc/apache2/httpd.conf file.."
|
28
|
+
custom_install 'apxs2 -cia mod_xsendfile.c;echo 0'
|
29
|
+
post :install, "touch /etc/apache2/mods-available/xsendfile.load"
|
30
|
+
post :install, 'echo "LoadModule xsendfile_module /usr/lib/apache2/modules/mod_xsendfile.so" > /etc/apache2/mods-available/xsendfile.load'
|
31
|
+
post :install, "a2enmod xsendfile"
|
32
|
+
end
|
33
|
+
|
34
|
+
verify do
|
35
|
+
has_file '/usr/lib/apache2/modules/mod_xsendfile.so'
|
36
|
+
has_file '/etc/apache2/mods-available/xsendfile.load'
|
37
|
+
end
|
38
|
+
requires :apache
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
package :apache2_prefork_dev do
|
43
|
+
description 'A dependency required by some packages.'
|
44
|
+
apt 'apache2-prefork-dev'
|
45
|
+
end
|