georgia_recipes 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +48 -0
- data/Rakefile +1 -0
- data/georgia_recipes.gemspec +24 -0
- data/lib/georgia_recipes/all.rb +24 -0
- data/lib/georgia_recipes/apache.rb +10 -0
- data/lib/georgia_recipes/assets.rb +36 -0
- data/lib/georgia_recipes/base.rb +54 -0
- data/lib/georgia_recipes/carrierwave.rb +39 -0
- data/lib/georgia_recipes/chef.rb +10 -0
- data/lib/georgia_recipes/elasticsearch.rb +21 -0
- data/lib/georgia_recipes/errbit.rb +25 -0
- data/lib/georgia_recipes/georgia.rb +53 -0
- data/lib/georgia_recipes/helper_methods.rb +90 -0
- data/lib/georgia_recipes/imagemagick.rb +10 -0
- data/lib/georgia_recipes/memcached.rb +27 -0
- data/lib/georgia_recipes/mongodb.rb +15 -0
- data/lib/georgia_recipes/monit.rb +56 -0
- data/lib/georgia_recipes/mysql.rb +62 -0
- data/lib/georgia_recipes/newrelic.rb +39 -0
- data/lib/georgia_recipes/nginx.rb +28 -0
- data/lib/georgia_recipes/nodejs.rb +12 -0
- data/lib/georgia_recipes/postgresql.rb +92 -0
- data/lib/georgia_recipes/rbenv.rb +40 -0
- data/lib/georgia_recipes/redis.rb +18 -0
- data/lib/georgia_recipes/sidekiq.rb +22 -0
- data/lib/georgia_recipes/solr.rb +77 -0
- data/lib/georgia_recipes/templates/chef-solo.rb.erb +4 -0
- data/lib/georgia_recipes/templates/memcached.erb +16 -0
- data/lib/georgia_recipes/templates/monit/mysql.erb +6 -0
- data/lib/georgia_recipes/templates/monit/nginx.erb +5 -0
- data/lib/georgia_recipes/templates/monit/postgresql.erb +5 -0
- data/lib/georgia_recipes/templates/monit/sidekiq.erb +4 -0
- data/lib/georgia_recipes/templates/monit/solr.erb +4 -0
- data/lib/georgia_recipes/templates/monit/unicorn.erb +15 -0
- data/lib/georgia_recipes/templates/monit.node.json.erb +14 -0
- data/lib/georgia_recipes/templates/nginx.erb +40 -0
- data/lib/georgia_recipes/templates/postgresql.yml.erb +8 -0
- data/lib/georgia_recipes/templates/sidekiq.yml.erb +7 -0
- data/lib/georgia_recipes/templates/solr.chef.node.json.erb +11 -0
- data/lib/georgia_recipes/templates/unicorn.rb.erb +36 -0
- data/lib/georgia_recipes/templates/unicorn_init.erb +84 -0
- data/lib/georgia_recipes/unicorn.rb +156 -0
- data/lib/georgia_recipes/version.rb +3 -0
- data/lib/georgia_recipes.rb +5 -0
- metadata +134 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a16213f5c7060bbd035be7076e9d42a599f2e732
|
4
|
+
data.tar.gz: 8e0528af4e1c100dbf30c1ab8865cf9d67593561
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8e8c1f410092f0c794430dfbd194301a0ab30f845f2c1d5be338e180e2a59165daa41e82683aa0e59dd02444e981bf4fe8b6873a71f798f6007b0634f527480a
|
7
|
+
data.tar.gz: ad2049f9cdafd734c4b6ba89de97f314b6779dff19889341b2e87aa3ee6844c9d67ecdd9c91835e600eed03e711ef518582c7fe482457814af639d7491dcd171
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Mathieu Gagne
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# Georgia Recipes
|
2
|
+
|
3
|
+
Capistrano recipes for Georgia CMS. Helps you setup a VM with the necessary dependencies to run a full Rails stack with Georgia CMS
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'georgia_recipes', group: :development
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install georgia_recipes
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
Drop this line of code in your `config/deploy.rb` file to include additional recipes.
|
22
|
+
|
23
|
+
require 'georgia_recipes/all'
|
24
|
+
|
25
|
+
Or require them individually:
|
26
|
+
|
27
|
+
``` ruby
|
28
|
+
require 'georgia_recipes/base'
|
29
|
+
require 'georgia_recipes/chef'
|
30
|
+
require 'georgia_recipes/elasticsearch'
|
31
|
+
require 'georgia_recipes/memcached'
|
32
|
+
require 'georgia_recipes/mongodb'
|
33
|
+
require 'georgia_recipes/nginx'
|
34
|
+
require 'georgia_recipes/unicorn'
|
35
|
+
require 'georgia_recipes/rbenv'
|
36
|
+
require 'georgia_recipes/redis'
|
37
|
+
require 'georgia_recipes/solr'
|
38
|
+
require 'georgia_recipes/postgresql'
|
39
|
+
...
|
40
|
+
```
|
41
|
+
|
42
|
+
## Contributing
|
43
|
+
|
44
|
+
1. Fork it ( http://github.com/<my-github-username>/georgia_recipes/fork )
|
45
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
46
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
47
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
48
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'georgia_recipes/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "georgia_recipes"
|
8
|
+
spec.version = GeorgiaRecipes::VERSION
|
9
|
+
spec.authors = ["Mathieu Gagne"]
|
10
|
+
spec.email = ["gagne.mathieu@hotmail.com"]
|
11
|
+
spec.description = %q{Capistrano recipes for Georgia CMS.}
|
12
|
+
spec.summary = %q{Capistrano recipes for Georgia CMS. Helps you setup a VM with the necessary dependencies to run a full Rails stack with Georgia CMS}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "capistrano", '~> 2'
|
22
|
+
spec.add_dependency "capistrano-ext"
|
23
|
+
spec.add_dependency "capistrano-maintenance"
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'georgia_recipes/base'
|
2
|
+
|
3
|
+
# require 'georgia_recipes/apache'
|
4
|
+
require 'georgia_recipes/assets'
|
5
|
+
# require 'georgia_recipes/backup'
|
6
|
+
# require 'georgia_recipes/carrierwave'
|
7
|
+
require 'georgia_recipes/chef'
|
8
|
+
# require 'georgia_recipes/elasticsearch'
|
9
|
+
# require 'georgia_recipes/errbit'
|
10
|
+
require 'georgia_recipes/georgia'
|
11
|
+
require 'georgia_recipes/imagemagick'
|
12
|
+
require 'georgia_recipes/memcached'
|
13
|
+
# require 'georgia_recipes/mongodb'
|
14
|
+
require 'georgia_recipes/monit'
|
15
|
+
# require 'georgia_recipes/mysql'
|
16
|
+
require 'georgia_recipes/newrelic'
|
17
|
+
require 'georgia_recipes/nginx'
|
18
|
+
# require 'georgia_recipes/nodejs'
|
19
|
+
require 'georgia_recipes/postgresql'
|
20
|
+
require 'georgia_recipes/rbenv'
|
21
|
+
require 'georgia_recipes/redis'
|
22
|
+
require 'georgia_recipes/sidekiq'
|
23
|
+
require 'georgia_recipes/solr'
|
24
|
+
require 'georgia_recipes/unicorn'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
def precompile_assets
|
4
|
+
run_locally "bundle exec rake assets:precompile"
|
5
|
+
find_servers_for_task(current_task).each do |server|
|
6
|
+
run_locally "rsync -vr --exclude='.DS_Store' -e 'ssh -p #{ssh_options[:port] || 22}' public/assets #{user}@#{server.host}:#{shared_path}/"
|
7
|
+
end
|
8
|
+
run_locally "rm -Rf public/assets"
|
9
|
+
end
|
10
|
+
|
11
|
+
namespace :deploy do
|
12
|
+
namespace :assets do
|
13
|
+
desc "Precompile assets on local machine and upload them to the server if assets changed."
|
14
|
+
task :precompile, roles: :web, except: {no_release: true} do
|
15
|
+
begin
|
16
|
+
from = source.next_revision(current_revision)
|
17
|
+
if capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ app/assets/ | wc -l").to_i > 0
|
18
|
+
precompile_assets
|
19
|
+
else
|
20
|
+
logger.info "Skipping asset pre-compilation because there were no asset changes"
|
21
|
+
end
|
22
|
+
rescue
|
23
|
+
precompile_assets
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
namespace :assets do
|
30
|
+
desc "Compile assets on local machine and upload them to the server."
|
31
|
+
task :compile, roles: :web, except: {no_release: true} do
|
32
|
+
precompile_assets
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
require 'capistrano/cli'
|
3
|
+
|
4
|
+
Capistrano::Configuration.instance.load do
|
5
|
+
|
6
|
+
set_default(:host) { ask("What is the fully qualified domain name?") }
|
7
|
+
set_default(:remote_db_user) { db_config_file["#{rails_env}"]["username"] rescue ask("Remote database user: ") }
|
8
|
+
set_default(:remote_db_user) { db_config_file["#{rails_env}"]["database"] rescue ask("Remote database name: ") }
|
9
|
+
set_default(:remote_db_user) { db_config_file["#{rails_env}"]["password"] rescue ask("Remote database password: ") }
|
10
|
+
set_default(:local_db_user) { db_config_file["development"]["username"] rescue ask("Local database user: ") }
|
11
|
+
set_default(:local_db_user) { db_config_file["development"]["database"] rescue ask("Local database name: ") }
|
12
|
+
set_default(:local_db_user) { db_config_file["development"]["password"] rescue ask("Local database password: ") }
|
13
|
+
|
14
|
+
namespace :deploy do
|
15
|
+
|
16
|
+
desc "Adds user 'deployer' with your ssh keys"
|
17
|
+
task :bootstrap do
|
18
|
+
with_user('root') do
|
19
|
+
run "adduser --disabled-password --gecos '' deployer"
|
20
|
+
run "echo 'deployer ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers"
|
21
|
+
run "apt-get update ; apt-get -y install curl"
|
22
|
+
run "sudo -u deployer curl https://github.com/#{github_handle}.keys -o /home/deployer/.ssh/authorized_keys --create-dirs"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
namespace :ssh do
|
28
|
+
task :reset_keys do
|
29
|
+
run "curl https://github.com/#{github_handle}.keys -o ~/.ssh/authorized_keys --create-dirs"
|
30
|
+
end
|
31
|
+
task :add_keys do
|
32
|
+
run "sed -i -e '$a\' ~/.ssh/authorized_keys"
|
33
|
+
run "curl https://github.com/#{github_handle}.keys | tee -a ~/.ssh/authorized_keys"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
namespace :locale do
|
38
|
+
desc "Set locale to en_US.UTF-8"
|
39
|
+
task :setup, roles: :web do
|
40
|
+
run "#{sudo} apt-get -y install language-pack-en-base"
|
41
|
+
run "export LANGUAGE=en_US.UTF-8"
|
42
|
+
run "export LANG=en_US.UTF-8"
|
43
|
+
run "export LC_ALL=en_US.UTF-8"
|
44
|
+
run "export LC_CTYPE=en_US.UTF-8"
|
45
|
+
run "#{sudo} locale-gen en_US.UTF-8"
|
46
|
+
run "#{sudo} dpkg-reconfigure locales"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def github_handle
|
51
|
+
Capistrano::CLI.ui.ask "Which Github handle would you like to add?"
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
# These tasks are meant to be use if you keep Carrierwave files locally
|
4
|
+
# instead of a Cloud Storage (Amazon S3, Rackspace Cloud Files, etc.)
|
5
|
+
namespace :carrierwave do
|
6
|
+
|
7
|
+
desc "Symlink public/uploads folder to shared files directories"
|
8
|
+
task :symlink, except: { no_release: true } do
|
9
|
+
run "rm -rf #{current_path}/public/uploads"
|
10
|
+
run "mkdir -p #{shared_path}/uploads"
|
11
|
+
run "ln -fns #{shared_path}/uploads #{current_path}/public/uploads"
|
12
|
+
end
|
13
|
+
after 'deploy:create_symlink', 'carrierwave:symlink'
|
14
|
+
|
15
|
+
namespace :uploads do
|
16
|
+
|
17
|
+
desc "Zip and pull all files from the public/uploads folder. remote => local"
|
18
|
+
task :pull, roles: :app do
|
19
|
+
run "cd #{shared_path} && tar -czvf /tmp/uploads_#{timestamp}.tar.gz uploads"
|
20
|
+
get "/tmp/uploads_#{timestamp}.tar.gz", "/tmp/uploads_#{timestamp}.tar.gz"
|
21
|
+
run "rm /tmp/uploads_#{timestamp}.tar.gz"
|
22
|
+
run_locally "cd public && tar -xzvf /tmp/uploads_#{timestamp}.tar.gz"
|
23
|
+
run_locally "rm /tmp/uploads_#{timestamp}.tar.gz"
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Zip and push all files to the public/uploads folder. local => remote"
|
27
|
+
task :push, roles: :app do
|
28
|
+
run_locally "cd public && tar -czvf /tmp/uploads_#{timestamp}.tar.gz uploads"
|
29
|
+
upload "/tmp/uploads_#{timestamp}.tar.gz", "/tmp/uploads_#{timestamp}.tar.gz"
|
30
|
+
run_locally "rm /tmp/uploads_#{timestamp}.tar.gz"
|
31
|
+
run "cd #{shared_path} && tar -xzvf /tmp/uploads_#{timestamp}.tar.gz"
|
32
|
+
run "rm /tmp/uploads_#{timestamp}.tar.gz"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
set_default :es_version, "0.90.11"
|
4
|
+
|
5
|
+
namespace :elasticsearch do
|
6
|
+
desc "Install latest stable release of elasticsearch"
|
7
|
+
task :install, roles: :web do
|
8
|
+
run "wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-#{es_version}.deb"
|
9
|
+
run "#{sudo} dpkg -i elasticsearch-#{es_version}.deb"
|
10
|
+
run "rm elasticsearch-#{es_version}.deb"
|
11
|
+
end
|
12
|
+
|
13
|
+
%w[start stop restart force_reload status].each do |command|
|
14
|
+
desc "#{command} elasticsearch"
|
15
|
+
task command, roles: :web do
|
16
|
+
run "#{sudo} service elasticsearch #{command}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
def username
|
4
|
+
@username ||= run_locally("git config user.email")
|
5
|
+
@username[0..-2] #strips the \n from stdout
|
6
|
+
end
|
7
|
+
|
8
|
+
def revision
|
9
|
+
@revision ||= run_locally('git rev-parse --short HEAD')
|
10
|
+
@revision[0..-2] #strips the \n from stdout
|
11
|
+
end
|
12
|
+
|
13
|
+
unless exists? :stage
|
14
|
+
set(:stage) { 'production' }
|
15
|
+
end
|
16
|
+
|
17
|
+
namespace :errbit do
|
18
|
+
desc "Notifiy Errbit of a new deploy"
|
19
|
+
task :notify, roles: :app do
|
20
|
+
run "cd #{current_path} && bundle exec rake airbrake:deploy TO=#{stage} USER=#{username} REPO=#{repository} REVISION=#{revision} RAILS_ENV=#{rails_env}"
|
21
|
+
end
|
22
|
+
after "deploy", "errbit:notify"
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :georgia do
|
3
|
+
|
4
|
+
desc "Install rails stack onto the server for Georgia CMS"
|
5
|
+
task :install do
|
6
|
+
run "#{sudo} apt-get -y update"
|
7
|
+
run "#{sudo} apt-get -y install vim python-software-properties software-properties-common subversion libxslt1-dev libxml2-dev git-core"
|
8
|
+
run "ssh-keyscan github.com >> ~/.ssh/known_hosts"
|
9
|
+
run "ssh-keyscan git.motioneleven.com >> ~/.ssh/known_hosts"
|
10
|
+
end
|
11
|
+
before "georgia:install", "locale:setup"
|
12
|
+
after "georgia:install", "rbenv:install"
|
13
|
+
after "georgia:install", "chef:install"
|
14
|
+
after "georgia:install", "monit:install"
|
15
|
+
after "georgia:install", "imagemagick:install"
|
16
|
+
after "georgia:install", "nginx:install"
|
17
|
+
after "georgia:install", "pg:install"
|
18
|
+
after "georgia:install", "memcached:install"
|
19
|
+
after "georgia:install", "redis:install"
|
20
|
+
after "georgia:install", "newrelic:install"
|
21
|
+
after "georgia:install", "backup:install"
|
22
|
+
|
23
|
+
task :setup do
|
24
|
+
# Trigger callbacks for setting up a rails stack after install
|
25
|
+
end
|
26
|
+
after "georgia:setup", "memcached:setup"
|
27
|
+
after "georgia:setup", "nginx:setup"
|
28
|
+
after "georgia:setup", "pg:setup"
|
29
|
+
after "georgia:setup", "unicorn:setup"
|
30
|
+
after "georgia:setup", "monit:setup"
|
31
|
+
after "georgia:setup", "backup:setup"
|
32
|
+
after "georgia:setup", "sidekiq:setup"
|
33
|
+
after "georgia:setup", "newrelic:setup"
|
34
|
+
|
35
|
+
task :seed, roles: :web do
|
36
|
+
run "cd #{current_path} && bundle exec rake georgia:seed RAILS_ENV=#{rails_env}"
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Run georgia:upgrade task"
|
40
|
+
task :upgrade, roles: :web do
|
41
|
+
run "cd #{current_path} && bundle exec rake georgia:upgrade RAILS_ENV=#{rails_env}"
|
42
|
+
end
|
43
|
+
|
44
|
+
namespace :tire do
|
45
|
+
task :reindex, roles: :app do
|
46
|
+
['Georgia::Page', 'Ckeditor::Asset', 'Ckeditor::Picture', 'ActsAsTaggableOn::Tag'].each do |model|
|
47
|
+
run "cd #{current_path} && bundle exec rake environment tire:import CLASS=#{model} FORCE=true RAILS_ENV=#{rails_env}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
def timestamp
|
2
|
+
@timestamp ||= Time.now.strftime('%Y%m%d%H%M%S')
|
3
|
+
end
|
4
|
+
|
5
|
+
def template(from, to)
|
6
|
+
erb = File.read(File.expand_path("../templates/#{from}", __FILE__))
|
7
|
+
put ERB.new(erb).result(binding), to
|
8
|
+
end
|
9
|
+
|
10
|
+
def set_default(name, *args, &block)
|
11
|
+
set(name, *args, &block) unless exists?(name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def are_you_sure?
|
15
|
+
ask("Holy Moly! Are you sure you want to do that? (type 'yes' if so)") == 'yes'
|
16
|
+
end
|
17
|
+
|
18
|
+
def ask question
|
19
|
+
Capistrano::CLI.ui.ask question
|
20
|
+
end
|
21
|
+
|
22
|
+
# Methods taken from: https://github.com/donnoman/cap-recipes/blob/master/lib/cap_recipes/tasks/utilities.rb
|
23
|
+
|
24
|
+
##
|
25
|
+
# Run a command and ask for input when input_query is seen.
|
26
|
+
# Sends the response back to the server.
|
27
|
+
#
|
28
|
+
# +input_query+ is a regular expression that defaults to /^Password/.
|
29
|
+
# Can be used where +run+ would otherwise be used.
|
30
|
+
# run_with_input 'ssh-keygen ...', /^Are you sure you want to overwrite\?/
|
31
|
+
def run_with_input(shell_command, input_query=/^Password/, response=nil)
|
32
|
+
handle_command_with_input(:run, shell_command, input_query, response)
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# Does the actual capturing of the input and streaming of the output.
|
37
|
+
#
|
38
|
+
# local_run_method: run or sudo
|
39
|
+
# shell_command: The command to run
|
40
|
+
# input_query: A regular expression matching a request for input: /^Please enter your password/
|
41
|
+
def handle_command_with_input(local_run_method, shell_command, input_query, response=nil)
|
42
|
+
send(local_run_method, shell_command, {:pty => true}) do |channel, stream, data|
|
43
|
+
if data =~ input_query
|
44
|
+
if response
|
45
|
+
logger.info "#{data} #{"*"*(rand(10)+5)}", channel[:host]
|
46
|
+
channel.send_data "#{response}\n"
|
47
|
+
else
|
48
|
+
logger.info data, channel[:host]
|
49
|
+
response = ::Capistrano::CLI.password_prompt "#{data}"
|
50
|
+
channel.send_data "#{response}\n"
|
51
|
+
end
|
52
|
+
else
|
53
|
+
logger.info data, channel[:host]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def git_pull_or_clone repo_name, repo_url
|
59
|
+
run "bash -c 'if cd #{repo_name}; then git pull origin master; else git clone #{repo_url} #{repo_name}; fi'"
|
60
|
+
end
|
61
|
+
|
62
|
+
# run a command on the server with a different user
|
63
|
+
def with_user(new_user, new_pass, &block)
|
64
|
+
old_user, old_pass = user, password
|
65
|
+
set_user(new_user, new_pass)
|
66
|
+
begin
|
67
|
+
yield
|
68
|
+
rescue Exception => e
|
69
|
+
set_user(old_user, old_pass)
|
70
|
+
raise e
|
71
|
+
end
|
72
|
+
set_user(old_user, old_pass)
|
73
|
+
end
|
74
|
+
|
75
|
+
# change the capistrano user
|
76
|
+
def set_user(user, pass)
|
77
|
+
set :user, user
|
78
|
+
set :password, pass
|
79
|
+
close_sessions
|
80
|
+
end
|
81
|
+
|
82
|
+
# disconnect all sessions
|
83
|
+
def close_sessions
|
84
|
+
sessions.values.each { |session| session.close }
|
85
|
+
sessions.clear
|
86
|
+
end
|
87
|
+
|
88
|
+
def db_config_file
|
89
|
+
@db_config_file ||= YAML.load(File.read('config/database.yml'))
|
90
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
set_default :memcached_memory_limit, 64
|
4
|
+
|
5
|
+
namespace :memcached do
|
6
|
+
desc "Install Memcached"
|
7
|
+
task :install, roles: :app do
|
8
|
+
run "#{sudo} apt-get -y update"
|
9
|
+
run "#{sudo} apt-get install -y memcached"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Setup Memcached"
|
13
|
+
task :setup, roles: :app do
|
14
|
+
template "memcached.erb", "/tmp/memcached.conf"
|
15
|
+
run "#{sudo} mv /tmp/memcached.conf /etc/memcached.conf"
|
16
|
+
restart
|
17
|
+
end
|
18
|
+
|
19
|
+
%w[start stop restart].each do |command|
|
20
|
+
desc "#{command} Memcached"
|
21
|
+
task command, roles: :app do
|
22
|
+
run "#{sudo} service memcached #{command}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
|
3
|
+
namespace :mongodb do
|
4
|
+
|
5
|
+
desc "Install MongoDB"
|
6
|
+
task :install, roles: :app do
|
7
|
+
run "#{sudo} apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10"
|
8
|
+
run "echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | #{sudo} tee /etc/apt/sources.list.d/mongodb.list"
|
9
|
+
run "#{sudo} apt-get -y update"
|
10
|
+
run "#{sudo} apt-get -y install mongodb-10gen"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :monit do
|
3
|
+
|
4
|
+
desc "Install Monit. Requires Chef (chef:install)"
|
5
|
+
task :install, roles: :app do
|
6
|
+
run "mkdir -p cookbooks"
|
7
|
+
git_pull_or_clone('cookbooks/yum', 'git@github.com:opscode-cookbooks/yum.git')
|
8
|
+
git_pull_or_clone('cookbooks/sysctl', 'git@github.com:rcbops-cookbooks/sysctl.git')
|
9
|
+
git_pull_or_clone('cookbooks/apt', 'git@github.com:opscode-cookbooks/apt.git')
|
10
|
+
git_pull_or_clone('cookbooks/osops-utils', 'git@github.com:rcbops-cookbooks/osops-utils.git')
|
11
|
+
git_pull_or_clone('cookbooks/monit', 'git@github.com:rcbops-cookbooks/monit.git')
|
12
|
+
config
|
13
|
+
end
|
14
|
+
|
15
|
+
task :config, roles: :app do
|
16
|
+
template "monit.node.json.erb", "node.json"
|
17
|
+
template "chef-solo.rb.erb", "solo.rb"
|
18
|
+
run "#{sudo} chef-solo -j node.json -c solo.rb"
|
19
|
+
end
|
20
|
+
|
21
|
+
%w[start stop restart syntax reload].each do |command|
|
22
|
+
desc "Run Monit #{command} script"
|
23
|
+
task command do
|
24
|
+
run "#{sudo} service monit #{command}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
before "deploy:stop", "monit:stop"
|
28
|
+
after "deploy:start", "monit:start"
|
29
|
+
|
30
|
+
desc "Setup all Monit configuration for default Rails stack"
|
31
|
+
task :setup do
|
32
|
+
nginx
|
33
|
+
postgresql
|
34
|
+
sidekiq
|
35
|
+
unicorn
|
36
|
+
syntax
|
37
|
+
reload
|
38
|
+
end
|
39
|
+
|
40
|
+
task(:nginx, roles: :web) { monit_config "nginx" }
|
41
|
+
task(:postgresql, roles: :db) { monit_config "postgresql" }
|
42
|
+
task(:unicorn, roles: :app) { monit_config "unicorn" }
|
43
|
+
task(:sidekiq, roles: :app) { monit_config "sidekiq" }
|
44
|
+
task(:solr, roles: :web) { monit_config "solr" }
|
45
|
+
task(:mysql, roles: :web) { monit_config "mysql" }
|
46
|
+
|
47
|
+
def monit_config(name, destination = nil)
|
48
|
+
destination ||= "/etc/monit/conf.d/#{name}.conf"
|
49
|
+
template "monit/#{name}.erb", "/tmp/monit_#{name}"
|
50
|
+
run "#{sudo} mv /tmp/monit_#{name} #{destination}"
|
51
|
+
run "#{sudo} chown root:root #{destination}"
|
52
|
+
run "#{sudo} chmod 600 #{destination}"
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|