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