rails-ahoy 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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +14 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +31 -0
  7. data/Rakefile +2 -0
  8. data/ahoy.gemspec +24 -0
  9. data/lib/ahoy.rb +5 -0
  10. data/lib/ahoy/version.rb +3 -0
  11. data/lib/generators/ahoy/ansible_generator.rb +36 -0
  12. data/lib/generators/ahoy/base.rb +24 -0
  13. data/lib/generators/ahoy/deploy_generator.rb +47 -0
  14. data/lib/generators/ahoy/init_generator.rb +49 -0
  15. data/lib/generators/ahoy/templates/_Vagrantfile +20 -0
  16. data/lib/generators/ahoy/templates/_database.yml +18 -0
  17. data/lib/generators/ahoy/templates/_deploy.rb +51 -0
  18. data/lib/generators/ahoy/templates/_env_vars.yml +7 -0
  19. data/lib/generators/ahoy/templates/_puma.rb +24 -0
  20. data/lib/generators/ahoy/templates/_puma.sh +79 -0
  21. data/lib/generators/ahoy/templates/ansible/playbooks/playbook.yml +22 -0
  22. data/lib/generators/ahoy/templates/ansible/playbooks/roles/deploy_env/tasks/main.yml +10 -0
  23. data/lib/generators/ahoy/templates/ansible/playbooks/roles/deploy_env/templates/database.yml +9 -0
  24. data/lib/generators/ahoy/templates/ansible/playbooks/roles/deploy_env/templates/secrets.yml +2 -0
  25. data/lib/generators/ahoy/templates/ansible/playbooks/roles/essentials/tasks/main.yml +43 -0
  26. data/lib/generators/ahoy/templates/ansible/playbooks/roles/essentials/templates/vimrc +472 -0
  27. data/lib/generators/ahoy/templates/ansible/playbooks/roles/nginx/tasks/main.yml +15 -0
  28. data/lib/generators/ahoy/templates/ansible/playbooks/roles/nginx/templates/platform.conf +24 -0
  29. data/lib/generators/ahoy/templates/ansible/playbooks/roles/nodejs/tasks/main.yml +6 -0
  30. data/lib/generators/ahoy/templates/ansible/playbooks/roles/postgresql/handlers/main.yml +3 -0
  31. data/lib/generators/ahoy/templates/ansible/playbooks/roles/postgresql/tasks/main.yml +39 -0
  32. data/lib/generators/ahoy/templates/ansible/playbooks/roles/postgresql/templates/pg_hba.conf +91 -0
  33. data/lib/generators/ahoy/templates/ansible/playbooks/roles/ruby/files/gemrc +5 -0
  34. data/lib/generators/ahoy/templates/ansible/playbooks/roles/ruby/tasks/gems.yml +6 -0
  35. data/lib/generators/ahoy/templates/ansible/playbooks/roles/ruby/tasks/main.yml +4 -0
  36. data/lib/generators/ahoy/templates/ansible/playbooks/roles/ruby/tasks/rbenv.yml +31 -0
  37. data/lib/generators/ahoy/templates/ansible/playbooks/roles/ruby/tasks/ruby.yml +15 -0
  38. data/lib/generators/ahoy/templates/ansible/playbooks/roles/security/tasks/firewall.yml +6 -0
  39. data/lib/generators/ahoy/templates/ansible/playbooks/roles/security/tasks/main.yml +9 -0
  40. data/lib/generators/ahoy/templates/ansible/playbooks/roles/user/tasks/main.yml +6 -0
  41. data/lib/generators/ahoy/templates/ansible/playbooks/tasks/vagrant_settings.yml +3 -0
  42. data/lib/generators/ahoy/templates/ansible_templates/_hosts +5 -0
  43. data/lib/generators/ahoy/templates/ansible_templates/_provision.sh +1 -0
  44. data/lib/generators/ahoy/templates/ansible_templates/playbooks/group_vars/_all.yml +6 -0
  45. data/lib/generators/ahoy/templates/ansible_templates/playbooks/host_vars/_default.yml +8 -0
  46. data/lib/generators/ahoy/templates/ansible_templates/playbooks/host_vars/_production_deploy.yml +7 -0
  47. data/lib/generators/ahoy/templates/ansible_templates/playbooks/host_vars/_production_root.yml +2 -0
  48. data/lib/generators/ahoy/templates/ansible_templates/playbooks/roles/security/tasks/_ssh_settings.yml +25 -0
  49. data/lib/generators/ahoy/vagrant_generator.rb +52 -0
  50. metadata +121 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0243134f09fc42ce05630abbe6b2a8224292a903
