georgia_recipes 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|