pvcglue 0.1.5

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 (65) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +91 -0
  6. data/Rakefile +1 -0
  7. data/bin/pvc +13 -0
  8. data/lib/pvcglue.rb +43 -0
  9. data/lib/pvcglue/all_the_things.rb +7 -0
  10. data/lib/pvcglue/bootstrap.rb +8 -0
  11. data/lib/pvcglue/capistrano.rb +35 -0
  12. data/lib/pvcglue/cli.rb +150 -0
  13. data/lib/pvcglue/cloud.rb +278 -0
  14. data/lib/pvcglue/configuration.rb +157 -0
  15. data/lib/pvcglue/db.rb +145 -0
  16. data/lib/pvcglue/deploy.rb +4 -0
  17. data/lib/pvcglue/env.rb +141 -0
  18. data/lib/pvcglue/manager.rb +137 -0
  19. data/lib/pvcglue/nodes.rb +29 -0
  20. data/lib/pvcglue/packages.rb +47 -0
  21. data/lib/pvcglue/packages/bootstrap.rb +92 -0
  22. data/lib/pvcglue/packages/env.rb +80 -0
  23. data/lib/pvcglue/packages/firewall.rb +48 -0
  24. data/lib/pvcglue/packages/manager.rb +102 -0
  25. data/lib/pvcglue/packages/nginx.rb +10 -0
  26. data/lib/pvcglue/packages/nodejs.rb +17 -0
  27. data/lib/pvcglue/packages/passenger.rb +28 -0
  28. data/lib/pvcglue/packages/postgresql.rb +10 -0
  29. data/lib/pvcglue/packages/role_db.rb +47 -0
  30. data/lib/pvcglue/packages/role_lb.rb +64 -0
  31. data/lib/pvcglue/packages/role_memcached.rb +14 -0
  32. data/lib/pvcglue/packages/role_web.rb +60 -0
  33. data/lib/pvcglue/packages/rvm.rb +75 -0
  34. data/lib/pvcglue/packages/timezone.rb +17 -0
  35. data/lib/pvcglue/packages/ubuntu.rb +100 -0
  36. data/lib/pvcglue/railtie.rb +11 -0
  37. data/lib/pvcglue/ssl.rb +37 -0
  38. data/lib/pvcglue/templates/20auto-upgrades.erb +2 -0
  39. data/lib/pvcglue/templates/authorized_keys.erb +3 -0
  40. data/lib/pvcglue/templates/capfile.erb +20 -0
  41. data/lib/pvcglue/templates/database.yml.erb +57 -0
  42. data/lib/pvcglue/templates/denial_of_service.erb +3 -0
  43. data/lib/pvcglue/templates/deploy.rb.erb +81 -0
  44. data/lib/pvcglue/templates/gemrc.erb +1 -0
  45. data/lib/pvcglue/templates/hosts.erb +9 -0
  46. data/lib/pvcglue/templates/lb.nginx.conf.erb +88 -0
  47. data/lib/pvcglue/templates/lb.sites-enabled.erb +74 -0
  48. data/lib/pvcglue/templates/maintenance_mode.erb +46 -0
  49. data/lib/pvcglue/templates/memcached.conf.erb +55 -0
  50. data/lib/pvcglue/templates/passenger.list.erb +2 -0
  51. data/lib/pvcglue/templates/pg_hba.conf.erb +101 -0
  52. data/lib/pvcglue/templates/postgresql.conf.erb +557 -0
  53. data/lib/pvcglue/templates/sshd_config.erb +91 -0
  54. data/lib/pvcglue/templates/stage-deploy.rb.erb +33 -0
  55. data/lib/pvcglue/templates/timezone.erb +1 -0
  56. data/lib/pvcglue/templates/ufw.rules.erb +42 -0
  57. data/lib/pvcglue/templates/ufw.rules6.erb +25 -0
  58. data/lib/pvcglue/templates/web.bashrc.erb +120 -0
  59. data/lib/pvcglue/templates/web.env.erb +3 -0
  60. data/lib/pvcglue/templates/web.nginx.conf.erb +82 -0
  61. data/lib/pvcglue/templates/web.sites-enabled.erb +8 -0
  62. data/lib/pvcglue/toml_pvc_dumper.rb +53 -0
  63. data/lib/pvcglue/version.rb +3 -0
  64. data/pvcglue.gemspec +33 -0
  65. metadata +296 -0
