]> git.openstreetmap.org Git - chef.git/blob - cookbooks/dev/recipes/default.rb
Switch to installing python 3 modules on dev
[chef.git] / cookbooks / dev / recipes / default.rb
1 #
2 # Cookbook:: 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 #     https://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 "geoipupdate"
26 include_recipe "git"
27 include_recipe "memcached"
28 include_recipe "munin"
29 include_recipe "mysql"
30 include_recipe "nodejs"
31 include_recipe "php::fpm"
32 include_recipe "postgresql"
33 include_recipe "python"
34
35 package %w[
36   php-cgi
37   php-cli
38   php-curl
39   php-db
40   php-imagick
41   php-mysql
42   php-pear
43   php-pgsql
44   php-sqlite3
45   pngcrush
46   pngquant
47   python3
48   python3-bs4
49   python3-cheetah
50   python3-dateutil
51   python3-magic
52   python3-psycopg2
53   python3-gdal
54   g++
55   gcc
56   make
57   autoconf
58   automake
59   libtool
60   libfcgi-dev
61   libxml2-dev
62   libmemcached-dev
63   libboost-regex-dev
64   libboost-system-dev
65   libboost-program-options-dev
66   libboost-date-time-dev
67   libboost-filesystem-dev
68   libboost-locale-dev
69   libpqxx-dev
70   libcrypto++-dev
71   libyajl-dev
72   zlib1g-dev
73 ]
74
75 nodejs_package "svgo"
76
77 python_package "geojson" do
78   python_version "3"
79 end
80
81 apache_module "env"
82 apache_module "expires"
83 apache_module "headers"
84 apache_module "proxy"
85 apache_module "proxy_fcgi"
86 apache_module "rewrite"
87 apache_module "suexec"
88 apache_module "userdir"
89 apache_module "wsgi"
90
91 package "apache2-suexec-pristine"
92
93 php_fpm "default" do
94   template "fpm-default.conf.erb"
95 end
96
97 php_fpm "www" do
98   action :delete
99 end
100
101 directory "/srv/dev.openstreetmap.org" do
102   owner "root"
103   group "root"
104   mode 0o755
105 end
106
107 template "/srv/dev.openstreetmap.org/index.html" do
108   source "dev.html.erb"
109   owner "root"
110   group "root"
111   mode 0o644
112 end
113
114 ssl_certificate "dev.openstreetmap.org" do
115   domains "dev.openstreetmap.org"
116   notifies :reload, "service[apache2]"
117 end
118
119 apache_site "dev.openstreetmap.org" do
120   template "apache.dev.erb"
121 end
122
123 package "phppgadmin"
124
125 template "/etc/phppgadmin/config.inc.php" do
126   source "phppgadmin.conf.erb"
127   owner "root"
128   group "root"
129   mode 0o644
130 end
131
132 file "/etc/apache2/conf.d/phppgadmin" do
133   action :delete
134 end
135
136 ssl_certificate "phppgadmin.dev.openstreetmap.org" do
137   domains "phppgadmin.dev.openstreetmap.org"
138   notifies :reload, "service[apache2]"
139 end
140
141 apache_site "phppgadmin.dev.openstreetmap.org" do
142   template "apache.phppgadmin.erb"
143 end
144
145 search(:accounts, "*:*").each do |account|
146   name = account["id"]
147   details = node[:accounts][:users][name] || {}
148
149   next unless %w[user administrator].include?(details[:status])
150
151   user_home = details[:home] || account["home"] || "#{node[:accounts][:home]}/#{name}"
152
153   next unless File.directory?("#{user_home}/public_html")
154
155   port = 7000 + account["uid"].to_i
156
157   php_fpm name do
158     template "fpm.conf.erb"
159     variables :user => name, :port => port
160   end
161
162   ssl_certificate "#{name}.dev.openstreetmap.org" do
163     domains ["#{name}.dev.openstreetmap.org", "#{name}.dev.osm.org"]
164     notifies :reload, "service[apache2]"
165   end
166
167   apache_site "#{name}.dev.openstreetmap.org" do
168     template "apache.user.erb"
169     directory "#{user_home}/public_html"
170     variables :user => name, :port => port
171   end
172
173   template "/etc/sudoers.d/#{name}" do
174     source "sudoers.user.erb"
175     owner "root"
176     group "root"
177     mode 0o440
178     variables :user => name
179   end
180 end
181
182 if node[:postgresql][:clusters][:"12/main"]
183   postgresql_user "apis" do
184     cluster "12/main"
185   end
186
187   template "/usr/local/bin/cleanup-rails-assets" do
188     cookbook "web"
189     source "cleanup-assets.erb"
190     owner "root"
191     group "root"
192     mode 0o755
193   end
194
195   ruby_version = node[:passenger][:ruby_version]
196
197   systemd_service "rails-jobs@" do
198     description "Rails job queue runner"
199     type "simple"
200     user "apis"
201     working_directory "/srv/%i.apis.dev.openstreetmap.org/rails"
202     exec_start "/usr/local/bin/bundle#{ruby_version} exec rake jobs:work"
203     restart "on-failure"
204     private_tmp true
205     private_devices true
206     protect_system "full"
207     protect_home true
208     no_new_privileges true
209   end
210
211   systemd_service "cgimap@" do
212     description "OpenStreetMap API Server"
213     type "forking"
214     environment_file "/etc/default/cgimap-%i"
215     user "apis"
216     exec_start "/srv/%i.apis.dev.openstreetmap.org/cgimap/openstreetmap-cgimap --daemon --port $CGIMAP_PORT --instances 5"
217     exec_reload "/bin/kill -HUP $MAINPID"
218     private_tmp true
219     private_devices true
220     protect_system "full"
221     protect_home true
222     no_new_privileges true
223     restart "on-failure"
224   end
225
226   cgimap_port = 9000
227
228   node[:dev][:rails].each do |name, details|
229     database_name = details[:database] || "apis_#{name}"
230     site_name = "#{name}.apis.dev.openstreetmap.org"
231     site_directory = "/srv/#{name}.apis.dev.openstreetmap.org"
232     log_directory = "#{site_directory}/logs"
233     rails_directory = "#{site_directory}/rails"
234     cgimap_directory = "#{site_directory}/cgimap"
235     gpx_directory = "#{site_directory}/gpx"
236
237     if details[:repository]
238       site_aliases = details[:aliases] || []
239       secret_key_base = details[:secret_key_base] || SecureRandom.base64(96)
240
241       node.normal[:dev][:rails][name][:secret_key_base] = secret_key_base
242
243       postgresql_database database_name do
244         cluster "12/main"
245         owner "apis"
246       end
247
248       postgresql_extension "#{database_name}_btree_gist" do
249         cluster "12/main"
250         database database_name
251         extension "btree_gist"
252       end
253
254       directory site_directory do
255         owner "apis"
256         group "apis"
257         mode 0o755
258       end
259
260       directory log_directory do
261         owner "apis"
262         group "apis"
263         mode 0o755
264       end
265
266       directory gpx_directory do
267         owner "apis"
268         group "apis"
269         mode 0o755
270       end
271
272       directory "#{gpx_directory}/traces" do
273         owner "apis"
274         group "apis"
275         mode 0o755
276       end
277
278       directory "#{gpx_directory}/images" do
279         owner "apis"
280         group "apis"
281         mode 0o755
282       end
283
284       rails_port site_name do
285         ruby ruby_version
286         directory rails_directory
287         user "apis"
288         group "apis"
289         repository details[:repository]
290         revision details[:revision]
291         database_port node[:postgresql][:clusters][:"12/main"][:port]
292         database_name database_name
293         database_username "apis"
294         gpx_dir gpx_directory
295         log_path "#{log_directory}/rails.log"
296         memcache_servers ["127.0.0.1"]
297         csp_enforce true
298         run_migrations true
299         trace_use_job_queue true
300       end
301
302       template "#{rails_directory}/config/initializers/setup.rb" do
303         source "rails.setup.rb.erb"
304         owner "apis"
305         group "apis"
306         mode 0o644
307         variables :site => site_name
308         notifies :restart, "rails_port[#{site_name}]"
309       end
310
311       service "rails-jobs@#{name}" do
312         action [:enable, :start]
313         supports :restart => true
314         subscribes :restart, "rails_port[#{site_name}]"
315         subscribes :restart, "systemd_service[#{name}]"
316         only_if "fgrep -q delayed_job #{rails_directory}/Gemfile.lock"
317       end
318
319       if details[:cgimap_repository]
320         git cgimap_directory do
321           action :sync
322           repository details[:cgimap_repository]
323           revision details[:cgimap_revision]
324           user "apis"
325           group "apis"
326         end
327
328         execute "#{cgimap_directory}/autogen.sh" do
329           action :nothing
330           command "./autogen.sh"
331           cwd cgimap_directory
332           user "apis"
333           group "apis"
334           subscribes :run, "git[#{cgimap_directory}]", :immediate
335         end
336
337         execute "#{cgimap_directory}/configure" do
338           action :nothing
339           command "./configure --with-fcgi=/usr --with-boost-libdir=/usr/lib/x86_64-linux-gnu --enable-yajl"
340           cwd cgimap_directory
341           user "apis"
342           group "apis"
343           subscribes :run, "execute[#{cgimap_directory}/autogen.sh]", :immediate
344         end
345
346         execute "#{cgimap_directory}/Makefile" do
347           action :nothing
348           command "make -j"
349           cwd cgimap_directory
350           user "apis"
351           group "apis"
352           subscribes :run, "execute[#{cgimap_directory}/configure]", :immediate
353           notifies :restart, "service[cgimap@#{name}]"
354         end
355
356         template "/etc/default/cgimap-#{name}" do
357           source "cgimap.environment.erb"
358           owner "root"
359           group "root"
360           mode 0o640
361           variables :cgimap_port => cgimap_port,
362                     :database_port => node[:postgresql][:clusters][:"12/main"][:port],
363                     :database_name => database_name,
364                     :log_directory => log_directory
365           notifies :restart, "service[cgimap@#{name}]"
366         end
367
368         service "cgimap@#{name}" do
369           action [:start, :enable]
370         end
371       end
372
373       ssl_certificate site_name do
374         domains [site_name] + site_aliases
375         notifies :reload, "service[apache2]"
376       end
377
378       apache_site site_name do
379         template "apache.rails.erb"
380         variables :application_name => name,
381                   :aliases => site_aliases,
382                   :secret_key_base => secret_key_base,
383                   :cgimap_enabled => details.key?(:cgimap_repository),
384                   :cgimap_port => cgimap_port
385       end
386
387       template "/etc/logrotate.d/apis-#{name}" do
388         source "logrotate.apis.erb"
389         owner "root"
390         group "root"
391         mode 0o644
392         variables :name => name,
393                   :log_directory => log_directory,
394                   :rails_directory => rails_directory
395       end
396
397       cgimap_port += 1
398     else
399       file "/etc/logrotate.d/apis-#{name}" do
400         action :delete
401       end
402
403       apache_site site_name do
404         action [:delete]
405       end
406
407       service "cgimap@#{name}" do
408         action [:stop, :disable]
409       end
410
411       file "/etc/default/cgimap-#{name}" do
412         action :delete
413       end
414
415       directory site_directory do
416         action :delete
417         recursive true
418       end
419
420       file "/etc/cron.daily/rails-#{site_name.tr('.', '-')}" do
421         action :delete
422       end
423
424       postgresql_database database_name do
425         action :drop
426         cluster "12/main"
427       end
428
429       node.normal[:dev][:rails].delete(name)
430     end
431   end
432
433   directory "/srv/apis.dev.openstreetmap.org" do
434     owner "apis"
435     group "apis"
436     mode 0o755
437   end
438
439   template "/srv/apis.dev.openstreetmap.org/index.html" do
440     source "apis.html.erb"
441     owner "apis"
442     group "apis"
443     mode 0o644
444   end
445
446   ssl_certificate "apis.dev.openstreetmap.org" do
447     domains "apis.dev.openstreetmap.org"
448     notifies :reload, "service[apache2]"
449   end
450
451   apache_site "apis.dev.openstreetmap.org" do
452     template "apache.apis.erb"
453   end
454
455   node[:postgresql][:clusters].each_key do |name|
456     postgresql_munin name do
457       cluster name
458       database "ALL"
459     end
460   end
461 end
462
463 directory "/srv/ooc.openstreetmap.org" do
464   owner "root"
465   group "root"
466   mode 0o755
467 end
468
469 remote_directory "/srv/ooc.openstreetmap.org/html" do
470   source "ooc"
471   owner "root"
472   group "root"
473   mode 0o755
474   files_owner "root"
475   files_group "root"
476   files_mode 0o644
477 end
478
479 ssl_certificate "ooc.openstreetmap.org" do
480   domains ["ooc.openstreetmap.org",
481            "a.ooc.openstreetmap.org",
482            "b.ooc.openstreetmap.org",
483            "c.ooc.openstreetmap.org"]
484   notifies :reload, "service[apache2]"
485 end
486
487 apache_site "ooc.openstreetmap.org" do
488   template "apache.ooc.erb"
489 end