public
Description: master respository for deprec - deployment recipes for capistrano
Homepage: http://www.deprec.org/
Clone URL: git://github.com/mbailey/deprec.git
deprec / lib / deprec / recipes / mongrel.rb
100644 220 lines (176 sloc) 7.1 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# Copyright 2006-2008 by Mike Bailey. All rights reserved.
Capistrano::Configuration.instance(:must_exist).load do
  
  namespace :deprec do
    namespace :mongrel do
        
      set :mongrel_servers, 2
      set :mongrel_port, 8000
      set :mongrel_address, "127.0.0.1"
      set(:mongrel_environment) { rails_env }
      set(:mongrel_log_dir) { "#{deploy_to}/shared/log" }
      set(:mongrel_pid_dir) { "#{deploy_to}/shared/pids" }
      set :mongrel_conf_dir, '/etc/mongrel_cluster'
      set(:mongrel_conf) { "/etc/mongrel_cluster/#{application}.yml" }
      set :mongrel_user_prefix, 'mongrel_'
      set(:mongrel_user) { mongrel_user_prefix + application }
      set :mongrel_group_prefix, 'app_'
      set(:mongrel_group) { mongrel_group_prefix + application }
 
      
      # Install
      
      desc "Install mongrel"
      task :install, :roles => :app do
        gem2.install 'mongrel'
        gem2.install 'mongrel_cluster'
        gem2.install 'swiftiply'
        symlink_mongrel_rails
        SYSTEM_CONFIG_FILES[:mongrel].each do |file|
          deprec2.render_template(:mongrel, file.merge(:remote=>true))
        end
        activate_system
      end
      
      task :symlink_mongrel_rails, :roles => :app do
        sudo "ln -sf /usr/local/bin/mongrel_rails /usr/bin/mongrel_rails"
      end
      
      task :symlink_logrotate_config, :roles => :app do
        sudo "ln -sf #{deploy_to}/mongrel/logrotate.conf /etc/logrotate.d/mongrel-#{application}"
      end
    
      # Configure
      
      SYSTEM_CONFIG_FILES[:mongrel] = [
 
        {:template => 'mongrel_cluster-init-script',
         :path => '/etc/init.d/mongrel_cluster',
         :mode => 0755,
         :owner => 'root:root'}
      
      ]
        
      PROJECT_CONFIG_FILES[:mongrel] = [
 
        {:template => 'mongrel_cluster.yml.erb',
         :path => 'cluster.yml',
         :mode => 0644,
         :owner => 'root:root'},
 
        {:template => 'monit.conf.erb',
         :path => "monit.conf",
         :mode => 0600,
         :owner => 'root:root'},
         
        {:template => 'logrotate.conf.erb',
         :path => "logrotate.conf",
         :mode => 0644,
         :owner => 'root:root'}
      
      ]
       
      desc "Generate configuration file(s) for mongrel from template(s)"
      task :config_gen do
        config_gen_system
        config_gen_project
      end
      
      task :config_gen_system do
        SYSTEM_CONFIG_FILES[:mongrel].each do |file|
          deprec2.render_template(:mongrel, file)
        end
      end
      
      task :config_gen_project do
        PROJECT_CONFIG_FILES[:mongrel].each do |file|
          deprec2.render_template(:mongrel, file)
        end
      end
      
      desc 'Deploy configuration files(s) for mongrel'
      task :config, :roles => :app do
        config_system
        config_project
      end
      
      task :config_system, :roles => :app do
        deprec2.push_configs(:mongrel, SYSTEM_CONFIG_FILES[:mongrel])
      end
      
      task :config_project, :roles => :app do
        create_mongrel_user_and_group
        deprec2.push_configs(:mongrel, PROJECT_CONFIG_FILES[:mongrel])
        symlink_mongrel_cluster
        symlink_monit_config
        symlink_logrotate_config
      end
      
      task :symlink_monit_config, :roles => :app do
        deprec2.mkdir(monit_confd_dir, :via => :sudo)
        sudo "ln -sf #{deploy_to}/mongrel/monit.conf #{monit_confd_dir}/mongrel_#{application}.conf"
      end
      
      task :unlink_monit_config, :roles => :app do
        sudo "test -L #{monit_confd_dir}/mongrel_#{application}.conf && unlink #{monit_confd_dir}/mongrel_#{application}.conf"
      end
      
      task :symlink_mongrel_cluster, :roles => :app do
        deprec2.mkdir(mongrel_conf_dir, :via => :sudo)
        sudo "ln -sf #{deploy_to}/mongrel/cluster.yml #{mongrel_conf}"
      end
      
      task :unlink_mongrel_cluster, :roles => :app do
        sudo "test -L #{mongrel_conf} && unlink #{mongrel_conf}"
      end
      
      
      # Control
      
      desc "Start application server."
      task :start, :roles => :app do
        send(run_method, "mongrel_rails cluster::start --clean -C #{mongrel_conf}")
      end
      
      desc "Stop application server."
      task :stop, :roles => :app do
        send(run_method, "mongrel_rails cluster::stop -C #{mongrel_conf}")
      end
      
      desc "Restart application server."
      task :restart, :roles => :app do
        send(run_method, "mongrel_rails cluster::restart --clean -C #{mongrel_conf}")
      end
      
      task :activate do
        activate_system
        activate_project
      end
      
      task :activate_system do
        send(run_method, "update-rc.d mongrel_cluster defaults")
      end
      
      task :activate_project do
        symlink_mongrel_cluster
        symlink_monit_config
      end
      
      task :deactivate, :roles => :app do
        puts
        puts "******************************************************************"
        puts
        puts "Danger!"
        puts
        puts "Do you want to deactivate just this project or all mongrel"
        puts "clusters on this server? Try a more granular command:"
        puts
        puts "cap deprec:mongrel:deactivate_system # disable all clusters"
        puts "cap deprec:mongrel:deactivate_project # disable only this project"
        puts
        puts "******************************************************************"
        puts
      end
      
      task :deactivate_system, :roles => :app do
        send(run_method, "update-rc.d -f mongrel_cluster remove")
      end
      
      task :deactivate_project, :roles => :app do
        unlink_mongrel_cluster
        unlink_monit_config
        restart
      end
      
      task :backup, :roles => :app do
      end
      
      task :restore, :roles => :app do
      end
      
      desc "create user and group for mongel to run as"
      task :create_mongrel_user_and_group, :roles => :app do
        deprec2.groupadd(mongrel_group)
        deprec2.useradd(mongrel_user, :group => mongrel_group, :homedir => false)
        # Set the primary group for the mongrel user (in case user already existed
        # when previous command was run)
        sudo "usermod --gid #{mongrel_group} #{mongrel_user}"
      end
      
      desc "set group ownership and permissions on dirs mongrel needs to write to"
      task :set_perms_for_mongrel_dirs, :roles => :app do
        tmp_dir = "#{deploy_to}/current/tmp"
        shared_dir = "#{deploy_to}/shared"
        files = ["#{mongrel_log_dir}/mongrel.log", "#{mongrel_log_dir}/#{rails_env}.log"]
 
        sudo "chgrp -R #{mongrel_group} #{tmp_dir} #{shared_dir}"
        sudo "chmod -R g+w #{tmp_dir} #{shared_dir}"
        # set owner and group of log files
        files.each { |file|
          sudo "touch #{file}"
          sudo "chown #{mongrel_user} #{file}"
          sudo "chgrp #{mongrel_group} #{file}"
          sudo "chmod g+w #{file}"
        }
      end
      
    end
  end
end