@@ -0,0 +1,10 @@
1
+ # Reference http://www.modrails.com/documentation/Users%20guide%20Nginx.html
2
+ # 'nginx-extras' is the "everything" install, https://wiki.debian.org/Nginx
3
+ apt_package 'nginx', 'nginx-extras' do
4
+ depends_on 'phusion-repository' # Must use nginx from phusion repo to automatically get passenger integration and the latest version
5
+ action('start') { sudo 'service nginx start' }
6
+ action('stop') { sudo 'service nginx stop' }
7
+ action('restart') { trigger('nginx:running') ? sudo('service nginx restart') : trigger('nginx:start') }
8
+ action('running') { run('ps aux | grep [n]ginx') =~ /nginx: master process/ }
9
+ action('reload') { sudo 'pkill -HUP nginx' }
10
+ end
@@ -0,0 +1,17 @@
1
+ package 'nodejs' do
2
+ depends_on 'apt'
3
+ validate do
4
+ trigger('apt:exists', 'nodejs') &&
5
+ binary_exists?('node') &&
6
+ binary_exists?('npm')
7
+ end
8
+ apply do
9
+ trigger 'apt:ppa', 'ppa:chris-lea/node.js'
10
+ trigger 'apt:update'
11
+ trigger 'apt:install', 'nodejs'
12
+ end
13
+ remove do
14
+ trigger 'apt:remove', 'nodejs'
15
+ end
16
+ end
17
+
@@ -0,0 +1,28 @@
1
+ apt_package 'apt-transport-https'
2
+ apt_package 'passenger'
3
+
4
+ package 'phusion-sources-list' do
5
+ file({
6
+ :template => Pvcglue.template_file_name('passenger.list.erb'),
7
+ :destination => '/etc/apt/sources.list.d/passenger.list',
8
+ :permissions => 644,
9
+ :user => 'root',
10
+ :group => 'root'
11
+ }) { trigger 'apt:update', true
12
+ }
13
+
14
+ end
15
+
16
+ package 'phusion-apt-key' do
17
+ apply do
18
+ sudo "apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7"
19
+ end
20
+ end
21
+
22
+ package 'phusion-repository' do
23
+ # http://www.modrails.com/documentation/Users%20guide%20Nginx.html#install_on_debian_ubuntu
24
+ depends_on 'apt-transport-https'
25
+ depends_on 'phusion-apt-key'
26
+ depends_on 'phusion-sources-list'
27
+ end
28
+
@@ -0,0 +1,10 @@
1
+ apt_package 'postgresql' do
2
+ action('start') { sudo 'service postgresql start' }
3
+ action('stop') { sudo 'service postgresql stop' }
4
+ action('restart') { sudo('service postgresql restart') }
5
+ end
6
+
7
+ package 'postgres' do
8
+ depends_on 'postgresql', 'libpq-dev'
9
+ end
10
+
@@ -0,0 +1,47 @@
1
+ package 'db' do
2
+ depends_on 'env-initialized'
3
+ depends_on 'postgresql'
4
+ depends_on 'postgresql-conf'
5
+ depends_on 'postgresql-app-stage-conf'
6
+ end
7
+
8
+ package 'postgresql-conf' do
9
+ file({
10
+ :template => Pvcglue.template_file_name('postgresql.conf.erb'),
11
+ :destination => '/etc/postgresql/9.1/main/postgresql.conf',
12
+ :create_dirs => false,
13
+ :permissions => 0644,
14
+ :user => 'postgres',
15
+ :group => 'postgres'
16
+ }) { trigger 'postgresql:restart' }
17
+
18
+ file({
19
+ :template => Pvcglue.template_file_name('pg_hba.conf.erb'),
20
+ :destination => '/etc/postgresql/9.1/main/pg_hba.conf',
21
+ :create_dirs => false,
22
+ :permissions => 0644,
23
+ :user => 'postgres',
24
+ :group => 'postgres'
25
+ }) { trigger 'postgresql:restart' }
26
+ end
27
+
28
+ package 'postgresql-app-stage-conf' do
29
+ # TODO: Add `verify` method so it will be faster, and won't display errors
30
+ apply do
31
+ username = Pvcglue.cloud.stage_env['DB_USER_POSTGRES_USERNAME']
32
+ password = Pvcglue.cloud.stage_env['DB_USER_POSTGRES_PASSWORD']
33
+ db_name = username # just for clarity in later statements. This also must match database.yml.
34
+ run(%Q[sudo -u postgres psql -c "CREATE ROLE #{username} LOGIN CREATEDB PASSWORD '#{password}'"])
35
+ run(%Q[sudo -u postgres psql -c "ALTER ROLE #{username} PASSWORD '#{password}' CREATEDB LOGIN"])
36
+ run(%Q[sudo -u postgres psql -c "CREATE DATABASE #{db_name} WITH OWNER #{username}"])
37
+ run(%Q[sudo -u postgres psql #{db_name} -c "ALTER SCHEMA public OWNER TO #{username}"])
38
+ end
39
+ end
40
+
41
+ package 'postgresql-root-password' do
42
+ apply do
43
+ # TODO: Use this to implement setting of the root password
44
+ # sudo(%q[sudo -u postgres psql -c "ALTER ROLE postgres WITH PASSWORD 'zzz';"])
45
+ end
46
+ end
47
+
@@ -0,0 +1,64 @@
1
+ package 'lb' do
2
+ depends_on 'nginx'
3
+ depends_on 'ssl-cert'
4
+ depends_on 'lb-config'
5
+ depends_on 'lb-maintenance-files'
6
+
7
+ validate do
8
+ trigger('nginx:running')
9
+ end
10
+
11
+ end
12
+
13
+ package 'lb-config' do
14
+ file({
15
+ :template => Pvcglue.template_file_name('lb.nginx.conf.erb'),
16
+ :destination => '/etc/./nginx/nginx.conf', # !!! Yes the extra '.' is important !!! It makes this nginx.conf a 'different' nginx.conf than the web server. Seems to be a "feature" of the orca gem.
17
+ :create_dirs => false,
18
+ :permissions => 0644,
19
+ :user => 'root',
20
+ :group => 'root'
21
+ }) { sudo('service nginx restart') }
22
+
23
+ file({
24
+ :template => Pvcglue.template_file_name('lb.sites-enabled.erb'),
25
+ :destination => "/etc/./nginx/sites-enabled/#{Pvcglue.cloud.app_and_stage_name}", # !!! Yes the extra '.' is important !!! It makes this nginx.conf a 'different' nginx.conf than the web server. Seems to be a "feature" of the orca gem.
26
+ :create_dirs => false,
27
+ :permissions => 0644,
28
+ :user => 'root',
29
+ :group => 'root'
30
+ }) { sudo('service nginx restart') }
31
+ end
32
+
33
+ package 'lb-maintenance-files' do
34
+ apply do
35
+ source_dir = Pvcglue.configuration.app_maintenance_files_dir
36
+ dest_dir = Pvcglue.cloud.maintenance_files_dir
37
+ # run on remote
38
+ run(%(mkdir -p #{dest_dir}))
39
+ # run rsync from local machine (and it will connect to remote)
40
+ cmd = (%(rsync -rzv --exclude=maintenance.on --delete -e 'ssh -p #{Pvcglue.cloud.port_in_node_context}' #{source_dir}/ #{node.get(:user)}@#{node.host}:#{dest_dir}/))
41
+ raise $?.to_s unless system(cmd)
42
+ end
43
+ end
44
+
45
+ package 'maintenance_mode' do
46
+ apply do
47
+ if Pvcglue.cloud.maintenance_mode == 'on'
48
+ run "touch #{Pvcglue.cloud.maintenance_mode_file_name}"
49
+ else
50
+ run "rm #{Pvcglue.cloud.maintenance_mode_file_name}"
51
+ end
52
+ end
53
+ end
54
+
55
+ package 'ssl-cert' do
56
+ apply do
57
+ if Pvcglue.cloud.ssl_mode == :load_balancer_force_ssl
58
+ sudo(%(mkdir -p #{Pvcglue.cloud.nginx_config_ssl_path}))
59
+ sudo(%Q[echo '#{Pvcglue.cloud.ssl_crt}' | sudo tee #{Pvcglue.cloud.nginx_ssl_crt_file_name} && sudo chmod 600 #{Pvcglue.cloud.nginx_ssl_crt_file_name}])
60
+ sudo(%Q[echo '#{Pvcglue.cloud.ssl_key}' | sudo tee #{Pvcglue.cloud.nginx_ssl_key_file_name} && sudo chmod 600 #{Pvcglue.cloud.nginx_ssl_key_file_name}])
61
+ # TODO: Restart nginx!!!
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,14 @@
1
+ apt_package 'memcached'
2
+
3
+ package 'caching' do
4
+ depends_on 'memcached'
5
+ file({
6
+ :template => Pvcglue.template_file_name('memcached.conf.erb'),
7
+ :destination => '/etc/memcached.conf',
8
+ :create_dirs => false,
9
+ :permissions => 0644,
10
+ :user => 'root',
11
+ :group => 'root'
12
+ }) { sudo('service memcached restart') }
13
+ end
14
+
@@ -0,0 +1,60 @@
1
+ package 'web' do
2
+ # rvm/ruby install based on http://ryanbigg.com/2010/12/ubuntu-ruby-rvm-rails-and-you/
3
+ depends_on 'swap' # needed for deployment/asset building on < 1GB machines
4
+ depends_on 'build-essential'
5
+ depends_on 'git'
6
+ depends_on 'rvm'
7
+ depends_on 'no-rdoc'
8
+
9
+
10
+ depends_on 'rvm-ruby'
11
+ depends_on 'bundler'
12
+ depends_on 'nginx'
13
+ depends_on 'phusion-passenger'
14
+ depends_on 'app-env'
15
+ depends_on 'web-site-config'
16
+
17
+ depends_on 'imagemagick' # TODO: app specific--will need to make system to include extra packages
18
+ depends_on 'libpq-dev' # for pg gem
19
+ depends_on 'nodejs'
20
+ end
21
+
22
+
23
+ package 'web-site-config' do
24
+ depends_on 'web-get-passenger-ruby'
25
+ file({
26
+ :template => Pvcglue.template_file_name('web.sites-enabled.erb'),
27
+ :destination => "/etc/nginx/sites-enabled/#{Pvcglue.cloud.app_and_stage_name}",
28
+ :create_dirs => false,
29
+ :permissions => 0644,
30
+ :user => 'root',
31
+ :group => 'root'
32
+ }) { sudo('service nginx restart') }
33
+ end
34
+
35
+ package 'web-get-passenger-ruby' do
36
+ apply do
37
+ info = run("rvm use #{Pvcglue.configuration.ruby_version} && $(which passenger-config) --ruby-command")
38
+ if info =~ /passenger_ruby (.*)/
39
+ Pvcglue.cloud.passenger_ruby = $1
40
+ else
41
+ raise "'passenger_ruby' not found." unless Pvcglue.cloud.passenger_ruby
42
+ end
43
+ end
44
+ end
45
+
46
+ package 'phusion-passenger' do
47
+ depends_on 'phusion-repository'
48
+ depends_on 'passenger'
49
+ validate do
50
+ run('passenger -v') =~ /Phusion Passenger version 4/
51
+ end
52
+
53
+ file({
54
+ :template => Pvcglue.template_file_name('web.nginx.conf.erb'),
55
+ :destination => '/etc/nginx/nginx.conf',
56
+ :permissions => 0644,
57
+ :user => 'root',
58
+ :group => 'root'
59
+ }) { trigger 'nginx:restart' }
60
+ end
@@ -0,0 +1,75 @@
1
+ package 'rvm' do
2
+ depends_on 'curl'
3
+ depends_on 'rvm-bashrc'
4
+
5
+ validate do
6
+ run('type rvm | head -n 1') =~ /rvm is a function/
7
+ end
8
+
9
+ apply do
10
+ run '\curl -sSL https://get.rvm.io | bash -s stable'
11
+ run "rvm requirements"
12
+ end
13
+
14
+ remove do
15
+ run 'yes "yes" | rvm implode'
16
+ end
17
+ end
18
+
19
+ package 'rvm-bashrc' do
20
+ file({
21
+ :template => Pvcglue.template_file_name('web.bashrc.erb'),
22
+ :destination => '/home/deploy/.bashrc',
23
+ :create_dirs => false,
24
+ :permissions => 0644,
25
+ :user => 'deploy',
26
+ :group => 'deploy'
27
+ })
28
+ end
29
+
30
+ package 'gem' do
31
+ depends_on 'rvm-ruby'
32
+ action 'exists' do |gem_name|
33
+ run("gem list -i #{gem_name}") =~ /true/
34
+ end
35
+ action 'install' do |gem_name|
36
+ sudo "gem install #{gem_name} --no-ri --no-rdoc"
37
+ end
38
+ action 'uninstall' do |gem_name|
39
+ sudo "gem uninstall #{gem_name} -x -a"
40
+ end
41
+ end
42
+
43
+ package 'bundler' do
44
+ depends_on 'gem'
45
+ apply { trigger 'gem:install', 'bundler' }
46
+ remove { trigger 'gem:remove', 'bundler' }
47
+ validate { trigger 'gem:exists', 'bundler' }
48
+ end
49
+
50
+ package 'rvm-ruby' do
51
+ depends_on 'rvm'
52
+
53
+ validate do
54
+ run('rvm list strings') =~ /#{Pvcglue.configuration.ruby_version.gsub('.', '\.')}/
55
+ end
56
+
57
+ apply do
58
+ run "rvm install #{Pvcglue.configuration.ruby_version}"
59
+ # run "rvm --default use 2.0.0"
60
+ end
61
+
62
+ remove do
63
+ run "rvm remove --archive --gems #{Pvcglue.configuration.ruby_version}"
64
+ end
65
+
66
+ end
67
+
68
+ package 'no-rdoc' do
69
+ file({
70
+ :template => Pvcglue.template_file_name('gemrc.erb'),
71
+ :destination => '/home/deploy/.gemrc',
72
+ :create_dirs => false
73
+ })
74
+ end
75
+
@@ -0,0 +1,17 @@
1
+ package 'time-zone' do
2
+ # http://hacksforge.com/How-to-change-time-zone-in-Ubuntu-Linux.html
3
+
4
+ file({
5
+ :template => Pvcglue.template_file_name('timezone.erb'),
6
+ :destination => '/etc/timezone',
7
+ :create_dirs => false,
8
+ :permissions => 0644,
9
+ :user => 'root',
10
+ :group => 'root'
11
+ }) do
12
+ sudo %Q[dpkg-reconfigure --frontend noninteractive tzdata]
13
+ sudo %Q[service cron restart]
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,100 @@
1
+ # apt_package 'htop' # moved to manager
2
+ # apt_package 'ufw' # moved to manager
3
+ apt_package 'build-essential'
4
+ apt_package 'git', 'git-core'
5
+ apt_package 'libpq-dev'
6
+ apt_package 'libxml2', 'libxml2-dev'
7
+ apt_package 'libxslt', 'libxslt1-dev'
8
+ apt_package 'imagemagick'
9
+ apt_package 'curl'
10
+
11
+ package 'swap' do
12
+ # https://www.digitalocean.com/community/articles/how-to-add-swap-on-ubuntu-12-04
13
+ depends_on 'swap-fstab'
14
+
15
+ validate do
16
+ # TODO: This may be brittle
17
+ # Ex: "Filename\t\t\t\tType\t\tSize\tUsed\tPriority\n/swapfile file\t\t524284\t306372\t-1\n"
18
+ result = sudo("swapon -s")
19
+ data = result.split("\n").last.split("\t")[2]
20
+ # sudo("swapon -s") =~ /\/swapfile file #{Pvcglue.cloud.swapfile_size} 0 -1/
21
+ megs = (data.to_f / 1024).round
22
+ puts megs.inspect
23
+ puts Pvcglue.cloud.swapfile_size.inspect
24
+ megs == Pvcglue.cloud.swapfile_size
25
+ end
26
+
27
+ apply do
28
+ sudo("swapoff -a")
29
+ sudo("rm /swapfile")
30
+ sudo("fallocate -l #{Pvcglue.cloud.swapfile_size}M /swapfile")
31
+ # sudo("dd if=/dev/zero of=/swapfile bs=1024 count=#{Pvcglue.cloud.swapfile_size}k")
32
+ sudo("sudo chown root:root /swapfile && sudo chmod 0600 /swapfile")
33
+ sudo("echo 10 | sudo tee /proc/sys/vm/swappiness")
34
+ sudo("echo vm.swappiness = 10 | sudo tee -a /etc/sysctl.conf")
35
+ sudo("mkswap /swapfile")
36
+ sudo("swapon /swapfile")
37
+ end
38
+ end
39
+
40
+ package 'swap-fstab' do
41
+ validate do
42
+ sudo("cat /etc/fstab") =~ /\/swapfile/
43
+ end
44
+
45
+ apply do
46
+ sudo(%Q[echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab])
47
+ end
48
+ end
49
+
50
+ package 'apt-get-upgrade' do
51
+ apply do
52
+ sudo "DEBIAN_FRONTEND=noninteractive apt-get update -y -qq"
53
+ sudo "DEBIAN_FRONTEND=noninteractive apt-get upgrade -y"
54
+ end
55
+ end
56
+ =begin
57
+ # /etc/fstab: static file system information.
58
+ #
59
+ # Use 'blkid' to print the universally unique identifier for a
60
+ # device; this may be used with UUID= as a more robust way to name devices
61
+ # that works even if disks are added and removed. See fstab(5).
62
+ #
63
+ # <file system> <mount point> <type> <options> <dump> <pass>
64
+ proc /proc proc nodev,noexec,nosuid 0 0
65
+ # / was on /dev/vda1 during installation
66
+ UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd / ext4 noatime,errors=remount-ro 0 1
67
+ =end
68
+ package 'reboot' do
69
+ apply do
70
+ sudo "reboot"
71
+ end
72
+ end
73
+
74
+ package 'get-hostname' do
75
+ apply do
76
+ Pvcglue.cloud.current_hostname = run('hostname')
77
+ end
78
+
79
+ end
80
+
81
+ package 'hostname' do
82
+ depends_on 'get-hostname'
83
+
84
+ file({
85
+ :template => Pvcglue.template_file_name('hosts.erb'),
86
+ :destination => '/etc/hosts',
87
+ :create_dirs => false,
88
+ :permissions => 0644,
89
+ :user => 'root',
90
+ :group => 'root'
91
+ }) do
92
+ sudo('service hostname restart')
93
+ hostname_f = run 'hostname -f'
94
+ if Pvcglue.cloud.current_hostname != hostname_f
95
+ raise "Hostname mismatch: #{Pvcglue.cloud.current_hostname} != #{hostname_f}"
96
+ end
97
+ end
98
+
99
+ end
100
+