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