]> git.openstreetmap.org Git - chef.git/blob - cookbooks/dev/recipes/default.rb
0ee0697d12a91cedba2f7cb5ee89ba8ba7dba94e
[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 include_recipe "ruby"
35
36 package %w[
37   ant
38   default-jdk-headless
39   default-jre-headless
40   golang
41   composer
42   php-apcu
43   php-cgi
44   php-cli
45   php-curl
46   php-db
47   php-gd
48   php-igbinary
49   php-imagick
50   php-intl
51   php-mbstring
52   php-memcache
53   php-mysql
54   php-pear
55   php-pgsql
56   php-sqlite3
57   php-xml
58   pngcrush
59   pngquant
60   python-is-python3
61   python3
62   python3-brotli
63   python3-bs4
64   python3-cheetah
65   python3-dateutil
66   python3-dev
67   python3-dotenv
68   python3-lxml
69   python3-lz4
70   python3-magic
71   python3-pil
72   python3-psycopg2
73   python3-venv
74   python3-pyproj
75   python3-gdal
76   gdal-bin
77   proj-bin
78   g++
79   gcc
80   make
81   autoconf
82   automake
83   libtool
84   libargon2-dev
85   libfcgi-dev
86   libxml2-dev
87   libmemcached-dev
88   libboost-dev
89   libboost-regex-dev
90   libboost-system-dev
91   libboost-program-options-dev
92   libboost-date-time-dev
93   libboost-filesystem-dev
94   libboost-locale-dev
95   libpqxx-dev
96   libcrypto++-dev
97   libyajl-dev
98   libfmt-dev
99   zlib1g-dev
100   nano
101   osm2pgsql
102   osmosis
103   at
104   awscli
105   mailutils
106   lua-any
107   luajit
108   fonts-dejavu
109   fonts-dejavu-core
110   fonts-dejavu-extra
111   fonts-droid-fallback
112   fonts-liberation
113   fonts-noto-mono
114   gnuplot-nox
115   graphviz
116   irssi
117   jq
118   lz4
119   lzip
120   lzop
121   pbzip2
122   pigz
123   unrar
124   unzip
125   zip
126   netcat
127   tmux
128   whois
129   redis
130   r-base
131   pandoc
132   aria2
133 ]
134
135 # Add uk_os_OSTN15_NTv2_OSGBtoETRS.tif used for reprojecting OS data
136 execute "uk_os_OSTN15_NTv2_OSGBtoETRS.tif" do
137   command "projsync --file uk_os_OSTN15_NTv2_OSGBtoETRS.tif --system-directory"
138   not_if { ::File.exist?("/usr/share/proj/uk_os_OSTN15_NTv2_OSGBtoETRS.tif") }
139 end
140
141 nodejs_package "svgo"
142
143 python_package "geojson" do
144   python_version "3"
145 end
146
147 apache_module "env"
148 apache_module "expires"
149 apache_module "headers"
150 apache_module "proxy"
151 apache_module "proxy_fcgi"
152 apache_module "rewrite"
153 apache_module "suexec"
154 apache_module "userdir"
155
156 apache_module "wsgi" do
157   package "libapache2-mod-wsgi-py3"
158 end
159
160 package "apache2-suexec-pristine"
161
162 php_fpm "default" do
163   pm_max_children 10
164   pm_start_servers 4
165   pm_min_spare_servers 2
166   pm_max_spare_servers 6
167 end
168
169 php_fpm "www" do
170   action :delete
171 end
172
173 directory "/srv/dev.openstreetmap.org" do
174   owner "root"
175   group "root"
176   mode "755"
177 end
178
179 template "/srv/dev.openstreetmap.org/index.html" do
180   source "dev.html.erb"
181   owner "root"
182   group "root"
183   mode "644"
184 end
185
186 ssl_certificate "dev.openstreetmap.org" do
187   domains "dev.openstreetmap.org"
188   notifies :reload, "service[apache2]"
189 end
190
191 apache_site "dev.openstreetmap.org" do
192   template "apache.dev.erb"
193 end
194
195 package "phppgadmin"
196
197 template "/etc/phppgadmin/config.inc.php" do
198   source "phppgadmin.conf.erb"
199   owner "root"
200   group "root"
201   mode "644"
202 end
203
204 file "/etc/apache2/conf.d/phppgadmin" do
205   action :delete
206 end
207
208 ssl_certificate "phppgadmin.dev.openstreetmap.org" do
209   domains "phppgadmin.dev.openstreetmap.org"
210   notifies :reload, "service[apache2]"
211 end
212
213 apache_site "phppgadmin.dev.openstreetmap.org" do
214   template "apache.phppgadmin.erb"
215 end
216
217 search(:accounts, "*:*").each do |account|
218   name = account["id"]
219   details = node[:accounts][:users][name] || {}
220
221   next unless %w[user administrator].include?(details[:status])
222
223   user_home = details[:home] || account["home"] || "#{node[:accounts][:home]}/#{name}"
224
225   next unless File.directory?("#{user_home}/public_html")
226
227   php_fpm name do
228     user name
229     group name
230     pm_max_children 10
231     pm_start_servers 4
232     pm_min_spare_servers 2
233     pm_max_spare_servers 6
234     pm_max_requests 10000
235     request_terminate_timeout 1800
236     environment "HOSTNAME" => "$HOSTNAME",
237                 "PATH" => "/usr/local/bin:/usr/bin:/bin",
238                 "TMP" => "/tmp",
239                 "TMPDIR" => "/tmp",
240                 "TEMP" => "/tmp"
241     php_values "max_execution_time" => "300",
242                "memory_limit" => "128M",
243                "post_max_size" => "32M",
244                "upload_max_filesize" => "32M"
245     php_admin_values "sendmail_path" => "/usr/sbin/sendmail -t -i -f #{name}@dev.openstreetmap.org",
246                      "open_basedir" => "/home/#{name}/:/tmp/:/usr/share/php/"
247     php_flags "display_errors" => "on"
248   end
249
250   ssl_certificate "#{name}.dev.openstreetmap.org" do
251     domains ["#{name}.dev.openstreetmap.org", "#{name}.dev.osm.org"]
252     notifies :reload, "service[apache2]"
253   end
254
255   apache_site "#{name}.dev.openstreetmap.org" do
256     template "apache.user.erb"
257     directory "#{user_home}/public_html"
258     variables :user => name
259   end
260
261   template "/etc/sudoers.d/#{name}" do
262     source "sudoers.user.erb"
263     owner "root"
264     group "root"
265     mode "440"
266     variables :user => name
267   end
268 end
269
270 node[:postgresql][:versions].each do |version|
271   package "postgresql-#{version}-postgis-3"
272 end
273
274 if node[:postgresql][:clusters][:"15/main"]
275   postgresql_user "apis" do
276     cluster "15/main"
277   end
278
279   template "/usr/local/bin/cleanup-rails-assets" do
280     cookbook "web"
281     source "cleanup-assets.erb"
282     owner "root"
283     group "root"
284     mode "755"
285   end
286
287   systemd_service "rails-jobs@" do
288     description "Rails job queue runner"
289     type "simple"
290     environment "RAILS_ENV" => "production", "SLEEP_DELAY" => "60"
291     user "apis"
292     working_directory "/srv/%i.apis.dev.openstreetmap.org/rails"
293     exec_start "#{node[:ruby][:bundle]} exec rails jobs:work"
294     restart "on-failure"
295     nice 10
296     sandbox :enable_network => true
297     restrict_address_families "AF_UNIX"
298     memory_deny_write_execute false
299     read_write_paths "/srv/%i.apis.dev.openstreetmap.org/logs"
300   end
301
302   systemd_service "cgimap@" do
303     description "OpenStreetMap API Server"
304     type "forking"
305     environment_file "/etc/default/cgimap-%i"
306     user "apis"
307     exec_start "/srv/%i.apis.dev.openstreetmap.org/cgimap/openstreetmap-cgimap --daemon --port $CGIMAP_PORT --instances 5"
308     exec_reload "/bin/kill -HUP $MAINPID"
309     sandbox :enable_network => true
310     restrict_address_families "AF_UNIX"
311     read_write_paths ["/srv/%i.apis.dev.openstreetmap.org/logs", "/srv/%i.apis.dev.openstreetmap.org/rails/tmp"]
312     restart "on-failure"
313   end
314
315   cgimap_port = 9000
316
317   Dir.glob("/srv/*.apis.dev.openstreetmap.org").each do |dir|
318     node.default_unless[:dev][:rails][File.basename(dir).split(".").first] = {}
319   end
320
321   node[:dev][:rails].each do |name, details|
322     database_name = details[:database] || "apis_#{name}"
323     site_name = "#{name}.apis.dev.openstreetmap.org"
324     site_directory = "/srv/#{name}.apis.dev.openstreetmap.org"
325     log_directory = "#{site_directory}/logs"
326     rails_directory = "#{site_directory}/rails"
327     cgimap_directory = "#{site_directory}/cgimap"
328     gpx_directory = "#{site_directory}/gpx"
329
330     if details[:repository]
331       site_aliases = details[:aliases] || []
332       secret_key_base = persistent_token("dev", "rails", name, "secret_key_base")
333
334       postgresql_database database_name do
335         cluster "15/main"
336         owner "apis"
337       end
338
339       postgresql_extension "#{database_name}_btree_gist" do
340         cluster "15/main"
341         database database_name
342         extension "btree_gist"
343       end
344
345       directory site_directory do
346         owner "apis"
347         group "apis"
348         mode "755"
349       end
350
351       directory log_directory do
352         owner "apis"
353         group "apis"
354         mode "755"
355       end
356
357       directory gpx_directory do
358         owner "apis"
359         group "apis"
360         mode "755"
361       end
362
363       directory "#{gpx_directory}/traces" do
364         owner "apis"
365         group "apis"
366         mode "755"
367       end
368
369       directory "#{gpx_directory}/images" do
370         owner "apis"
371         group "apis"
372         mode "755"
373       end
374
375       rails_port site_name do
376         directory rails_directory
377         user "apis"
378         group "apis"
379         repository details[:repository]
380         revision details[:revision]
381         database_port node[:postgresql][:clusters][:"15/main"][:port]
382         database_name database_name
383         database_username "apis"
384         email_from "OpenStreetMap <web@noreply.openstreetmap.org>"
385         gpx_dir gpx_directory
386         log_path "#{log_directory}/rails.log"
387         memcache_servers ["127.0.0.1"]
388         csp_enforce true
389         run_migrations true
390         trace_use_job_queue true
391       end
392
393       template "#{rails_directory}/config/initializers/setup.rb" do
394         source "rails.setup.rb.erb"
395         owner "apis"
396         group "apis"
397         mode "644"
398         variables :site => site_name
399         notifies :restart, "rails_port[#{site_name}]"
400       end
401
402       service "rails-jobs@#{name}" do
403         action [:enable, :start]
404         supports :restart => true
405         subscribes :restart, "rails_port[#{site_name}]"
406         subscribes :restart, "systemd_service[rails-jobs@]"
407         only_if "fgrep -q delayed_job #{rails_directory}/Gemfile.lock"
408       end
409
410       if details[:cgimap_repository]
411         git cgimap_directory do
412           action :sync
413           repository details[:cgimap_repository]
414           revision details[:cgimap_revision]
415           user "apis"
416           group "apis"
417         end
418
419         execute "#{cgimap_directory}/autogen.sh" do
420           action :nothing
421           command "./autogen.sh"
422           cwd cgimap_directory
423           user "apis"
424           group "apis"
425           subscribes :run, "git[#{cgimap_directory}]", :immediately
426         end
427
428         execute "#{cgimap_directory}/configure" do
429           action :nothing
430           command "./configure --with-fcgi=/usr --with-boost-libdir=/usr/lib/x86_64-linux-gnu --enable-yajl"
431           cwd cgimap_directory
432           user "apis"
433           group "apis"
434           subscribes :run, "execute[#{cgimap_directory}/autogen.sh]", :immediately
435         end
436
437         execute "#{cgimap_directory}/Makefile" do
438           action :nothing
439           command "make -j"
440           cwd cgimap_directory
441           user "apis"
442           group "apis"
443           subscribes :run, "execute[#{cgimap_directory}/configure]", :immediately
444         end
445
446         template "/etc/default/cgimap-#{name}" do
447           source "cgimap.environment.erb"
448           owner "root"
449           group "root"
450           mode "640"
451           variables :cgimap_port => cgimap_port,
452                     :database_port => node[:postgresql][:clusters][:"15/main"][:port],
453                     :database_name => database_name,
454                     :log_directory => log_directory
455         end
456
457         service "cgimap@#{name}" do
458           action [:start, :enable]
459           subscribes :restart, "execute[#{cgimap_directory}/Makefile]"
460           subscribes :restart, "template[/etc/default/cgimap-#{name}]"
461           subscribes :restart, "systemd_service[cgimap@]"
462         end
463       end
464
465       ssl_certificate site_name do
466         domains [site_name] + site_aliases
467         notifies :reload, "service[apache2]"
468       end
469
470       apache_site site_name do
471         template "apache.rails.erb"
472         variables :application_name => name,
473                   :aliases => site_aliases,
474                   :secret_key_base => secret_key_base,
475                   :cgimap_enabled => details.key?(:cgimap_repository),
476                   :cgimap_port => cgimap_port
477       end
478
479       template "/etc/logrotate.d/apis-#{name}" do
480         source "logrotate.apis.erb"
481         owner "root"
482         group "root"
483         mode "644"
484         variables :name => name,
485                   :log_directory => log_directory,
486                   :rails_directory => rails_directory
487       end
488
489       cgimap_port += 1
490     else
491       file "/etc/logrotate.d/apis-#{name}" do
492         action :delete
493       end
494
495       apache_site site_name do
496         action [:delete]
497       end
498
499       service "cgimap@#{name}" do
500         action [:stop, :disable]
501       end
502
503       file "/etc/default/cgimap-#{name}" do
504         action :delete
505       end
506
507       service "rails-jobs@#{name}" do
508         action [:stop, :disable]
509       end
510
511       directory site_directory do
512         action :delete
513         recursive true
514       end
515
516       file "/etc/cron.daily/rails-#{site_name.tr('.', '-')}" do
517         action :delete
518       end
519
520       postgresql_database database_name do
521         action :drop
522         cluster "15/main"
523       end
524     end
525   end
526
527   directory "/srv/apis.dev.openstreetmap.org" do
528     owner "apis"
529     group "apis"
530     mode "755"
531   end
532
533   template "/srv/apis.dev.openstreetmap.org/index.html" do
534     source "apis.html.erb"
535     owner "apis"
536     group "apis"
537     mode "644"
538   end
539
540   ssl_certificate "apis.dev.openstreetmap.org" do
541     domains "apis.dev.openstreetmap.org"
542     notifies :reload, "service[apache2]"
543   end
544
545   apache_site "apis.dev.openstreetmap.org" do
546     template "apache.apis.erb"
547   end
548
549   node[:postgresql][:clusters].each_key do |name|
550     postgresql_munin name do
551       cluster name
552       database "ALL"
553     end
554   end
555 end
556
557 directory "/srv/ooc.openstreetmap.org" do
558   owner "root"
559   group "root"
560   mode "755"
561 end
562
563 remote_directory "/srv/ooc.openstreetmap.org/html" do
564   source "ooc"
565   owner "root"
566   group "root"
567   mode "755"
568   files_owner "root"
569   files_group "root"
570   files_mode "644"
571 end
572
573 ssl_certificate "ooc.openstreetmap.org" do
574   domains ["ooc.openstreetmap.org",
575            "a.ooc.openstreetmap.org",
576            "b.ooc.openstreetmap.org",
577            "c.ooc.openstreetmap.org"]
578   notifies :reload, "service[apache2]"
579 end
580
581 apache_site "ooc.openstreetmap.org" do
582   template "apache.ooc.erb"
583 end