08af7112be3deab9fa103d5d018cd8ef04a4e901
[chef.git] / cookbooks / dev / recipes / default.rb
1 #
2 # Cookbook Name:: dev
3 # Recipe:: default
4 #
5 # Copyright 2011, OpenStreetMap Foundation
6 #
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
10 #
11 #     http://www.apache.org/licenses/LICENSE-2.0
12 #
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 #
19
20 require "yaml"
21 require "securerandom"
22
23 include_recipe "apache"
24 include_recipe "passenger"
25 include_recipe "git"
26 include_recipe "mysql"
27 include_recipe "nodejs"
28 include_recipe "postgresql"
29
30 package "php"
31 package "php-cgi"
32 package "php-cli"
33 package "php-curl"
34 package "php-db"
35 package "php-fpm"
36 package "php-imagick"
37 package "php-mcrypt"
38 package "php-mysql"
39 package "php-pear"
40 package "php-pgsql"
41 package "php-sqlite3"
42
43 package "pngcrush"
44 package "pngquant"
45
46 package "python"
47 package "python-argparse"
48 package "python-beautifulsoup"
49 package "python-cheetah"
50 package "python-dateutil"
51 package "python-magic"
52 package "python-psycopg2"
53 package "python-gdal"
54
55 nodejs_package "svgo"
56
57 easy_install_package "geojson"
58
59 apache_module "env"
60 apache_module "expires"
61 apache_module "headers"
62 apache_module "proxy"
63 apache_module "proxy_fcgi"
64 apache_module "rewrite"
65 apache_module "suexec"
66 apache_module "userdir"
67 apache_module "wsgi"
68
69 package "apache2-suexec-pristine"
70
71 gem_package "sqlite3"
72
73 gem_package "rails" do
74   version "3.0.9"
75 end
76
77 service "php7.0-fpm" do
78   action [:enable, :start]
79 end
80
81 template "/etc/php/7.0/fpm/pool.d/default.conf" do
82   source "fpm-default.conf.erb"
83   owner "root"
84   group "root"
85   mode 0o644
86   notifies :reload, "service[php7.0-fpm]"
87 end
88
89 file "/etc/php/7.0/fpm/pool.d/www.conf" do
90   action :delete
91   notifies :reload, "service[php7.0-fpm]"
92 end
93
94 package "phppgadmin"
95
96 template "/etc/phppgadmin/config.inc.php" do
97   source "phppgadmin.conf.erb"
98   owner "root"
99   group "root"
100   mode 0o644
101 end
102
103 file "/etc/apache2/conf.d/phppgadmin" do
104   action :delete
105 end
106
107 apache_site "phppgadmin.dev.openstreetmap.org" do
108   template "apache.phppgadmin.erb"
109 end
110
111 search(:accounts, "*:*").each do |account|
112   name = account["id"]
113   details = node[:accounts][:users][name] || {}
114
115   next unless %w(user administrator).include?(details[:status])
116
117   user_home = details[:home] || account["home"] || "#{node[:accounts][:home]}/#{name}"
118
119   next unless File.directory?("#{user_home}/public_html")
120
121   port = 7000 + account["uid"].to_i
122
123   template "/etc/php/7.0/fpm/pool.d/#{name}.conf" do
124     source "fpm.conf.erb"
125     owner "root"
126     group "root"
127     mode 0o644
128     variables :user => name, :port => port
129     notifies :reload, "service[php7.0-fpm]"
130   end
131
132   apache_site "#{name}.dev.openstreetmap.org" do
133     template "apache.user.erb"
134     directory "#{user_home}/public_html"
135     variables :user => name, :port => port
136   end
137
138   template "/etc/sudoers.d/#{name}" do
139     source "sudoers.user.erb"
140     owner "root"
141     group "root"
142     mode 0o440
143     variables :user => name
144   end
145 end
146
147 if node[:postgresql][:clusters][:"9.5/main"]
148   postgresql_user "apis" do
149     cluster "9.5/main"
150   end
151
152   template "/usr/local/bin/cleanup-rails-assets" do
153     cookbook "web"
154     source "cleanup-assets.erb"
155     owner "root"
156     group "root"
157     mode 0o755
158   end
159
160   node[:dev][:rails].each do |name, details|
161     database_name = details[:database] || "apis_#{name}"
162     site_name = "#{name}.apis.dev.openstreetmap.org"
163     rails_directory = "/srv/#{name}.apis.dev.openstreetmap.org"
164
165     if details[:repository]
166       site_aliases = details[:aliases] || []
167       secret_key_base = details[:secret_key_base] || SecureRandom.base64(96)
168
169       node.normal[:dev][:rails][name][:secret_key_base] = secret_key_base
170
171       postgresql_database database_name do
172         cluster "9.5/main"
173         owner "apis"
174       end
175
176       postgresql_extension "#{database_name}_btree_gist" do
177         cluster "9.5/main"
178         database database_name
179         extension "btree_gist"
180       end
181
182       rails_port site_name do
183         ruby node[:passenger][:ruby_version]
184         directory rails_directory
185         user "apis"
186         group "apis"
187         repository details[:repository]
188         revision details[:revision]
189         database_port node[:postgresql][:clusters][:"9.5/main"][:port]
190         database_name database_name
191         database_username "apis"
192         run_migrations true
193       end
194
195       template "#{rails_directory}/config/initializers/setup.rb" do
196         source "rails.setup.rb.erb"
197         owner "apis"
198         group "apis"
199         mode 0o644
200         variables :site => site_name
201         notifies :run, "execute[#{rails_directory}]"
202       end
203
204       ssl_certificate site_name do
205         domains [site_name] + site_aliases
206         notifies :reload, "service[apache2]"
207       end
208
209       apache_site site_name do
210         template "apache.rails.erb"
211         variables :name => site_name, :aliases => site_aliases, :secret_key_base => secret_key_base
212       end
213     else
214       apache_site site_name do
215         action [:delete]
216       end
217
218       directory rails_directory do
219         action :delete
220         recursive true
221       end
222
223       file "/etc/cron.daily/rails-#{site_name.tr('.', '-')}" do
224         action :delete
225       end
226
227       postgresql_database database_name do
228         action :drop
229         cluster "9.5/main"
230       end
231
232       node.normal[:dev][:rails].delete(name)
233     end
234   end
235
236   directory "/srv/apis.dev.openstreetmap.org" do
237     owner "apis"
238     group "apis"
239     mode 0o755
240   end
241
242   template "/srv/apis.dev.openstreetmap.org/index.html" do
243     source "apis.html.erb"
244     owner "apis"
245     group "apis"
246     mode 0o644
247   end
248
249   ssl_certificate "apis.dev.openstreetmap.org" do
250     domains "apis.dev.openstreetmap.org"
251     notifies :reload, "service[apache2]"
252   end
253
254   apache_site "apis.dev.openstreetmap.org" do
255     template "apache.apis.erb"
256   end
257
258   node[:postgresql][:clusters].each_key do |name|
259     postgresql_munin name do
260       cluster name
261       database "ALL"
262     end
263   end
264 end