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