]> git.openstreetmap.org Git - chef.git/blob - cookbooks/tile/recipes/default.rb
Lock mail gem to version 2.7.1
[chef.git] / cookbooks / tile / recipes / default.rb
1 #
2 # Cookbook:: tile
3 # Recipe:: default
4 #
5 # Copyright:: 2013, 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 include_recipe "accounts"
21 include_recipe "apache"
22 include_recipe "git"
23 include_recipe "munin"
24 include_recipe "nodejs"
25 include_recipe "postgresql"
26 include_recipe "prometheus"
27 include_recipe "python"
28 include_recipe "ruby"
29 include_recipe "tools"
30
31 blocks = data_bag_item("tile", "blocks")
32 web_passwords = data_bag_item("web", "passwords")
33
34 apache_module "alias"
35 apache_module "cgi"
36 apache_module "expires"
37 apache_module "headers"
38 apache_module "remoteip"
39 apache_module "rewrite"
40
41 apache_module "tile" do
42   conf "tile.conf.erb"
43 end
44
45 apache_conf "renderd" do
46   action :disable
47 end
48
49 ssl_certificate node[:fqdn] do
50   domains [node[:fqdn], "tile.openstreetmap.org", "render.openstreetmap.org"]
51   notifies :reload, "service[apache2]"
52 end
53
54 remote_file "#{Chef::Config[:file_cache_path]}/fastly-ip-list.json" do
55   source "https://api.fastly.com/public-ip-list"
56   compile_time true
57   ignore_failure true
58 end
59
60 fastlyips = JSON.parse(IO.read("#{Chef::Config[:file_cache_path]}/fastly-ip-list.json"))
61
62 apache_site "default" do
63   action :disable
64 end
65
66 apache_site "tileserver_site" do
67   action :disable
68 end
69
70 apache_site "tile.openstreetmap.org" do
71   template "apache.erb"
72   variables :fastly => fastlyips["addresses"]
73 end
74
75 template "/etc/logrotate.d/apache2" do
76   source "logrotate.apache.erb"
77   owner "root"
78   group "root"
79   mode "644"
80 end
81
82 directory "/srv/tile.openstreetmap.org" do
83   owner "tile"
84   group "tile"
85   mode "755"
86 end
87
88 directory "/srv/tile.openstreetmap.org/conf" do
89   owner "tile"
90   group "tile"
91   mode "755"
92 end
93
94 file "/srv/tile.openstreetmap.org/conf/ip.map" do
95   owner "tile"
96   group "adm"
97   mode "644"
98 end
99
100 tile_directories = node[:tile][:styles].collect do |_, style|
101   style[:tile_directories].collect { |directory| directory[:name] }
102 end.flatten.sort.uniq
103
104 package "renderd"
105
106 systemd_service "renderd" do
107   dropin "chef"
108   after "postgresql.service"
109   wants "postgresql.service"
110   limit_nofile 4096
111   sandbox true
112   restrict_address_families "AF_UNIX"
113   read_write_paths tile_directories
114   restart "on-failure"
115 end
116
117 service "renderd" do
118   action [:enable, :start]
119   subscribes :restart, "systemd_service[renderd]"
120 end
121
122 directory "/srv/tile.openstreetmap.org/tiles" do
123   owner "tile"
124   group "tile"
125   mode "755"
126 end
127
128 template "/etc/renderd.conf" do
129   source "renderd.conf.erb"
130   owner "root"
131   group "root"
132   mode "644"
133   notifies :reload, "service[apache2]"
134   notifies :restart, "service[renderd]"
135 end
136
137 remote_directory "/srv/tile.openstreetmap.org/html" do
138   source "html"
139   owner "tile"
140   group "tile"
141   mode "755"
142   files_owner "tile"
143   files_group "tile"
144   files_mode "644"
145 end
146
147 template "/srv/tile.openstreetmap.org/html/index.html" do
148   source "index.html.erb"
149   owner "tile"
150   group "tile"
151   mode "644"
152 end
153
154 package %w[
155   python3-cairo
156   python3-mapnik
157   python3-pyproj
158   python3-setuptools
159 ]
160
161 python_package "pyotp" do
162   python_version "3"
163 end
164
165 directory "/srv/tile.openstreetmap.org/cgi-bin" do
166   owner "tile"
167   group "tile"
168   mode "755"
169 end
170
171 template "/srv/tile.openstreetmap.org/cgi-bin/export" do
172   source "export.erb"
173   owner "tile"
174   group "tile"
175   mode "755"
176   variables :blocks => blocks, :totp_key => web_passwords["totp_key"]
177 end
178
179 template "/srv/tile.openstreetmap.org/cgi-bin/debug" do
180   source "debug.erb"
181   owner "tile"
182   group "tile"
183   mode "755"
184 end
185
186 systemd_service "export-cleanup" do
187   description "Cleanup stale export temporary files"
188   joins_namespace_of "apache2.service"
189   exec_start "find /tmp -ignore_readdir_race -name 'export??????' -mmin +60 -delete"
190   user "www-data"
191   sandbox true
192 end
193
194 systemd_timer "export-cleanup" do
195   description "Cleanup stale export temporary files"
196   on_boot_sec "60m"
197   on_unit_inactive_sec "60m"
198 end
199
200 service "export-cleanup.timer" do
201   action [:enable, :start]
202 end
203
204 directory "/srv/tile.openstreetmap.org/data" do
205   owner "tile"
206   group "tile"
207   mode "755"
208 end
209
210 package %w[
211   mapnik-utils
212   tar
213   unzip
214 ]
215
216 node[:tile][:data].each_value do |data|
217   url = data[:url]
218   file = "/srv/tile.openstreetmap.org/data/#{File.basename(url)}"
219
220   if data[:directory]
221     directory = "/srv/tile.openstreetmap.org/data/#{data[:directory]}"
222
223     directory directory do
224       owner "tile"
225       group "tile"
226       mode "755"
227     end
228   else
229     directory = "/srv/tile.openstreetmap.org/data"
230   end
231
232   if file =~ /\.tgz$/
233     execute file do
234       action :nothing
235       command "tar -zxf #{file} -C #{directory}"
236       user "tile"
237       group "tile"
238     end
239   elsif file =~ /\.tar\.bz2$/
240     execute file do
241       action :nothing
242       command "tar -jxf #{file} -C #{directory}"
243       user "tile"
244       group "tile"
245     end
246   elsif file =~ /\.zip$/
247     execute file do
248       action :nothing
249       command "unzip -qq -o #{file} -d #{directory}"
250       user "tile"
251       group "tile"
252     end
253   end
254
255   execute "#{file}_shapeindex" do
256     action :nothing
257     command "find #{directory} -type f -iname '*.shp' -print0 | xargs -0 --no-run-if-empty shapeindex --shape_files"
258     user "tile"
259     group "tile"
260     subscribes :run, "execute[#{file}]", :immediately
261   end
262
263   remote_file file do
264     if data[:refresh]
265       action :create
266       use_conditional_get true
267       ignore_failure true
268     else
269       action :create_if_missing
270     end
271
272     source url
273     owner "tile"
274     group "tile"
275     mode "644"
276     backup false
277     notifies :run, "execute[#{file}]", :immediately
278     notifies :restart, "service[renderd]"
279   end
280 end
281
282 nodejs_package "carto"
283
284 systemd_service "update-lowzoom@" do
285   description "Low zoom tile update service for %i layer"
286   user "tile"
287   exec_start_pre "+/bin/systemctl stop render-lowzoom.service"
288   exec_start "/bin/bash /usr/local/bin/update-lowzoom-%i"
289   runtime_directory "update-lowzoom-%i"
290   sandbox true
291   restrict_address_families "AF_UNIX"
292   read_write_paths [
293     "/srv/tile.openstreetmap.org/tiles/%i",
294     "/var/log/tile"
295   ]
296   restart "on-failure"
297 end
298
299 directory "/srv/tile.openstreetmap.org/styles" do
300   owner "tile"
301   group "tile"
302   mode "755"
303 end
304
305 node[:tile][:styles].each do |name, details|
306   style_directory = "/srv/tile.openstreetmap.org/styles/#{name}"
307   tile_directory = "/srv/tile.openstreetmap.org/tiles/#{name}"
308
309   template "/usr/local/bin/update-lowzoom-#{name}" do
310     source "update-lowzoom.erb"
311     owner "root"
312     group "root"
313     mode "755"
314     variables :style => name
315   end
316
317   service "update-lowzoom@#{name}" do
318     action :disable
319     supports :restart => true
320   end
321
322   directory tile_directory do
323     owner "tile"
324     group "tile"
325     mode "755"
326   end
327
328   details[:tile_directories].each do |directory|
329     directory directory[:name] do
330       owner "_renderd"
331       group "_renderd"
332       mode "755"
333     end
334
335     directory[:min_zoom].upto(directory[:max_zoom]) do |zoom|
336       directory "#{directory[:name]}/#{zoom}" do
337         owner "_renderd"
338         group "_renderd"
339         mode "755"
340       end
341
342       link "#{tile_directory}/#{zoom}" do
343         to "#{directory[:name]}/#{zoom}"
344         owner "tile"
345         group "tile"
346       end
347     end
348   end
349
350   file "#{tile_directory}/planet-import-complete" do
351     action :create_if_missing
352     owner "tile"
353     group "tile"
354     mode "444"
355   end
356
357   git style_directory do
358     action :sync
359     repository details[:repository]
360     revision details[:revision]
361     user "tile"
362     group "tile"
363   end
364
365   link "#{style_directory}/data" do
366     to "/srv/tile.openstreetmap.org/data"
367     owner "tile"
368     group "tile"
369   end
370
371   if details[:fonts_script]
372     execute details[:fonts_script] do
373       action :nothing
374       command details[:fonts_script]
375       cwd style_directory
376       user "tile"
377       group "tile"
378       subscribes :run, "git[#{style_directory}]"
379     end
380   end
381
382   execute "#{style_directory}/project.mml" do
383     action :nothing
384     command "carto -a 3.0.22 project.mml > project.xml"
385     cwd style_directory
386     user "tile"
387     group "tile"
388     subscribes :run, "git[#{style_directory}]"
389     notifies :restart, "service[renderd]", :immediately
390     notifies :restart, "service[update-lowzoom@#{name}]"
391   end
392 end
393
394 postgresql_version = node[:tile][:database][:cluster].split("/").first
395 postgis_version = node[:tile][:database][:postgis]
396
397 package "postgresql-#{postgresql_version}-postgis-#{postgis_version}"
398
399 postgresql_user "jburgess" do
400   cluster node[:tile][:database][:cluster]
401   superuser true
402 end
403
404 postgresql_user "tomh" do
405   cluster node[:tile][:database][:cluster]
406   superuser true
407 end
408
409 postgresql_user "pnorman" do
410   cluster node[:tile][:database][:cluster]
411   superuser true
412 end
413
414 postgresql_user "tile" do
415   cluster node[:tile][:database][:cluster]
416 end
417
418 postgresql_user "www-data" do
419   cluster node[:tile][:database][:cluster]
420 end
421
422 postgresql_user "_renderd" do
423   cluster node[:tile][:database][:cluster]
424 end
425
426 postgresql_database "gis" do
427   cluster node[:tile][:database][:cluster]
428   owner "tile"
429 end
430
431 postgresql_extension "postgis" do
432   cluster node[:tile][:database][:cluster]
433   database "gis"
434 end
435
436 postgresql_extension "hstore" do
437   cluster node[:tile][:database][:cluster]
438   database "gis"
439   only_if { node[:tile][:database][:hstore] }
440 end
441
442 %w[geography_columns planet_osm_nodes planet_osm_rels planet_osm_ways raster_columns raster_overviews spatial_ref_sys].each do |table|
443   postgresql_table table do
444     cluster node[:tile][:database][:cluster]
445     database "gis"
446     owner "tile"
447     permissions "tile" => :all
448   end
449 end
450
451 %w[geometry_columns planet_osm_line planet_osm_point planet_osm_polygon planet_osm_roads].each do |table|
452   postgresql_table table do
453     cluster node[:tile][:database][:cluster]
454     database "gis"
455     owner "tile"
456     permissions "tile" => :all, "www-data" => :select, "_renderd" => :select
457   end
458 end
459
460 package %w[
461   gdal-bin
462   python3-yaml
463   python3-psycopg2
464 ]
465
466 if node[:tile][:database][:external_data_script]
467   execute node[:tile][:database][:external_data_script] do
468     command "#{node[:tile][:database][:external_data_script]} -R _renderd"
469     cwd "/srv/tile.openstreetmap.org"
470     user "tile"
471     group "tile"
472     ignore_failure true
473   end
474
475   Array(node[:tile][:database][:external_data_tables]).each do |table|
476     postgresql_table table do
477       cluster node[:tile][:database][:cluster]
478       database "gis"
479       owner "tile"
480       permissions "tile" => :all, "www-data" => :select, "_renderd" => :select
481     end
482   end
483 end
484
485 postgresql_munin "gis" do
486   cluster node[:tile][:database][:cluster]
487   database "gis"
488 end
489
490 directory File.dirname(node[:tile][:database][:node_file]) do
491   owner "root"
492   group "root"
493   mode "755"
494   recursive true
495 end
496
497 file node[:tile][:database][:node_file] do
498   owner "tile"
499   group "_renderd"
500   mode "660"
501 end
502
503 directory "/var/log/tile" do
504   owner "tile"
505   group "tile"
506   mode "755"
507 end
508
509 package %w[
510   osm2pgsql
511   osmium-tool
512   pyosmium
513   python3-pyproj
514 ]
515
516 gem_package "apachelogregex" do
517   gem_binary node[:ruby][:gem]
518 end
519
520 gem_package "file-tail" do
521   gem_binary node[:ruby][:gem]
522 end
523
524 gem_package "lru_redux" do
525   gem_binary node[:ruby][:gem]
526 end
527
528 remote_directory "/usr/local/bin" do
529   source "bin"
530   owner "root"
531   group "root"
532   mode "755"
533   files_owner "root"
534   files_group "root"
535   files_mode "755"
536 end
537
538 template "/usr/local/bin/tile-ratelimit" do
539   source "tile-ratelimit.erb"
540   owner "root"
541   group "root"
542   mode "755"
543 end
544
545 systemd_service "tile-ratelimit" do
546   description "Monitor tile requests and enforce rate limits"
547   after "apache2.service"
548   user "tile"
549   group "adm"
550   exec_start "/usr/local/bin/tile-ratelimit"
551   nice 10
552   sandbox true
553   read_write_paths "/srv/tile.openstreetmap.org/conf"
554   restart "on-failure"
555 end
556
557 service "tile-ratelimit" do
558   action [:enable, :start]
559   subscribes :restart, "file[/usr/local/bin/tile-ratelimit]"
560   subscribes :restart, "systemd_service[tile-ratelimit]"
561 end
562
563 template "/usr/local/bin/expire-tiles" do
564   source "expire-tiles.erb"
565   owner "root"
566   group "root"
567   mode "755"
568 end
569
570 directory "/var/lib/replicate" do
571   owner "tile"
572   group "tile"
573   mode "755"
574 end
575
576 directory "/var/lib/replicate/expire-queue" do
577   owner "tile"
578   group "_renderd"
579   mode "775"
580 end
581
582 template "/usr/local/bin/replicate" do
583   source "replicate.erb"
584   owner "root"
585   group "root"
586   mode "755"
587   variables :postgresql_version => postgresql_version.to_f
588 end
589
590 systemd_service "expire-tiles" do
591   description "Tile dirtying service"
592   type "simple"
593   user "_renderd"
594   exec_start "/usr/local/bin/expire-tiles"
595   nice 10
596   standard_output "null"
597   sandbox true
598   read_write_paths tile_directories + [
599     "/store/database/nodes",
600     "/var/lib/replicate/expire-queue",
601     "/var/log/tile"
602   ]
603 end
604
605 systemd_path "expire-tiles" do
606   description "Tile dirtying trigger"
607   directory_not_empty "/var/lib/replicate/expire-queue"
608 end
609
610 service "expire-tiles.path" do
611   action [:enable, :start]
612   subscribes :restart, "systemd_path[expire-tiles]"
613 end
614
615 systemd_service "replicate" do
616   description "Rendering database replication service"
617   after "postgresql.service"
618   wants "postgresql.service"
619   user "tile"
620   exec_start "/usr/local/bin/replicate"
621   sandbox :enable_network => true
622   restrict_address_families "AF_UNIX"
623   read_write_paths [
624     "/store/database/nodes",
625     "/var/lib/replicate",
626     "/var/log/tile"
627   ]
628   restart "on-failure"
629 end
630
631 service "replicate" do
632   action [:enable, :start]
633   subscribes :restart, "template[/usr/local/bin/replicate]"
634   subscribes :restart, "systemd_service[replicate]"
635 end
636
637 template "/etc/logrotate.d/replicate" do
638   source "replicate.logrotate.erb"
639   owner "root"
640   group "root"
641   mode "644"
642 end
643
644 template "/usr/local/bin/render-lowzoom" do
645   source "render-lowzoom.erb"
646   owner "root"
647   group "root"
648   mode "755"
649 end
650
651 systemd_service "render-lowzoom" do
652   description "Render low zoom tiles"
653   condition_path_exists_glob "!/run/update-lowzoom-*"
654   user "tile"
655   exec_start "/usr/local/bin/render-lowzoom"
656   sandbox true
657   restrict_address_families "AF_UNIX"
658   read_write_paths "/var/log/tile"
659 end
660
661 systemd_timer "render-lowzoom" do
662   description "Render low zoom tiles"
663   on_calendar "Fri *-*-* 23:00:00 UTC"
664 end
665
666 service "render-lowzoom.timer" do
667   action [:enable, :start]
668 end
669
670 package "liblockfile-simple-perl"
671 package "libfilesys-df-perl"
672
673 template "/usr/local/bin/cleanup-tiles" do
674   source "cleanup-tiles.erb"
675   owner "root"
676   group "root"
677   mode "755"
678 end
679
680 systemd_service "cleanup-tiles@" do
681   description "Cleanup old tiles for /%I"
682   exec_start "/usr/local/bin/cleanup-tiles /%I"
683   user "_renderd"
684   io_scheduling_class "idle"
685   sandbox true
686   read_write_paths "/%I"
687 end
688
689 systemd_timer "cleanup-tiles@" do
690   description "Cleanup old tiles for /%I"
691   on_boot_sec "30m"
692   on_unit_inactive_sec "60m"
693   randomized_delay_sec "10m"
694 end
695
696 tile_directories.each do |directory|
697   label = directory[1..].gsub("/", "-")
698
699   service "cleanup-tiles@#{label}.timer" do
700     action [:enable, :start]
701   end
702 end
703
704 munin_plugin "mod_tile_fresh"
705 munin_plugin "mod_tile_latency"
706 munin_plugin "mod_tile_response"
707 munin_plugin "mod_tile_zoom"
708
709 munin_plugin "renderd_processed"
710 munin_plugin "renderd_queue"
711 munin_plugin "renderd_queue_time"
712 munin_plugin "renderd_zoom"
713 munin_plugin "renderd_zoom_time"
714
715 munin_plugin "replication_delay"
716
717 package "ruby-webrick"
718
719 prometheus_exporter "modtile" do
720   port 9494
721 end
722
723 prometheus_exporter "renderd" do
724   port 9393
725 end