4
+ data.tar.gz: db22045904e68900afc1cb5d2888df4574305ad1
5
+ SHA512:
6
+ metadata.gz: 15ac64bbe9c3147a0f7a31085eccdb45be40a64b6dc07baa44eb12f6498e61fe485808817508bcd25963c025ed6c343740d734e159117ecad96df7fd7f8b3b6f
7
+ data.tar.gz: ac78e1fb7af0cb995ce488e7a3bd8616ffb6d9693f20022444e9793329e7a05512a17b979966f83c892e5983e16005a366bdd73831303bdde793f694c8958dd4
Binary file
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ahoy.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Nathan Pearson
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.
@@ -0,0 +1,31 @@
1
+ # Ahoy
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'ahoy'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install ahoy
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/ahoy/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -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 'ahoy/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rails-ahoy"
8
+ spec.version = Ahoy::VERSION
9
+ spec.authors = ["Nathan Pearson"]
10
+ spec.email = ["npearson72@gmail.com"]
11
+ spec.summary = "Quick and painless Rails deployment"
12
+ spec.description = "Generator for building ansible based provisioning scripts, and mina/puma deployment scripts"
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_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ end
24
+
@@ -0,0 +1,5 @@
1
+ require "ahoy/version"
2
+
3
+ module Ahoy
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,3 @@
1
+ module Ahoy
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,36 @@
1
+ require 'rails/generators'
2
+ require 'generators/ahoy/base'
3
+ require 'fileutils'
4
+
5
+ module Ahoy
6
+ class AnsibleGenerator < Ahoy::Generator::Base
7
+
8
+ def prompt_user
9
+ defaults('127.0.0.1')
10
+ @server_ip = ask('=> Which IP address will you be deploying to? [enter for default]').chomp
11
+ defaults('22')
12
+ @server_ssh_port = ask('=> What SSH port would you like to use on your server? [enter for default]').chomp
13
+ defaults('2.1.5')
14
+ @ruby_version = ask('=> Which version of Ruby would you like to install? [enter for default]').chomp
15
+ defaults('9.3')
16
+ @postgresql_version = ask('=> Which version of PostgreSQL would you like to install? [enter for default]').chomp
17
+ end
18
+
19
+ def copy_directory
20
+ directory 'ansible', 'config/ansible'
21
+ end
22
+
23
+ def copy_templates
24
+ template 'ansible_templates/_provision.sh', 'config/ansible/provision.sh'
25
+ template 'ansible_templates/_hosts', 'config/ansible/hosts'
26
+ template 'ansible_templates/playbooks/group_vars/_all.yml', 'config/ansible/playbooks/group_vars/all.yml'
27
+ template 'ansible_templates/playbooks/host_vars/_production_root.yml', 'config/ansible/playbooks/host_vars/production_root.yml'
28
+ template 'ansible_templates/playbooks/host_vars/_production_deploy.yml', 'config/ansible/playbooks/host_vars/production_deploy.yml'
29
+ template 'ansible_templates/playbooks/roles/security/tasks/_ssh_settings.yml', 'config/ansible/playbooks/roles/security/tasks/ssh_settings.yml'
30
+ end
31
+
32
+ def change_permissions
33
+ FileUtils.chmod 0751, 'config/ansible/provision.sh'
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ module Ahoy
2
+ module Initialize
3
+ def root
4
+ File.dirname(__FILE__)
5
+ end
6
+ end
7
+
8
+ module Generator
9
+ extend Initialize
10
+
11
+ class Base < Rails::Generators::Base
12
+ def self.source_root
13
+ @source_root ||= File.join(File.dirname(__FILE__), 'templates')
14
+ end
15
+
16
+ private
17
+
18
+ def defaults(value)
19
+ puts '-' * 100
20
+ puts "Default: #{value}"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,47 @@
1
+ require 'rails/generators'
2
+ require 'generators/ahoy/base'
3
+ require 'fileutils'
4
+
5
+ module Ahoy
6
+ class DeployGenerator < Ahoy::Generator::Base
7
+
8
+ def use_deploy
9
+ defaults('No')
10
+ @use_deploy = yes?('=> Would you like to setup deployment files using Puma and Mina? [enter for default]')
11
+ end
12
+
13
+ def prompt_user
14
+ if @use_deploy
15
+ @github_repo = ask('=> What is the github repository for this application?').chomp
16
+ defaults('127.0.0.1')
17
+ @server_ip = ask('=> Which IP address will you be deploying to? [enter for default]').chomp
18
+ defaults('22')
19
+ @server_ssh_port = ask('=> What SSH port would you like to use on your server? [enter for default]').chomp
20
+ copy_templates
21
+ add_gems
22
+ change_permissions
23
+ else
24
+ puts 'Skipping deployment scripts'
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def copy_templates
31
+ template '_puma.sh', 'bin/puma.sh'
32
+ template '_puma.rb', 'config/puma.rb'
33
+ template '_deploy.rb', 'config/deploy.rb'
34
+ end
35
+
36
+ def add_gems
37
+ gem_group :production do
38
+ gem 'puma'
39
+ gem 'rb-readline'
40
+ end
41
+ end
42
+
43
+ def change_permissions
44
+ FileUtils.chmod 0751, 'bin/puma.sh'
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,49 @@
1
+ require 'rails/generators'
2
+ require 'generators/ahoy/base'
3
+
4
+ module Ahoy
5
+ class InitGenerator < Ahoy::Generator::Base
6
+
7
+ def init
8
+ divider
9
+ masthead
10
+ divider
11
+ generate 'ahoy:ansible'
12
+ divider
13
+ generate 'ahoy:vagrant'
14
+ divider
15
+ generate 'ahoy:deploy'
16
+ divider
17
+ puts 'Finalizing...'
18
+ copy_env_vars_file
19
+ divider
20
+ puts 'Finished!'
21
+ end
22
+
23
+ private
24
+
25
+ def copy_env_vars_file
26
+ template '_env_vars.yml', 'config/env_vars.yml'
27
+ append_file '.gitignore', 'config/env_vars.yml'
28
+ end
29
+
30
+ def divider
31
+ puts '=' * 100
32
+ end
33
+
34
+ def masthead
35
+ puts ' ___ ___ ___ ___ '
36
+ puts ' / /\ /__/\ / /\ /__/| '
37
+ puts ' / /++\ \ \+\ / /++\ | |+| '
38
+ puts ' / /+/\+\ \__\+\ / /+/\+\ | |+| ' + ' Ahoy!'
39
+ puts ' / /+/~/++\ ___ / /++\ / /+/ \+\ | |+| ' + ' Get your Rails app deployed'
40
+ puts ' /__/+/ /+/\+\ /__/\ /+/\+\ /__/+/ \__\+\ ___|__|+| '
41
+ puts ' \ \+\/+/__\/ \ \+\/+/__\/ \ \+\ / /+/ /__/+++++\ ' + " v.#{Ahoy::VERSION}"
42
+ puts ' \ \++/ \ \++/ \ \+\ /+/ \__\~~~~++\ '
43
+ puts ' \ \+\ \ \+\ \ \+\/+/ \ \+\ '
44
+ puts ' \ \+\ \ \+\ \ \++/ \ \+\ '
45
+ puts ' \__\/ \__\/ \__\/ \__\/ '
46
+ puts
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,20 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ VAGRANTFILE_API_VERSION = 2
5
+
6
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
7
+ config.vm.box = 'hashicorp/precise64'
8
+
9
+ config.vm.network :forwarded_port, guest: 3000, host: 3000
10
+
11
+ config.vm.provider 'virtualbox' do |v|
12
+ v.memory = <%= @memory == 0 ? 2048 : (@memory * 1024) %>
13
+ v.cpus = <%= @cpus == 0 ? 1 : @cpus %>
14
+ end
15
+
16
+ config.vm.provision 'ansible' do |ansible|
17
+ ansible.playbook = 'config/ansible/playbooks/playbook.yml'
18
+ ansible.limit = 'default'
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ default: &default
2
+ adapter: postgresql
3
+ host: localhost
4
+ encoding: unicode
5
+ ctype: en_US.utf8
6
+ collation: en_US.utf8
7
+ template: template0
8
+ pool: 5
9
+ username: vagrant
10
+ password: vagrant
11
+
12
+ development:
13
+ <<: *default
14
+ database: <%= Rails.application.class.parent_name.underscore %>_development
15
+
16
+ test:
17
+ <<: *default
18
+ database: <%= Rails.application.class.parent_name.underscore %>_test
@@ -0,0 +1,51 @@
1
+ require 'mina/bundler'
2
+ require 'mina/rails'
3
+ require 'mina/git'
4
+ require 'mina/rbenv'
5
+
6
+ set :repository, "<%= @github_repo %>"
7
+ set :branch, 'master'
8
+ set :deploy_to, "/var/www/<%= Rails.application.class.parent_name.underscore %>"
9
+ set :app_path, "/var/www/<%= Rails.application.class.parent_name.underscore %>/current"
10
+ set :forward_agent, true
11
+ set :shared_paths, ['config/database.yml', 'config/secrets.yml', 'log', 'tmp']
12
+
13
+ task :production do
14
+ set :user, 'deploy'
15
+ set :domain, "<%= @server_ip == '' ? '127.0.0.1' : @server_ip %>"
16
+ set :port, <%= @server_ssh_port == '' ? '22' : @server_ssh_port %>
17
+ set :stage, 'production'
18
+ end
19
+
20
+ task :environment do
21
+ queue! %[export PATH="/usr/local/rbenv/bin:/usr/local/rbenv/shims:$PATH"]
22
+ end
23
+
24
+ task :setup => :environment do
25
+ ['log', 'config', 'tmp/log', 'tmp/pids', 'tmp/sockets'].each do |dir|
26
+ queue! %[mkdir -m 750 -p "#{deploy_to}/#{shared_path}/#{dir}"]
27
+ end
28
+ end
29
+
30
+ task :deploy => :environment do
31
+ deploy do
32
+ invoke :'git:clone'
33
+ invoke :'deploy:link_shared_paths'
34
+ invoke :'bundle:install'
35
+ invoke :'rails:db_migrate'
36
+ invoke :'rails:assets_precompile'
37
+ invoke :'deploy:cleanup'
38
+
39
+ to :launch do
40
+ invoke :'server:restart'
41
+ end
42
+ end
43
+ end
44
+
45
+ namespace :server do
46
+ [:start, :stop, :restart].each do |action|
47
+ task action do
48
+ queue "cd #{app_path} && RAILS_ENV=#{stage} && bin/puma.sh #{action}"
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,7 @@
1
+ ---
2
+ application_name: <%= Rails.application.class.parent_name.underscore %>
3
+ production:
4
+ db_name: <%= Rails.application.class.parent_name.underscore %>_production
5
+ db_user: deploy
6
+ db_password: # Remember to add your own!!
7
+ secret_key_base: # Remember to add your own!!
@@ -0,0 +1,24 @@
1
+ workers Integer(ENV['PUMA_WORKERS'] || 3)
2
+ threads Integer(ENV['MIN_THREADS'] || 1), Integer(ENV['MAX_THREADS'] || 16)
3
+
4
+ preload_app!
5
+
6
+ rackup DefaultRackup
7
+ port ENV['PORT'] || 3000
8
+ environment ENV['RACK_ENV'] || 'production'
9
+
10
+ daemonize true
11
+
12
+ pidfile "/var/www/<%= Rails.application.class.parent_name.underscore %>/shared/tmp/pids/puma.pid"
13
+ stdout_redirect "/var/www/<%= Rails.application.class.parent_name.underscore %>/shared/tmp/log/stdout", "/var/www/<%= Rails.application.class.parent_name.underscore %>/shared/tmp/log/stderr"
14
+
15
+ bind "unix:///var/www/<%= Rails.application.class.parent_name.underscore %>/shared/tmp/sockets/puma.sock"
16
+
17
+ on_worker_boot do
18
+ # worker specific setup
19
+ ActiveSupport.on_load(:active_record) do
20
+ config = ActiveRecord::Base.configurations[Rails.env] || Rails.application.config.database_configuration[Rails.env]
21
+ config['pool'] = ENV['MAX_THREADS'] || 16
22
+ ActiveRecord::Base.establish_connection(config)
23
+ end
24
+ end
@@ -0,0 +1,79 @@
1
+ #! /bin/sh
2
+
3
+ BUNDLE_BIN=/usr/local/rbenv/shims/bundle
4
+ APP_PATH=/var/www/<%= Rails.application.class.parent_name.underscore %>
5
+ PUMA_CONFIG_FILE=$APP_PATH/current/config/puma.rb
6
+ PUMA_PID_FILE=$APP_PATH/shared/tmp/pids/puma.pid
7
+ PUMA_SOCKET=$APP_PATH/shared/tmp/sockets/puma.sock
8
+
9
+ # check if puma process is running
10
+ puma_is_running() {
11
+ if [ -S $PUMA_SOCKET ] ; then
12
+ if [ -e $PUMA_PID_FILE ] ; then
13
+ if cat $PUMA_PID_FILE | xargs pgrep -P > /dev/null ; then
14
+ return 0
15
+ else
16
+ echo "No puma process found"
17
+ fi
18
+ else
19
+ echo "No puma pid file found"
20
+ fi
21
+ else
22
+ echo "No puma socket found"
23
+ fi
24
+
25
+ return 1
26
+ }
27
+
28
+ puma_start() {
29
+ rm -f $PUMA_SOCKET
30
+ if [ -e $PUMA_CONFIG_FILE ] ; then
31
+ $BUNDLE_BIN exec puma -C $PUMA_CONFIG_FILE
32
+ else
33
+ $BUNDLE_BIN exec puma
34
+ fi
35
+ }
36
+
37
+ puma_stop() {
38
+ cat $PUMA_PID_FILE | xargs kill -31
39
+ rm -f $PUMA_PID_FILE
40
+ rm -f $PUMA_SOCKET
41
+ }
42
+
43
+ case "$1" in
44
+ start)
45
+ echo "Starting puma..."
46
+ puma_start
47
+ echo "done"
48
+ ;;
49
+
50
+ stop)
51
+ echo "Stopping puma..."
52
+ puma_stop
53
+ echo "done"
54
+ ;;
55
+
56
+ restart)
57
+ if puma_is_running ; then
58
+ echo "Hot-restarting puma..."
59
+ puma_stop
60
+ puma_start
61
+
62
+ echo "Doublechecking the process restart..."
63
+ sleep 5
64
+ if puma_is_running ; then
65
+ echo "done"
66
+ exit 0
67
+ else
68
+ echo "Puma restart failed :/"
69
+ fi
70
+ fi
71
+
72
+ echo "Trying cold reboot"
73
+ bin/puma.sh start
74
+ ;;
75
+
76
+ *)
77
+ echo "Usage: script/puma.sh {start|stop|restart}" >&2
78
+ ;;
79
+ esac