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