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,91 @@
1
+ # Package generated configuration file
2
+ # See the sshd_config(5) manpage for details
3
+
4
+ # What ports, IPs and protocols we listen for
5
+ Port 22
6
+ <% Pvcglue.cloud.ssh_ports.each do |port| %>
7
+ <%= "Port #{port}\n" %>
8
+ <% end %>
9
+
10
+ # Use these options to restrict which interfaces/protocols sshd will bind to
11
+ #ListenAddress ::
12
+ #ListenAddress 0.0.0.0
13
+ Protocol 2
14
+ # HostKeys for protocol version 2
15
+ HostKey /etc/ssh/ssh_host_rsa_key
16
+ HostKey /etc/ssh/ssh_host_dsa_key
17
+ HostKey /etc/ssh/ssh_host_ecdsa_key
18
+ #Privilege Separation is turned on for security
19
+ UsePrivilegeSeparation yes
20
+
21
+ # Lifetime and size of ephemeral version 1 server key
22
+ KeyRegenerationInterval 3600
23
+ ServerKeyBits 768
24
+
25
+ # Logging
26
+ SyslogFacility AUTH
27
+ LogLevel INFO
28
+
29
+ # Authentication:
30
+ LoginGraceTime 120
31
+ PermitRootLogin yes
32
+ StrictModes yes
33
+
34
+ RSAAuthentication yes
35
+ PubkeyAuthentication yes
36
+ #AuthorizedKeysFile %h/.ssh/authorized_keys
37
+
38
+ # Don't read the user's ~/.rhosts and ~/.shosts files
39
+ IgnoreRhosts yes
40
+ # For this to work you will also need host keys in /etc/ssh_known_hosts
41
+ RhostsRSAAuthentication no
42
+ # similar for protocol version 2
43
+ HostbasedAuthentication no
44
+ # Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
45
+ #IgnoreUserKnownHosts yes
46
+
47
+ # To enable empty passwords, change to yes (NOT RECOMMENDED)
48
+ PermitEmptyPasswords no
49
+
50
+ # Change to yes to enable challenge-response passwords (beware issues with
51
+ # some PAM modules and threads)
52
+ ChallengeResponseAuthentication no
53
+
54
+ # Change to no to disable tunnelled clear text passwords
55
+ #PasswordAuthentication yes
56
+
57
+ # Kerberos options
58
+ #KerberosAuthentication no
59
+ #KerberosGetAFSToken no
60
+ #KerberosOrLocalPasswd yes
61
+ #KerberosTicketCleanup yes
62
+
63
+ # GSSAPI options
64
+ #GSSAPIAuthentication no
65
+ #GSSAPICleanupCredentials yes
66
+
67
+ X11Forwarding yes
68
+ X11DisplayOffset 10
69
+ PrintMotd no
70
+ PrintLastLog yes
71
+ TCPKeepAlive yes
72
+ #UseLogin no
73
+
74
+ #MaxStartups 10:30:60
75
+ #Banner /etc/issue.net
76
+
77
+ # Allow client to pass locale environment variables
78
+ AcceptEnv LANG LC_*
79
+
80
+ Subsystem sftp /usr/lib/openssh/sftp-server
81
+
82
+ # Set this to 'yes' to enable PAM authentication, account processing,
83
+ # and session processing. If this is enabled, PAM authentication will
84
+ # be allowed through the ChallengeResponseAuthentication and
85
+ # PasswordAuthentication. Depending on your PAM configuration,
86
+ # PAM authentication via ChallengeResponseAuthentication may bypass
87
+ # the setting of "PermitRootLogin without-password".
88
+ # If you just want the PAM account and session checks to run without
89
+ # PAM authentication, then enable this but set PasswordAuthentication
90
+ # and ChallengeResponseAuthentication to 'no'.
91
+ UsePAM yes
@@ -0,0 +1,33 @@
1
+ # This is a generated file. Do not modify...or else! :)
2
+
3
+ set :stage, :<%= Pvcglue.cloud.stage_name %>
4
+ set :rails_env, :<%= Pvcglue.cloud.stage_name %> # workaround for RAILS_ENV= being blank in delayed job tasks
5
+ set :deploy_to, '<%= Pvcglue.cloud.deploy_to_app_dir %>'
6
+ set :linked_files, ['.env.<%= Pvcglue.cloud.stage_name %>']
7
+ set :rvm_ruby_version, '<%= Pvcglue.configuration.ruby_version %>'
8
+ <% if Pvcglue.cloud.delayed_job_args %>
9
+ set :delayed_job_args, "<%= Pvcglue.cloud.delayed_job_args %>"
10
+ <% end %>
11
+ set :ssh_options, {port: <%= Pvcglue.cloud.port_in_context(:deploy) %>}
12
+
13
+ <% Pvcglue.cloud.nodes_in_stage('web').each do |node, node_config| %>
14
+ server '<%= node_config[:public_ip] %>', roles: %w{web app db}, user: 'deploy' # server: <%= node.to_s %>
15
+ <% end %>
16
+
17
+ <% if Pvcglue.cloud.db_rebuild %>
18
+ namespace :deploy do
19
+
20
+ desc 'Runs rake db:migrate if migrations are set'
21
+ task :migrate => [:set_rails_env] do
22
+ on primary fetch(:migration_role) do
23
+ within release_path do
24
+ with rails_env: fetch(:rails_env) do
25
+ execute :rake, "db:reload"
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ after 'deploy:updated', 'deploy:migrate'
32
+ end
33
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= "#{Pvcglue.cloud.timezone}\n" %>
@@ -0,0 +1,42 @@
1
+ *filter
2
+ :ufw-user-input - [0:0]
3
+ :ufw-user-output - [0:0]
4
+ :ufw-user-forward - [0:0]
5
+ :ufw-before-logging-input - [0:0]
6
+ :ufw-before-logging-output - [0:0]
7
+ :ufw-before-logging-forward - [0:0]
8
+ :ufw-user-logging-input - [0:0]
9
+ :ufw-user-logging-output - [0:0]
10
+ :ufw-user-logging-forward - [0:0]
11
+ :ufw-after-logging-input - [0:0]
12
+ :ufw-after-logging-output - [0:0]
13
+ :ufw-after-logging-forward - [0:0]
14
+ :ufw-logging-deny - [0:0]
15
+ :ufw-logging-allow - [0:0]
16
+ :ufw-user-limit - [0:0]
17
+ :ufw-user-limit-accept - [0:0]
18
+ ### RULES ###
19
+
20
+ <% Pvcglue.cloud.firewall_allow_incoming_on_port.each do |port| %>
21
+ <%= "### tuple ### allow tcp #{port} 0.0.0.0/0 any 0.0.0.0/0 in\n" %>
22
+ <%= "-A ufw-user-input -p tcp --dport #{port} -j ACCEPT\n" %>
23
+
24
+ <% end %>
25
+ <% Pvcglue.cloud.firewall_allow_incoming_from_ip.each do |ip| %>
26
+ <%= "### tuple ### allow any any 0.0.0.0/0 any #{ip} in\n" %>
27
+ <%= "-A ufw-user-input -s #{ip} -j ACCEPT\n" %>
28
+
29
+ <% end %>
30
+ ### END RULES ###
31
+
32
+ ### LOGGING ###
33
+ -I ufw-user-logging-input -j RETURN
34
+ -I ufw-user-logging-output -j RETURN
35
+ -I ufw-user-logging-forward -j RETURN
36
+ ### END LOGGING ###
37
+
38
+ ### RATE LIMITING ###
39
+ -A ufw-user-limit -j REJECT
40
+ -A ufw-user-limit-accept -j ACCEPT
41
+ ### END RATE LIMITING ###
42
+ COMMIT
@@ -0,0 +1,25 @@
1
+ *filter
2
+ :ufw6-user-input - [0:0]
3
+ :ufw6-user-output - [0:0]
4
+ :ufw6-user-forward - [0:0]
5
+ :ufw6-before-logging-input - [0:0]
6
+ :ufw6-before-logging-output - [0:0]
7
+ :ufw6-before-logging-forward - [0:0]
8
+ :ufw6-user-logging-input - [0:0]
9
+ :ufw6-user-logging-output - [0:0]
10
+ :ufw6-user-logging-forward - [0:0]
11
+ :ufw6-after-logging-input - [0:0]
12
+ :ufw6-after-logging-output - [0:0]
13
+ :ufw6-after-logging-forward - [0:0]
14
+ :ufw6-logging-deny - [0:0]
15
+ :ufw6-logging-allow - [0:0]
16
+ ### RULES ###
17
+
18
+ ### END RULES ###
19
+
20
+ ### LOGGING ###
21
+ -I ufw6-user-logging-input -j RETURN
22
+ -I ufw6-user-logging-output -j RETURN
23
+ -I ufw6-user-logging-forward -j RETURN
24
+ ### END LOGGING ###
25
+ COMMIT
@@ -0,0 +1,120 @@
1
+ # We need this for our non-interactive shells, too.
2
+ if [ -z "$PS1" ]; then
3
+ # Yes, this needs to be here, and below, too. :)
4
+ PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
5
+ [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
6
+ fi
7
+
8
+ # ~/.bashrc: executed by bash(1) for non-login shells.
9
+ # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
10
+ # for examples
11
+
12
+ # If not running interactively, don't do anything
13
+ [ -z "$PS1" ] && return
14
+
15
+ # don't put duplicate lines or lines starting with space in the history.
16
+ # See bash(1) for more options
17
+ HISTCONTROL=ignoreboth
18
+
19
+ # append to the history file, don't overwrite it
20
+ shopt -s histappend
21
+
22
+ # for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
23
+ HISTSIZE=1000
24
+ HISTFILESIZE=2000
25
+
26
+ # check the window size after each command and, if necessary,
27
+ # update the values of LINES and COLUMNS.
28
+ shopt -s checkwinsize
29
+
30
+ # If set, the pattern "**" used in a pathname expansion context will
31
+ # match all files and zero or more directories and subdirectories.
32
+ #shopt -s globstar
33
+
34
+ # make less more friendly for non-text input files, see lesspipe(1)
35
+ [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
36
+
37
+ # set variable identifying the chroot you work in (used in the prompt below)
38
+ if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
39
+ debian_chroot=$(cat /etc/debian_chroot)
40
+ fi
41
+
42
+ # set a fancy prompt (non-color, unless we know we "want" color)
43
+ case "$TERM" in
44
+ xterm-color) color_prompt=yes;;
45
+ esac
46
+
47
+ # uncomment for a colored prompt, if the terminal has the capability; turned
48
+ # off by default to not distract the user: the focus in a terminal window
49
+ # should be on the output of commands, not on the prompt
50
+ #force_color_prompt=yes
51
+
52
+ if [ -n "$force_color_prompt" ]; then
53
+ if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
54
+ # We have color support; assume it's compliant with Ecma-48
55
+ # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
56
+ # a case would tend to support setf rather than setaf.)
57
+ color_prompt=yes
58
+ else
59
+ color_prompt=
60
+ fi
61
+ fi
62
+
63
+ if [ "$color_prompt" = yes ]; then
64
+ PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
65
+ else
66
+ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
67
+ fi
68
+ unset color_prompt force_color_prompt
69
+
70
+ # If this is an xterm set the title to user@host:dir
71
+ case "$TERM" in
72
+ xterm*|rxvt*)
73
+ PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
74
+ ;;
75
+ *)
76
+ ;;
77
+ esac
78
+
79
+ # enable color support of ls and also add handy aliases
80
+ if [ -x /usr/bin/dircolors ]; then
81
+ test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
82
+ alias ls='ls --color=auto'
83
+ #alias dir='dir --color=auto'
84
+ #alias vdir='vdir --color=auto'
85
+
86
+ alias grep='grep --color=auto'
87
+ alias fgrep='fgrep --color=auto'
88
+ alias egrep='egrep --color=auto'
89
+ fi
90
+
91
+ # some more ls aliases
92
+ alias ll='ls -alF'
93
+ alias la='ls -A'
94
+ alias l='ls -CF'
95
+
96
+ # Add an "alert" alias for long running commands. Use like so:
97
+ # sleep 10; alert
98
+ alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
99
+
100
+ # Alias definitions.
101
+ # You may want to put all your additions into a separate file like
102
+ # ~/.bash_aliases, instead of adding them here directly.
103
+ # See /usr/share/doc/bash-doc/examples in the bash-doc package.
104
+
105
+ if [ -f ~/.bash_aliases ]; then
106
+ . ~/.bash_aliases
107
+ fi
108
+
109
+ # enable programmable completion features (you don't need to enable
110
+ # this, if it's already enabled in /etc/bash.bashrc and /etc/profile
111
+ # sources /etc/bash.bashrc).
112
+ if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
113
+ . /etc/bash_completion
114
+ fi
115
+
116
+ # Best practice dictates that this should be moved to .bash_profile
117
+ # http://askubuntu.com/questions/121073/why-bash-profile-is-not-getting-sourced-when-opening-a-terminal
118
+ # but this works ok for now, it just has to be in two places. It should be done at the end of this file.
119
+ PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
120
+ [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
@@ -0,0 +1,3 @@
1
+ <% Hash[Pvcglue.cloud.stage_env.sort].each do |key, value| %>
2
+ <%= "#{key}=#{value}\n" %>
3
+ <% end %>
@@ -0,0 +1,82 @@
1
+ user www-data;
2
+
3
+ # TODO: Should be set to the same as `grep processor /proc/cpuinfo | wc -l`
4
+ worker_processes 2;
5
+
6
+ pid /var/run/nginx.pid;
7
+
8
+ events {
9
+ worker_connections 768;
10
+ # multi_accept on;
11
+ }
12
+
13
+ http {
14
+
15
+ ##
16
+ # Basic Settings
17
+ ##
18
+
19
+ sendfile on;
20
+ tcp_nopush on;
21
+ tcp_nodelay on;
22
+ keepalive_timeout 65;
23
+ types_hash_max_size 2048;
24
+ # server_tokens off;
25
+
26
+ server_names_hash_bucket_size 64;
27
+ # server_name_in_redirect off;
28
+
29
+ include /etc/nginx/mime.types;
30
+ default_type application/octet-stream;
31
+
32
+ ##
33
+ # Logging Settings
34
+ ##
35
+
36
+ access_log /var/log/nginx/access.log;
37
+ error_log /var/log/nginx/error.log;
38
+
39
+ ##
40
+ # Gzip Settings
41
+ ##
42
+
43
+ gzip on;
44
+ gzip_disable "msie6";
45
+
46
+ # gzip_vary on;
47
+ # gzip_proxied any;
48
+ # gzip_comp_level 6;
49
+ # gzip_buffers 16 8k;
50
+ # gzip_http_version 1.1;
51
+ # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
52
+
53
+ ##
54
+ # nginx-naxsi config
55
+ ##
56
+ # Uncomment it if you installed nginx-naxsi
57
+ ##
58
+
59
+ # include /etc/nginx/naxsi_core.rules;
60
+
61
+ ##
62
+ # Phusion Passenger config
63
+ ##
64
+ # Uncomment it if you installed passenger or passenger-enterprise
65
+ ##
66
+
67
+ passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
68
+
69
+ ##
70
+ # Virtual Host Configs
71
+ ##
72
+
73
+ # disable the default server
74
+ server {
75
+ listen 80;
76
+ server_name _;
77
+ return 444;
78
+ }
79
+
80
+ include /etc/nginx/conf.d/*.conf;
81
+ include /etc/nginx/sites-enabled/*;
82
+ }
@@ -0,0 +1,8 @@
1
+ server {
2
+ listen 80;
3
+ passenger_enabled on;
4
+ passenger_ruby <%= Pvcglue.cloud.passenger_ruby %>;
5
+ server_name <%= Pvcglue.cloud.domains.join(' ') %>;
6
+ rails_env <%= Pvcglue.cloud.stage_name %>;
7
+ root <%= Pvcglue.cloud.deploy_to_app_current_public_dir %>;
8
+ }
@@ -0,0 +1,53 @@
1
+ # Based on https://github.com/emancu/toml-rb/blob/master/lib/toml/dumper.rb
2
+ module TOML
3
+ class PvcDumper
4
+ attr_reader :toml_str
5
+
6
+ def initialize(hash)
7
+ @toml_str = ''
8
+
9
+ visit(hash, '')
10
+ end
11
+
12
+ private
13
+
14
+ def visit(hash, prefix, level = 0)
15
+ nested_pairs = []
16
+ simple_pairs = []
17
+ indent_prefix = ' '*[level-1,0].max*2
18
+ indent_values = ' '*([level-1, 0].max*2+2)
19
+
20
+ if level == 1
21
+ @toml_str += "\n" unless @toml_str.empty?
22
+ @toml_str += "################################################################################\n"
23
+ @toml_str += "# === #{prefix} ===\n"
24
+ @toml_str += "################################################################################\n"
25
+ end
26
+
27
+ hash.keys.sort.each do |key|
28
+ val = hash[key]
29
+ (val.is_a?(Hash) ? nested_pairs : simple_pairs) << [key, val]
30
+ end
31
+
32
+ @toml_str += "\n#{indent_prefix}[#{prefix}]\n" unless prefix.empty? || simple_pairs.empty?
33
+
34
+ # First add simple pairs, under the prefix
35
+ simple_pairs.each do |key, val|
36
+ @toml_str << "#{indent_values}#{key.to_s} = #{to_toml(val)}\n"
37
+ end
38
+
39
+ nested_pairs.each do |key, val|
40
+ visit(val, prefix.empty? ? key.to_s : [prefix, key].join('.'), level+1)
41
+ end
42
+ end
43
+
44
+ def to_toml(obj)
45
+ case
46
+ when obj.is_a?(Time)
47
+ obj.strftime('%Y-%m-%dT%H:%M:%SZ')
48
+ else
49
+ obj.inspect
50
+ end
51
+ end
52
+ end
53
+ end