Add tile cookbook
[chef.git] / cookbooks / tile / recipes / default.rb
1 #
2 # Cookbook Name:: 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 #     http://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 "apache"
21 include_recipe "git"
22 include_recipe "nodejs"
23 include_recipe "postgresql"
24
25 blocks = data_bag_item("tile", "blocks")
26
27 apache_module "alias"
28 apache_module "expires"
29 apache_module "headers"
30 apache_module "remoteip"
31 apache_module "rewrite"
32
33 apache_module "tile" do
34   conf "tile.conf.erb"
35 end
36
37 tilecaches = search(:node, "roles:tilecache")
38
39 apache_site "default" do
40   action [ :disable ]
41 end
42
43 apache_site "tile.openstreetmap.org" do
44   template "apache.erb"
45   variables :caches => tilecaches
46 end
47
48 template "/etc/logrotate.d/apache2" do
49   source "logrotate.apache.erb"
50   owner "root"
51   group "root"
52   mode 0644
53 end
54
55 directory "/srv/tile.openstreetmap.org" do
56   owner "tile"
57   group "tile"
58   mode 0755
59 end
60
61 package "renderd"
62
63 service "renderd" do
64   action [ :enable, :start ]
65   supports :status => false, :restart => true, :reload => false
66 end
67
68 directory node[:tile][:tile_directory] do
69   owner "tile"
70   group "www-data"
71   mode 0775
72 end
73
74 if node[:tile][:tile_directory] != "/srv/tile.openstreetmap.org/tiles"
75   link "/srv/tile.openstreetmap.org/tiles" do
76     to node[:tile][:tile_directory]
77   end
78 end
79
80 template "/etc/renderd.conf" do
81   source "renderd.conf.erb"
82   owner "root"
83   group "root"
84   mode 0644
85   notifies :reload, resources(:service => "apache2")
86   notifies :restart, resources(:service => "renderd")
87 end
88
89 remote_directory "/srv/tile.openstreetmap.org/html" do
90   source "html"
91   owner "tile"
92   group "tile"
93   mode 0755
94   files_owner "tile"
95   files_group "tile"
96   files_mode 0644
97 end
98
99 directory "/srv/tile.openstreetmap.org/cgi-bin" do
100   owner "tile"
101   group "tile"
102   mode 0755
103 end
104
105 template "/srv/tile.openstreetmap.org/cgi-bin/export" do
106   source "export.erb"
107   owner "tile"
108   group "tile"
109   mode 0755
110   variables :blocks => blocks
111 end
112
113 directory "/srv/tile.openstreetmap.org/data" do
114   owner "tile"
115   group "tile"
116   mode 0755
117 end
118
119 node[:tile][:data].each do |name,data|
120   url = data[:url]
121   file = "/srv/tile.openstreetmap.org/data/#{File.basename(url)}"
122   directory = "/srv/tile.openstreetmap.org/data/#{data[:directory]}"
123
124   directory directory do
125     owner "tile"
126     group "tile"
127     mode 0755
128   end
129
130   if file =~ /\.tgz$/
131     package "tar"
132
133     execute file do
134       action :nothing
135       command "tar -zxf #{file} -C #{directory}"
136       user "tile"
137       group "tile"
138     end
139   elsif file =~ /\.tar\.bz2$/
140     package "tar"
141
142     execute file do
143       action :nothing
144       command "tar -jxf #{file} -C #{directory}"
145       user "tile"
146       group "tile"
147     end
148   elsif file =~ /\.zip$/
149     package "unzip"
150
151     execute file do
152       action :nothing
153       command "unzip -qq #{file} -d #{directory}"
154       user "tile"
155       group "tile"
156     end
157   end
158
159   if data[:processed]
160     original = "#{directory}/#{data[:original]}"
161     processed = "#{directory}/#{data[:processed]}"
162
163     package "gdal-bin"
164
165     execute processed do
166       action :nothing
167       command "ogr2ogr #{processed} #{original}"
168       user "tile"
169       group "tile"
170       subscribes :run, resources(:execute => file), :immediately
171     end
172   end
173
174   remote_file file do
175     action :create_if_missing 
176     source url
177     owner "tile"
178     group "tile"
179     mode 0644
180     notifies :run, resources(:execute => file), :immediately
181     notifies :restart, resources(:service => "renderd")
182   end
183 end
184
185 nodejs_package "carto"
186 nodejs_package "millstone"
187
188 directory "/srv/tile.openstreetmap.org/styles" do
189   owner "tile"
190   group "tile"
191   mode 0755
192 end
193
194 node[:tile][:styles].each do |name,details|
195   directory = "/srv/tile.openstreetmap.org/styles/#{name}"
196
197   git directory do
198     action :sync
199     repository details[:repository]
200     revision details[:revision]
201     user "tile"
202     group "tile"
203   end
204
205   link "#{directory}/data" do
206     to "/srv/tile.openstreetmap.org/data"
207     owner "tile"
208     group "tile"
209   end
210
211   execute "#{directory}/project.mml" do
212     command "carto project.mml > project.xml"
213     cwd directory
214     user "tile"
215     group "tile"
216     not_if do
217       File.exist?("#{directory}/project.xml") and
218       File.mtime("#{directory}/project.xml") >= File.mtime("#{directory}/project.mml")
219     end
220     notifies :restart, resources(:service => "renderd")
221   end
222 end
223
224 package "postgis"
225
226 postgresql_user "jburgess" do
227   cluster node[:tile][:database][:cluster]
228   superuser true
229 end
230
231 postgresql_user "tomh" do
232   cluster node[:tile][:database][:cluster]
233   superuser true
234 end
235
236 postgresql_user "tile" do
237   cluster node[:tile][:database][:cluster]
238 end
239
240 postgresql_user "www-data" do
241   cluster node[:tile][:database][:cluster]
242 end
243
244 postgresql_database "gis" do
245   cluster node[:tile][:database][:cluster]
246   owner "tile"
247 end
248
249 postgresql_extension "postgis" do
250   cluster node[:tile][:database][:cluster]
251   database "gis"
252 end
253
254 [ "geography_columns",
255   "planet_osm_nodes",
256   "planet_osm_rels",
257   "planet_osm_ways",
258   "raster_columns", 
259   "raster_overviews", 
260   "spatial_ref_sys" ].each do |table|
261   postgresql_table table do
262     cluster node[:tile][:database][:cluster]
263     database "gis"
264     owner "tile"
265     permissions "tile" => :all
266   end
267 end
268
269 [ "geometry_columns", 
270   "planet_osm_line", 
271   "planet_osm_point", 
272   "planet_osm_polygon", 
273   "planet_osm_roads" ].each do |table|
274   postgresql_table table do
275     cluster node[:tile][:database][:cluster]
276     database "gis"
277     owner "tile"
278     permissions "tile" => :all, "www-data" => :select
279   end
280 end
281
282 postgresql_munin "gis" do
283   cluster node[:tile][:database][:cluster]
284   database "gis"
285 end
286
287 #if node[:tile][:node_file]
288 #  file node[:tile][:node_file] do
289 #    owner "tile"
290 #    group "tile"
291 #    mode 0664
292 #  end
293 #end
294
295 package "osm2pgsql"
296 package "osmosis"
297
298 package "ruby"
299 package "rubygems"
300
301 package "libproj-dev"
302 package "libxml2-dev"
303 package "libpq-dev"
304
305 gem_package "proj4rb"
306 gem_package "libxml-ruby"
307 gem_package "pg"
308
309 remote_directory "/usr/local/lib/site_ruby" do
310   source "ruby"
311   owner "root"
312   group "root"
313   mode 0755
314   files_owner "root"
315   files_group "root"
316   files_mode 0644
317 end
318
319 template "/usr/local/bin/expire-tiles" do
320   source "expire-tiles.erb"
321   owner "root"
322   group "root"
323   mode 0755
324 end
325
326 directory "/var/lib/replicate" do
327   owner "tile"
328   group "tile"
329   mode 0755
330 end
331
332 directory "/var/log/replicate" do
333   owner "tile"
334   group "tile"
335   mode 0755
336 end
337
338 template "/var/lib/replicate/configuration.txt" do
339   source "replicate.configuration.erb"
340   owner "tile"
341   group "tile"
342   mode 0644
343 end
344
345 template "/usr/local/bin/replicate" do
346   source "replicate.erb"
347   owner "root"
348   group "root"
349   mode 0755
350 end
351
352 template "/etc/init.d/replicate" do
353   source "replicate.init.erb"
354   owner "root"
355   group "root"
356   mode 0755
357 end
358
359 service "replicate" do
360   action [ :enable, :start ]
361   supports :restart => true
362   subscribes :restart, resources(:template => "/usr/local/bin/replicate")
363   subscribes :restart, resources(:template => "/etc/init.d/replicate")
364 end
365
366 template "/etc/logrotate.d/replicate" do
367   source "replicate.logrotate.erb"
368   owner "root"
369   group "root"
370   mode 0644
371 end
372
373 munin_plugin "mod_tile_fresh"
374 munin_plugin "mod_tile_response"
375 munin_plugin "mod_tile_zoom"
376
377 munin_plugin "renderd_processed"
378 munin_plugin "renderd_queue"
379 munin_plugin "renderd_zoom"
380 munin_plugin "renderd_zoom_time"
381
382 munin_plugin "replication_delay" do
383   conf "munin.erb"
384 end
385