app_maint 0.0.2 → 0.0.3
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.
- data/lib/app_maint/version.rb +1 -1
- data/lib/recipes/_fix_permissons.rb +10 -0
- data/lib/recipes/base.rb +72 -14
- data/lib/recipes/chef.rb +17 -10
- data/lib/recipes/git.rb +5 -1
- data/lib/recipes/templates/unicorn.rb.erb +8 -0
- data/lib/recipes/templates/unicorn_init.erb +84 -0
- data/lib/recipes/unicorn.rb +22 -0
- metadata +9 -5
data/lib/app_maint/version.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :fix_permissions do
|
3
|
+
desc "Fix wrong permissions for apps directory"
|
4
|
+
task :setup, roles: :web do
|
5
|
+
run "#{sudo} chown -R #{user}:admin /home/#{user}/apps"
|
6
|
+
end
|
7
|
+
|
8
|
+
after "deploy:setup", "fix_permissions:setup"
|
9
|
+
end
|
10
|
+
end
|
data/lib/recipes/base.rb
CHANGED
@@ -1,43 +1,101 @@
|
|
1
|
+
def template(from, to)
|
2
|
+
erb = File.read(File.expand_path("../templates/#{from}", __FILE__))
|
3
|
+
put ERB.new(erb).result(binding), to
|
4
|
+
end
|
5
|
+
|
1
6
|
Capistrano::Configuration.instance.load do
|
2
7
|
namespace :base do
|
3
8
|
desc "Prepare system for deployment"
|
4
9
|
task :setup do
|
5
10
|
init_deploy_user
|
6
|
-
|
11
|
+
install_packages
|
12
|
+
install_ruby
|
13
|
+
pam_ssh_agent_auth
|
7
14
|
end
|
8
|
-
|
15
|
+
|
9
16
|
desc "Init environment for deployment user"
|
10
17
|
task :init_deploy_user do
|
11
18
|
set :deploy_user, "#{user}"
|
12
19
|
with_user "#{sudo_user}" do
|
13
20
|
if capture( "#{sudo} cat /etc/passwd | grep #{deploy_user} | wc -l" ).to_i == 0
|
14
21
|
run "#{sudo} addgroup admin"
|
15
|
-
run "#{sudo} useradd
|
22
|
+
run "#{sudo} useradd #{deploy_user} -m -s /bin/bash -g admin"
|
16
23
|
upload "#{Dir.home}/.ssh/id_rsa.pub", "/tmp/id_rsa.pub"
|
17
24
|
run "#{sudo} mkdir -p /home/#{deploy_user}/.ssh"
|
18
25
|
run "echo \"cat /tmp/id_rsa.pub >> /home/#{deploy_user}/.ssh/authorized_keys\" | sudo -s"
|
19
26
|
run "rm /tmp/id_rsa.pub"
|
27
|
+
run "#{sudo} chown -R #{deploy_user}:admin /home/#{deploy_user}"
|
20
28
|
end
|
21
29
|
end
|
22
30
|
end
|
23
31
|
|
24
|
-
desc "
|
25
|
-
task :
|
32
|
+
desc "Installs the necessary OS packages"
|
33
|
+
task :install_packages do
|
34
|
+
with_user "#{sudo_user}" do
|
35
|
+
run "#{sudo} apt-get -y update 1>/dev/null"
|
36
|
+
run "#{sudo} apt-get -y install python-software-properties 1>/dev/null"
|
37
|
+
run "#{sudo} apt-get -y install curl git-core 1>/dev/null"
|
38
|
+
run "#{sudo} apt-get -y install build-essential zlib1g-dev libssl-dev libreadline6-dev libyaml-dev 1>/dev/null"
|
39
|
+
run "#{sudo} apt-get -y install libpam0g-dev checkinstall 1>/dev/null"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Installs up-to-date ruby version from sources"
|
44
|
+
task :install_ruby do
|
45
|
+
version = (defined? ruby_version) ? ruby_version : '1.9.3'
|
46
|
+
patch = (defined? ruby_patch) ? ruby_patch : 'p362'
|
26
47
|
with_user "#{sudo_user}" do
|
27
|
-
if capture( "
|
28
|
-
run
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
48
|
+
if capture( "dpkg --list ruby-#{version}#{patch} 2>&1 | grep 'No packages found' | wc -l" ).to_i == 1
|
49
|
+
run [
|
50
|
+
"wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-#{version}-#{patch}.tar.gz --quiet",
|
51
|
+
"tar -xzf ruby-#{version}-#{patch}.tar.gz",
|
52
|
+
"cd ruby-#{version}-#{patch}/",
|
53
|
+
"./configure --prefix=/usr/local 1>/dev/null",
|
54
|
+
"make 1>/dev/null 2>&1"
|
55
|
+
].join( '&&' )
|
56
|
+
run [
|
57
|
+
"cd ruby-#{version}-#{patch}/",
|
58
|
+
"#{sudo} checkinstall --default --pkgname=ruby-#{version}#{patch} --pkgversion=#{version}#{patch} --nodoc 1>/dev/null 2>&1"
|
59
|
+
].join( '&&' )
|
35
60
|
run "#{sudo} gem install bundler --no-ri --no-rdoc"
|
36
|
-
run "#{sudo} gem install chef ruby-shadow --no-ri --no-rdoc"
|
61
|
+
run "#{sudo} gem install chef ruby-shadow right_aws --no-ri --no-rdoc"
|
37
62
|
run "#{sudo} gem install server_maint --no-ri --no-rdoc"
|
38
63
|
end
|
39
64
|
end
|
40
65
|
end
|
66
|
+
|
67
|
+
desc "Make shared keys and sudo work together"
|
68
|
+
task :pam_ssh_agent_auth do
|
69
|
+
version = (defined? pam_ssh_agent_auth_version) ? pam_ssh_agent_auth : '0.9.4'
|
70
|
+
with_user "#{sudo_user}" do
|
71
|
+
if capture( "dpkg --list pam-ssh-agent-auth-#{version} 2>&1 | grep 'No packages found' | wc -l" ).to_i == 1
|
72
|
+
run [
|
73
|
+
"wget http://downloads.sourceforge.net/project/pamsshagentauth/pam_ssh_agent_auth/v#{version}/pam_ssh_agent_auth-#{version}.tar.bz2 --quiet",
|
74
|
+
"tar -xjf pam_ssh_agent_auth-#{version}.tar.bz2",
|
75
|
+
"cd pam_ssh_agent_auth-#{version}",
|
76
|
+
"./configure --libexecdir=/lib/security --with-mantype=man 1>/dev/null",
|
77
|
+
"make 1>/dev/null 2>&1"
|
78
|
+
].join( '&&' )
|
79
|
+
run [
|
80
|
+
"cd pam_ssh_agent_auth-#{version}",
|
81
|
+
"#{sudo} checkinstall --default --pkgname=pam_ssh_agent_auth-#{version} --nodoc 1>/dev/null 2>&1"
|
82
|
+
].join( '&&' )
|
83
|
+
pam_config = [
|
84
|
+
'#%PAM-1.0',
|
85
|
+
'auth sufficient pam_ssh_agent_auth.so file=%h/.ssh/authorized_keys',
|
86
|
+
'@include common-account',
|
87
|
+
'session required pam_permit.so',
|
88
|
+
'session required pam_limits.so'
|
89
|
+
].join( "\n" )
|
90
|
+
put(
|
91
|
+
pam_config,
|
92
|
+
"/tmp/pam_config"
|
93
|
+
)
|
94
|
+
run "#{sudo} mv /tmp/pam_config /etc/pam.d/sudo"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
41
99
|
before "deploy:setup", "base:setup"
|
42
100
|
end
|
43
101
|
end
|
data/lib/recipes/chef.rb
CHANGED
@@ -4,29 +4,36 @@ Capistrano::Configuration.instance.load do
|
|
4
4
|
namespace :chef do
|
5
5
|
desc "Manages all system dependencies for this application"
|
6
6
|
task :manages, roles: :web do
|
7
|
-
run "mkdir -p /home/#{user}/
|
8
|
-
chef_cookbook_path =
|
7
|
+
run "mkdir -p /home/#{user}/chef/#{application}/log"
|
8
|
+
chef_cookbook_path =
|
9
9
|
capture( %q{ruby -e 'require "server_maint"; puts ServerMaint::get_cookbook_path'} ).chomp
|
10
|
-
app_cookbook_path = "/home/#{user}/
|
10
|
+
app_cookbook_path = "/home/#{user}/chef/#{application}/cookbooks"
|
11
11
|
chef_config = [
|
12
12
|
%Q(cookbook_path ["#{chef_cookbook_path}", File.expand_path("../cookbooks", __FILE__)]),
|
13
13
|
%Q(json_attribs File.expand_path("../node.json", __FILE__))
|
14
14
|
].join( "\n" )
|
15
15
|
put(
|
16
16
|
chef_config,
|
17
|
-
"/home/#{user}/
|
17
|
+
"/home/#{user}/chef/#{application}/solo.rb"
|
18
18
|
)
|
19
|
-
node_config = {
|
20
|
-
|
19
|
+
node_config = {
|
20
|
+
"user" => "#{user}",
|
21
|
+
"application" => "#{application}",
|
22
|
+
"server_name" => "#{host_name}",
|
23
|
+
"run_list" => ["recipe[main]"]
|
24
|
+
}
|
25
|
+
node_config.update( app_node_config ) if defined? app_node_config
|
26
|
+
node_config.update( stage_node_config ) if defined? stage_node_config
|
27
|
+
put node_config.to_json, "/home/#{user}/chef/#{application}/node.json"
|
21
28
|
upload(
|
22
29
|
"#{cookbooks}",
|
23
|
-
"/home/#{user}/
|
30
|
+
"/home/#{user}/chef/#{application}",
|
24
31
|
{:recursive => true, :via => :scp}
|
25
32
|
)
|
26
33
|
run [
|
27
|
-
"chef-solo",
|
28
|
-
"-c /home/#{user}/
|
29
|
-
"-L /home/#{user}/
|
34
|
+
"#{sudo} chef-solo",
|
35
|
+
"-c /home/#{user}/chef/#{application}/solo.rb",
|
36
|
+
"-L /home/#{user}/chef/#{application}/log/chef.log",
|
30
37
|
"1>/dev/null"
|
31
38
|
].join( ' ' )
|
32
39
|
end
|
data/lib/recipes/git.rb
CHANGED
@@ -4,8 +4,12 @@ Capistrano::Configuration.instance.load do
|
|
4
4
|
task :setup, roles: :web do
|
5
5
|
run "mkdir -p /home/deployer/repos/#{application}.git"
|
6
6
|
run "cd /home/deployer/repos/#{application}.git && git --bare init"
|
7
|
-
run_locally "git
|
7
|
+
run_locally "git init"
|
8
|
+
if `git config --get remote.#{remote}.url` == ''
|
9
|
+
run_locally "git remote add #{remote} ssh://#{user}@#{host_name}/home/deployer/repos/#{application}.git"
|
10
|
+
end
|
8
11
|
end
|
12
|
+
|
9
13
|
after "deploy:setup", "git:setup"
|
10
14
|
end
|
11
15
|
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
working_directory "<%= current_path %>"
|
2
|
+
pid "<%= shared_path %>/pids/unicorn.pid"
|
3
|
+
stderr_path "<%= shared_path %>/log/unicorn.log"
|
4
|
+
stdout_path "<%= shared_path %>/log/unicorn.log"
|
5
|
+
|
6
|
+
listen "/tmp/unicorn.<%= application %>.sock"
|
7
|
+
worker_processes <%= unicorn_workers %>
|
8
|
+
timeout 30
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
### BEGIN INIT INFO
|
3
|
+
# Provides: unicorn
|
4
|
+
# Required-Start: $remote_fs $syslog
|
5
|
+
# Required-Stop: $remote_fs $syslog
|
6
|
+
# Default-Start: 2 3 4 5
|
7
|
+
# Default-Stop: 0 1 6
|
8
|
+
# Short-Description: Manage unicorn server
|
9
|
+
# Description: Start, stop, restart unicorn server for a specific application.
|
10
|
+
### END INIT INFO
|
11
|
+
set -e
|
12
|
+
|
13
|
+
# Feel free to change any of the following variables for your app:
|
14
|
+
TIMEOUT=${TIMEOUT-60}
|
15
|
+
APP_ROOT=<%= current_path %>
|
16
|
+
PID=<%= shared_path %>/pids/unicorn.pid
|
17
|
+
CMD="cd <%= current_path %>; bundle exec unicorn -D -c <%= shared_path %>/config/unicorn.rb -E production"
|
18
|
+
AS_USER=<%= user %>
|
19
|
+
set -u
|
20
|
+
|
21
|
+
OLD_PIN="$PID.oldbin"
|
22
|
+
|
23
|
+
sig () {
|
24
|
+
test -s "$PID" && kill -$1 `cat $PID`
|
25
|
+
}
|
26
|
+
|
27
|
+
oldsig () {
|
28
|
+
test -s $OLD_PIN && kill -$1 `cat $OLD_PIN`
|
29
|
+
}
|
30
|
+
|
31
|
+
run () {
|
32
|
+
if [ "$(id -un)" = "$AS_USER" ]; then
|
33
|
+
eval $1
|
34
|
+
else
|
35
|
+
su -c "$1" - $AS_USER
|
36
|
+
fi
|
37
|
+
}
|
38
|
+
|
39
|
+
case "$1" in
|
40
|
+
start)
|
41
|
+
sig 0 && echo >&2 "Already running" && exit 0
|
42
|
+
run "$CMD"
|
43
|
+
;;
|
44
|
+
stop)
|
45
|
+
sig QUIT && exit 0
|
46
|
+
echo >&2 "Not running"
|
47
|
+
;;
|
48
|
+
force-stop)
|
49
|
+
sig TERM && exit 0
|
50
|
+
echo >&2 "Not running"
|
51
|
+
;;
|
52
|
+
restart|reload)
|
53
|
+
sig HUP && echo reloaded OK && exit 0
|
54
|
+
echo >&2 "Couldn't reload, starting '$CMD' instead"
|
55
|
+
run "$CMD"
|
56
|
+
;;
|
57
|
+
upgrade)
|
58
|
+
if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
|
59
|
+
then
|
60
|
+
n=$TIMEOUT
|
61
|
+
while test -s $OLD_PIN && test $n -ge 0
|
62
|
+
do
|
63
|
+
printf '.' && sleep 1 && n=$(( $n - 1 ))
|
64
|
+
done
|
65
|
+
echo
|
66
|
+
|
67
|
+
if test $n -lt 0 && test -s $OLD_PIN
|
68
|
+
then
|
69
|
+
echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds"
|
70
|
+
exit 1
|
71
|
+
fi
|
72
|
+
exit 0
|
73
|
+
fi
|
74
|
+
echo >&2 "Couldn't upgrade, starting '$CMD' instead"
|
75
|
+
run "$CMD"
|
76
|
+
;;
|
77
|
+
reopen-logs)
|
78
|
+
sig USR1
|
79
|
+
;;
|
80
|
+
*)
|
81
|
+
echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
|
82
|
+
exit 1
|
83
|
+
;;
|
84
|
+
esac
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
namespace :unicorn do
|
3
|
+
desc "Setup Unicorn initializer and app configuration"
|
4
|
+
task :setup, roles: :app do
|
5
|
+
run "mkdir -p #{shared_path}/config"
|
6
|
+
template "unicorn.rb.erb", "#{shared_path}/config/unicorn.rb"
|
7
|
+
template "unicorn_init.erb", "/tmp/unicorn_init"
|
8
|
+
run "chmod +x /tmp/unicorn_init"
|
9
|
+
run "#{sudo} mv /tmp/unicorn_init /etc/init.d/unicorn_#{application}"
|
10
|
+
run "#{sudo} update-rc.d -f unicorn_#{application} defaults 1>/dev/null"
|
11
|
+
end
|
12
|
+
after "deploy:setup", "unicorn:setup"
|
13
|
+
|
14
|
+
%w[start stop restart].each do |command|
|
15
|
+
desc "#{command} unicorn"
|
16
|
+
task command, roles: :app do
|
17
|
+
run "service unicorn_#{application} #{command}"
|
18
|
+
end
|
19
|
+
after "deploy:#{command}", "unicorn:#{command}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: app_maint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -89,9 +89,13 @@ files:
|
|
89
89
|
- app_maint.gemspec
|
90
90
|
- lib/app_maint.rb
|
91
91
|
- lib/app_maint/version.rb
|
92
|
+
- lib/recipes/_fix_permissons.rb
|
92
93
|
- lib/recipes/base.rb
|
93
94
|
- lib/recipes/chef.rb
|
94
95
|
- lib/recipes/git.rb
|
96
|
+
- lib/recipes/templates/unicorn.rb.erb
|
97
|
+
- lib/recipes/templates/unicorn_init.erb
|
98
|
+
- lib/recipes/unicorn.rb
|
95
99
|
homepage: http://github.com/fdoebbelin/app_maint
|
96
100
|
licenses: []
|
97
101
|
post_install_message:
|
@@ -106,7 +110,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
110
|
version: '0'
|
107
111
|
segments:
|
108
112
|
- 0
|
109
|
-
hash:
|
113
|
+
hash: -3945106699859961047
|
110
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
115
|
none: false
|
112
116
|
requirements:
|
@@ -115,10 +119,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
119
|
version: '0'
|
116
120
|
segments:
|
117
121
|
- 0
|
118
|
-
hash:
|
122
|
+
hash: -3945106699859961047
|
119
123
|
requirements: []
|
120
124
|
rubyforge_project:
|
121
|
-
rubygems_version: 1.8.
|
125
|
+
rubygems_version: 1.8.24
|
122
126
|
signing_key:
|
123
127
|
specification_version: 3
|
124
128
|
summary: Application maintenance with capistrano
|