]> git.openstreetmap.org Git - chef.git/blob - cookbooks/tile/recipes/default.rb
Merge remote-tracking branch 'github/pull/378'
[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 "tools"
29
30 blocks = data_bag_item("tile", "blocks")
31 web_passwords = data_bag_item("web", "passwords")
32
33 apache_module "alias"
34 apache_module "cgi"
35 apache_module "expires"
36 apache_module "headers"
37 apache_module "remoteip"
38 apache_module "rewrite"
39
40 apache_module "tile" do
41   conf "tile.conf.erb"
42 end
43
44 ssl_certificate node[:fqdn] do
45   domains [node[:fqdn], "tile.openstreetmap.org", "render.openstreetmap.org"]
46   notifies :reload, "service[apache2]"
47 end
48
49 remote_file "#{Chef::Config[:file_cache_path]}/fastly-ip-list.json" do
50   source "https://api.fastly.com/public-ip-list"
51   compile_time true
52 end
53
54 tilecaches = search(:node, "roles:tilecache").sort_by { |n| n[:hostname] }
55 fastlyips = JSON.parse(IO.read("#{Chef::Config[:file_cache_path]}/fastly-ip-list.json"))
56
57 apache_site "default" do
58   action [:disable]
59 end
60
61 apache_site "tile.openstreetmap.org" do
62   template "apache.erb"
63   variables :caches => tilecaches, :fastly => fastlyips["addresses"]
64 end
65
66 template "/etc/logrotate.d/apache2" do
67   source "logrotate.apache.erb"
68   owner "root"
69   group "root"
70   mode "644"
71 end
72
73 directory "/srv/tile.openstreetmap.org" do
74   owner "tile"
75   group "tile"
76   mode "755"
77 end
78
79 package "renderd"
80
81 systemd_service "renderd" do
82   description "Mapnik rendering daemon"
83   after "postgresql.service"
84   wants "postgresql.service"
85   user "www-data"
86   exec_start "/usr/bin/renderd -f"
87   runtime_directory "renderd"
88   standard_error "null"
89   limit_nofile 4096
90   private_tmp true
91   private_devices true
92   private_network true
93   protect_system "full"
94   protect_home true
95   no_new_privileges true
96   restart "on-failure"
97 end
98
99 service "renderd" do
100   action [:enable, :start]
101   subscribes :restart, "systemd_service[renderd]"
102 end
103
104 directory "/srv/tile.openstreetmap.org/tiles" do
105   owner "tile"
106   group "tile"
107   mode "755"
108 end
109
110 template "/etc/renderd.conf" do
111   source "renderd.conf.erb"
112   owner "root"
113   group "root"
114   mode "644"
115   notifies :reload, "service[apache2]"
116   notifies :restart, "service[renderd]"
117 end
118
119 remote_directory "/srv/tile.openstreetmap.org/html" do
120   source "html"
121   owner "tile"
122   group "tile"
123   mode "755"
124   files_owner "tile"
125   files_group "tile"
126   files_mode "644"
127 end
128
129 template "/srv/tile.openstreetmap.org/html/index.html" do
130   source "index.html.erb"
131   owner "tile"
132   group "tile"
133   mode "644"
134 end
135
136 package %w[
137   python3-cairo
138   python3-mapnik
139   python3-setuptools
140 ]
141
142 python_package "pyotp" do
143   python_version "3"
144 end
145
146 package %w[
147   fonts-noto-cjk
148   fonts-noto-hinted
149   fonts-noto-unhinted
150   fonts-hanazono
151   ttf-unifont
152 ]
153
154 ["NotoSansArabicUI-Regular.ttf", "NotoSansArabicUI-Bold.ttf"].each do |font|
155   remote_file "/usr/share/fonts/truetype/noto/#{font}" do
156     action :create_if_missing
157     source "https://github.com/googlei18n/noto-fonts/raw/master/hinted/#{font}"
158     owner "root"
159     group "root"
160     mode "644"
161   end
162 end
163
164 directory "/srv/tile.openstreetmap.org/cgi-bin" do
165   owner "tile"
166   group "tile"
167   mode "755"
168 end
169
170 template "/srv/tile.openstreetmap.org/cgi-bin/export" do
171   source "export.erb"
172   owner "tile"
173   group "tile"
174   mode "755"
175   variables :blocks => blocks, :totp_key => web_passwords["totp_key"]
176 end
177
178 template "/srv/tile.openstreetmap.org/cgi-bin/debug" do
179   source "debug.erb"
180   owner "tile"
181   group "tile"
182   mode "755"
183 end
184
185 template "/etc/cron.hourly/export" do
186   source "export.cron.erb"
187   owner "root"
188   group "root"
189   mode "755"
190 end
191
192 directory "/srv/tile.openstreetmap.org/data" do
193   owner "tile"
194   group "tile"
195   mode "755"
196 end
197
198 package "mapnik-utils"
199
200 node[:tile][:data].each_value do |data|
201   url = data[:url]
202   file = "/srv/tile.openstreetmap.org/data/#{File.basename(url)}"
203
204   if data[:directory]
205     directory = "/srv/tile.openstreetmap.org/data/#{data[:directory]}"
206
207     directory directory do
208       owner "tile"
209       group "tile"
210       mode "755"
211     end
212   else
213     directory = "/srv/tile.openstreetmap.org/data"
214   end
215
216   if file =~ /\.tgz$/
217     package "tar"
218
219     execute file do
220       action :nothing
221       command "tar -zxf #{file} -C #{directory}"
222       user "tile"
223       group "tile"
224     end
225   elsif file =~ /\.tar\.bz2$/
226     package "tar"
227
228     execute file do
229       action :nothing
230       command "tar -jxf #{file} -C #{directory}"
231       user "tile"
232       group "tile"
233     end
234   elsif file =~ /\.zip$/
235     package "unzip"
236
237     execute file do
238       action :nothing
239       command "unzip -qq -o #{file} -d #{directory}"
240       user "tile"
241       group "tile"
242     end
243   end
244
245   execute "#{file}_shapeindex" do
246     action :nothing
247     command "find #{directory} -type f -iname '*.shp' -print0 | xargs -0 --no-run-if-empty shapeindex --shape_files"
248     user "tile"
249     group "tile"
250     subscribes :run, "execute[#{file}]", :immediately
251   end
252
253   remote_file file do
254     if data[:refresh]
255       action :create
256       use_conditional_get true
257       ignore_failure true
258     else
259       action :create_if_missing
260     end
261
262     source url
263     owner "tile"
264     group "tile"
265     mode "644"
266     backup false
267     notifies :run, "execute[#{file}]", :immediately
268     notifies :restart, "service[renderd]"
269   end
270 end
271
272 nodejs_package "carto"
273
274 systemd_service "update-lowzoom@" do
275   description "Low zoom tile update service for %i layer"
276   user "tile"
277   exec_start "/bin/bash /usr/local/bin/update-lowzoom-%i"
278   private_tmp true
279   private_devices true
280   private_network true
281   protect_system "full"
282   protect_home true
283   no_new_privileges true
284   restart "on-failure"
285 end
286
287 directory "/srv/tile.openstreetmap.org/styles" do
288   owner "tile"
289   group "tile"
290   mode "755"
291 end
292
293 node[:tile][:styles].each do |name, details|
294   style_directory = "/srv/tile.openstreetmap.org/styles/#{name}"
295   tile_directory = "/srv/tile.openstreetmap.org/tiles/#{name}"
296
297   template "/usr/local/bin/update-lowzoom-#{name}" do
298     source "update-lowzoom.erb"
299     owner "root"
300     group "root"
301     mode "755"
302     variables :style => name
303   end
304
305   service "update-lowzoom@#{name}" do
306     action :disable
307     supports :restart => true
308   end
309
310   directory tile_directory do
311     owner "tile"
312     group "tile"
313     mode "755"
314   end
315
316   details[:tile_directories].each do |directory|
317     directory directory[:name] do
318       owner "www-data"
319       group "www-data"
320       mode "755"
321     end
322
323     directory[:min_zoom].upto(directory[:max_zoom]) do |zoom|
324       directory "#{directory[:name]}/#{zoom}" do
325         owner "www-data"
326         group "www-data"
327         mode "755"
328       end
329
330       link "#{tile_directory}/#{zoom}" do
331         to "#{directory[:name]}/#{zoom}"
332         owner "tile"
333         group "tile"
334       end
335     end
336   end
337
338   file "#{tile_directory}/planet-import-complete" do
339     action :create_if_missing
340     owner "tile"
341     group "tile"
342     mode "444"
343   end
344
345   git style_directory do
346     action :sync
347     repository details[:repository]
348     revision details[:revision]
349     user "tile"
350     group "tile"
351   end
352
353   link "#{style_directory}/data" do
354     to "/srv/tile.openstreetmap.org/data"
355     owner "tile"
356     group "tile"
357   end
358
359   execute "#{style_directory}/project.mml" do
360     action :nothing
361     command "carto -a 3.0.0 project.mml > project.xml"
362     cwd style_directory
363     user "tile"
364     group "tile"
365     subscribes :run, "git[#{style_directory}]"
366     notifies :restart, "service[renderd]", :immediately
367     notifies :restart, "service[update-lowzoom@#{name}]"
368   end
369 end
370
371 postgresql_version = node[:tile][:database][:cluster].split("/").first
372 postgis_version = node[:tile][:database][:postgis]
373
374 package "postgresql-#{postgresql_version}-postgis-#{postgis_version}"
375
376 postgresql_user "jburgess" do
377   cluster node[:tile][:database][:cluster]
378   superuser true
379 end
380
381 postgresql_user "tomh" do
382   cluster node[:tile][:database][:cluster]
383   superuser true
384 end
385
386 postgresql_user "tile" do
387   cluster node[:tile][:database][:cluster]
388 end
389
390 postgresql_user "www-data" do
391   cluster node[:tile][:database][:cluster]
392 end
393
394 postgresql_database "gis" do
395   cluster node[:tile][:database][:cluster]
396   owner "tile"
397 end
398
399 postgresql_extension "postgis" do
400   cluster node[:tile][:database][:cluster]
401   database "gis"
402 end
403
404 postgresql_extension "hstore" do
405   cluster node[:tile][:database][:cluster]
406   database "gis"
407   only_if { node[:tile][:database][:hstore] }
408 end
409
410 %w[geography_columns planet_osm_nodes planet_osm_rels planet_osm_ways raster_columns raster_overviews spatial_ref_sys].each do |table|
411   postgresql_table table do
412     cluster node[:tile][:database][:cluster]
413     database "gis"
414     owner "tile"
415     permissions "tile" => :all
416   end
417 end
418
419 %w[geometry_columns planet_osm_line planet_osm_point planet_osm_polygon planet_osm_roads].each do |table|
420   postgresql_table table do
421     cluster node[:tile][:database][:cluster]
422     database "gis"
423     owner "tile"
424     permissions "tile" => :all, "www-data" => :select
425   end
426 end
427
428 postgresql_munin "gis" do
429   cluster node[:tile][:database][:cluster]
430   database "gis"
431 end
432
433 directory File.dirname(node[:tile][:database][:node_file]) do
434   owner "root"
435   group "root"
436   mode "755"
437   recursive true
438 end
439
440 file node[:tile][:database][:node_file] do
441   owner "tile"
442   group "www-data"
443   mode "660"
444 end
445
446 directory "/var/log/tile" do
447   owner "tile"
448   group "tile"
449   mode "755"
450 end
451
452 package %w[
453   osm2pgsql
454   ruby
455   osmium-tool
456   pyosmium
457   python3-pyproj
458 ]
459
460 remote_directory "/usr/local/bin" do
461   source "bin"
462   owner "root"
463   group "root"
464   mode "755"
465   files_owner "root"
466   files_group "root"
467   files_mode "755"
468 end
469
470 template "/usr/local/bin/expire-tiles" do
471   source "expire-tiles.erb"
472   owner "root"
473   group "root"
474   mode "755"
475 end
476
477 directory "/var/lib/replicate" do
478   owner "tile"
479   group "tile"
480   mode "755"
481 end
482
483 directory "/var/lib/replicate/expire-queue" do
484   owner "tile"
485   group "www-data"
486   mode "775"
487 end
488
489 template "/usr/local/bin/replicate" do
490   source "replicate.erb"
491   owner "root"
492   group "root"
493   mode "755"
494   variables :postgresql_version => postgresql_version.to_f
495 end
496
497 systemd_service "expire-tiles" do
498   description "Tile dirtying service"
499   type "simple"
500   user "www-data"
501   exec_start "/usr/local/bin/expire-tiles"
502   standard_output "null"
503   private_tmp true
504   private_devices true
505   protect_system "full"
506   protect_home true
507   no_new_privileges true
508 end
509
510 systemd_path "expire-tiles" do
511   description "Tile dirtying trigger"
512   directory_not_empty "/var/lib/replicate/expire-queue"
513 end
514
515 service "expire-tiles.path" do
516   action [:enable, :start]
517   subscribes :restart, "systemd_path[expire-tiles]"
518 end
519
520 systemd_service "replicate" do
521   description "Rendering database replication service"
522   after "postgresql.service"
523   wants "postgresql.service"
524   user "tile"
525   exec_start "/usr/local/bin/replicate"
526   private_tmp true
527   private_devices true
528   protect_system "full"
529   protect_home true
530   no_new_privileges true
531   restart "on-failure"
532 end
533
534 service "replicate" do
535   action [:enable, :start]
536   subscribes :restart, "template[/usr/local/bin/replicate]"
537   subscribes :restart, "systemd_service[replicate]"
538 end
539
540 template "/etc/logrotate.d/replicate" do
541   source "replicate.logrotate.erb"
542   owner "root"
543   group "root"
544   mode "644"
545 end
546
547 template "/usr/local/bin/render-lowzoom" do
548   source "render-lowzoom.erb"
549   owner "root"
550   group "root"
551   mode "755"
552 end
553
554 systemd_service "render-lowzoom" do
555   description "Render low zoom tiles"
556   user "tile"
557   exec_start "/usr/local/bin/render-lowzoom"
558   private_tmp true
559   private_devices true
560   private_network true
561   protect_system "full"
562   protect_home true
563   no_new_privileges true
564 end
565
566 systemd_timer "render-lowzoom" do
567   description "Render low zoom tiles"
568   on_calendar "Sun *-*~07/1 01:00:00"
569 end
570
571 service "render-lowzoom.timer" do
572   action [:enable, :start]
573 end
574
575 package "liblockfile-simple-perl"
576 package "libfilesys-df-perl"
577
578 template "/usr/local/bin/cleanup-tiles" do
579   source "cleanup-tiles.erb"
580   owner "root"
581   group "root"
582   mode "755"
583 end
584
585 tile_directories = node[:tile][:styles].collect do |_, style|
586   style[:tile_directories].collect { |directory| directory[:name] }
587 end.flatten.sort.uniq
588
589 tile_directories.each do |directory|
590   label = directory.gsub("/", "-")
591
592   cron_d "cleanup-tiles#{label}" do
593     minute "0"
594     user "www-data"
595     command "ionice -c 3 /usr/local/bin/cleanup-tiles #{directory}"
596     mailto "admins@openstreetmap.org"
597   end
598 end
599
600 munin_plugin "mod_tile_fresh"
601 munin_plugin "mod_tile_latency"
602 munin_plugin "mod_tile_response"
603 munin_plugin "mod_tile_zoom"
604
605 munin_plugin "renderd_processed"
606 munin_plugin "renderd_queue"
607 munin_plugin "renderd_queue_time"
608 munin_plugin "renderd_zoom"
609 munin_plugin "renderd_zoom_time"
610
611 munin_plugin "replication_delay"
612
613 prometheus_collector "modtile" do
614   interval "1m"
615 end
616
617 prometheus_collector "renderd" do
618   interval "1m"
619 end