]> git.openstreetmap.org Git - chef.git/blob - cookbooks/vectortile/recipes/default.rb
Avoid accessing form data for OPTIONS requests
[chef.git] / cookbooks / vectortile / recipes / default.rb
1 #
2 # Cookbook:: vectortile
3 # Recipe:: default
4 #
5 # Copyright:: 2024, 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 "git"
22 include_recipe "nginx"
23 include_recipe "podman"
24 include_recipe "postgresql"
25 include_recipe "prometheus"
26 include_recipe "python"
27 include_recipe "tools"
28
29 directory "/srv/vector.openstreetmap.org" do
30   user "tileupdate"
31   group "tileupdate"
32   mode "755"
33 end
34
35 nginx_site "default" do
36   action [:delete]
37 end
38
39 nginx_site "vector.openstreetmap.org" do
40   template "nginx.erb"
41 end
42
43 ssl_certificate node[:fqdn] do
44   domains [node[:fqdn]]
45   notifies :reload, "service[nginx]"
46 end
47
48 remote_directory "/srv/vector.openstreetmap.org/html" do
49   source "html"
50   owner "www-data"
51   group "www-data"
52   mode "755"
53   files_owner "www-data"
54   files_group "www-data"
55   files_mode "644"
56 end
57
58 template "/srv/vector.openstreetmap.org/html/index.html" do
59   source "index.html.erb"
60   owner "www-data"
61   group "www-data"
62   mode "644"
63 end
64
65 postgresql_version = node[:vectortile][:database][:cluster].split("/").first
66 postgis_version = node[:vectortile][:database][:postgis]
67
68 package "postgresql-#{postgresql_version}-postgis-#{postgis_version}"
69
70 # Spirit dependencies
71 package %w[
72   osm2pgsql
73   gdal-bin
74   python3-yaml
75   python3-psycopg2
76 ]
77
78 style_directory = "/srv/vector.openstreetmap.org/spirit"
79 git style_directory do
80   repository "https://github.com/pnorman/spirit.git"
81   revision node[:vectortile][:spirit][:version]
82   user "tileupdate"
83   group "tileupdate"
84 end
85
86 shortbread_config = "#{style_directory}/shortbread.yaml"
87
88 themepark_directory = "/srv/vector.openstreetmap.org/osm2pgsql-themepark"
89 git themepark_directory do
90   repository "https://github.com/osm2pgsql-dev/osm2pgsql-themepark.git"
91   revision node[:vectortile][:themepark][:version]
92   user "tileupdate"
93   group "tileupdate"
94 end
95
96 tilekiln_directory = "/opt/tilekiln"
97
98 python_virtualenv tilekiln_directory do
99   interpreter "/usr/bin/python3"
100 end
101
102 python_package "tilekiln" do
103   python_virtualenv tilekiln_directory
104   python_version "3"
105   version node[:vectortile][:tilekiln][:version]
106 end
107
108 template "/srv/vector.openstreetmap.org/html/index.html" do
109   source "index.html.erb"
110   owner "www-data"
111   group "www-data"
112   mode "644"
113 end
114
115 directory "/srv/vector.openstreetmap.org/data" do
116   user "tileupdate"
117   group "tileupdate"
118   mode "755"
119 end
120
121 node_store_options = node[:vectortile][:database][:nodes_store] == :flat ? "--flat-nodes '/srv/vector.openstreetmap.org/data/nodes.bin'" : ""
122 template "/usr/local/bin/import-planet" do
123   source "import-planet.erb"
124   owner "root"
125   group "root"
126   mode "755"
127   variables :node_store_options => node_store_options
128 end
129
130 template "/usr/local/bin/tilekiln-storage-init" do
131   source "tilekiln-storage-init.erb"
132   owner "root"
133   group "root"
134   mode "755"
135   variables :tilekiln_bin => "#{tilekiln_directory}/bin/tilekiln", :storage_database => "tiles", :config_path => shortbread_config
136 end
137
138 postgresql_user "tomh" do
139   cluster node[:vectortile][:database][:cluster]
140   superuser true
141 end
142
143 postgresql_user "pnorman" do
144   cluster node[:vectortile][:database][:cluster]
145   superuser true
146 end
147
148 postgresql_user "tilekiln" do
149   cluster node[:vectortile][:database][:cluster]
150 end
151
152 postgresql_user "tileupdate" do
153   cluster node[:vectortile][:database][:cluster]
154 end
155
156 postgresql_database "tiles" do
157   cluster node[:vectortile][:database][:cluster]
158   owner "tileupdate"
159 end
160
161 postgresql_extension "pgstattuple" do
162   cluster node[:vectortile][:database][:cluster]
163   database "tiles"
164 end
165
166 postgresql_database "spirit" do
167   cluster node[:vectortile][:database][:cluster]
168   owner "tileupdate"
169 end
170
171 postgresql_extension "postgis" do
172   cluster node[:vectortile][:database][:cluster]
173   database "spirit"
174 end
175
176 postgresql_schema "tilekiln" do
177   cluster node[:vectortile][:database][:cluster]
178   database "tiles"
179   owner "tileupdate"
180   permissions "tileupdate" => :all, "tilekiln" => :usage
181   notifies :run, "execute[tilekiln-storage-init]", :immediately
182 end
183
184 execute "tilekiln-storage-init" do
185   action :nothing
186   command "/usr/local/bin/tilekiln-storage-init"
187   user "tileupdate"
188 end
189
190 %w[metadata shortbread_v1].each do |table|
191   postgresql_table table do
192     cluster node[:vectortile][:database][:cluster]
193     database "tiles"
194     schema "tilekiln"
195     owner "tileupdate"
196     permissions "tileupdate" => :all, "tilekiln" => :select
197   end
198 end
199
200 postgresql_table "tile_stats" do
201   cluster node[:vectortile][:database][:cluster]
202   database "tiles"
203   schema "tilekiln"
204   owner "tilekiln"
205 end
206
207 (0..14).each do |zoom|
208   postgresql_table "shortbread_v1_z#{zoom}" do
209     cluster node[:vectortile][:database][:cluster]
210     database "tiles"
211     schema "tilekiln"
212     owner "tileupdate"
213     permissions "tileupdate" => :all, "tilekiln" => node[:vectortile][:serve][:mode] == :live ? [:select, :insert, :update] : :select
214   end
215 end
216
217 %w[addresses aerialways aeroways boundaries boundary_labels bridges buildings
218    dam_lines dam_polygons ferries land pier_lines pier_polygons place_labels
219    planet_osm_nodes planet_osm_rels planet_osm_ways pois public_transport railways
220    road_routes roads sites street_polygons street_labels_points
221    streets_polygons_labels water_area_labels water_areas water_lines water_lines_labels].each do |table|
222   postgresql_table table do
223     cluster node[:vectortile][:database][:cluster]
224     database "spirit"
225     schema "public"
226     owner "tileupdate"
227     permissions "tileupdate" => :all, "tilekiln" => :select
228   end
229 end
230
231 tilekiln_mode = node[:vectortile][:serve][:mode] == :live ? "live --config #{shortbread_config} --source-dbname spirit" : "static"
232
233 systemd_service "tilekiln" do
234   description "Tilekiln vector tile server"
235   user "tilekiln"
236   after "postgresql.service"
237   wants "postgresql.service"
238   sandbox :enable_network => true
239   restrict_address_families "AF_UNIX"
240   environment "PGAPPNAME" => "tilekiln"
241   exec_start "#{tilekiln_directory}/bin/tilekiln serve #{tilekiln_mode} --storage-dbname tiles --num-threads #{node[:vectortile][:serve][:threads]} --base-url 'https://vector.openstreetmap.org'"
242 end
243
244 service "tilekiln" do
245   action [:enable, :start]
246 end
247
248 template "/usr/local/bin/ocean-update" do
249   source node[:vectortile][:ocean][:tileupdate] ? "ocean-update-tile.erb" : "ocean-update-notile.erb"
250   owner "root"
251   group "root"
252   mode "755"
253   variables :tilekiln_bin => "#{tilekiln_directory}/bin/tilekiln", :source_database => "spirit", :storage_database => "tiles", :style_directory => style_directory, :config_path => shortbread_config
254 end
255
256 systemd_service "ocean-update" do
257   description "Update ocean data"
258   user "tileupdate"
259   after "postgresql.service"
260   wants "postgresql.service"
261   sandbox :enable_network => true
262   restrict_address_families "AF_UNIX"
263   read_write_paths ["/srv/vector.openstreetmap.org/spirit/data/"]
264   exec_start "/usr/local/bin/ocean-update"
265 end
266
267 systemd_timer "ocean-update" do
268   description "Update ocean data"
269   on_boot_sec 300
270   on_unit_active_sec 3600
271   accuracy_sec 60
272 end
273
274 if node[:vectortile][:ocean][:enabled]
275   service "ocean-update.timer" do
276     action [:enable, :start]
277   end
278 else
279   service "ocean-update.timer" do
280     action [:stop, :disable]
281   end
282 end
283
284 template "/usr/local/bin/vector-update" do
285   source node[:vectortile][:replication][:tileupdate] ? "vector-update-tile.erb" : "vector-update-notile.erb"
286   owner "root"
287   group "root"
288   mode "755"
289   variables :tilekiln_bin => "#{tilekiln_directory}/bin/tilekiln", :source_database => "spirit", :config_path => shortbread_config, :diff_size => "1000", :expiry_dir => "/srv/vector.openstreetmap.org/data/", :post_processing => "/usr/local/bin/tiles-rerender"
290 end
291
292 rerender_layers = %w[addresses boundaries bridges buildings land pois public_transport sites street_polygons streets water_lines_labels water_lines water_polygons].join(" ")
293
294 template "/usr/local/bin/tiles-rerender" do
295   source "tiles-rerender.erb"
296   owner "root"
297   group "root"
298   mode "755"
299   variables :tilekiln_bin => "#{tilekiln_directory}/bin/tilekiln", :source_database => "spirit", :storage_database => "tiles", :config_path => shortbread_config, :expiry_dir => "/srv/vector.openstreetmap.org/data/", :update_threads => 4, :layers => rerender_layers.to_s
300 end
301
302 systemd_service "replicate" do
303   description "Get replication updates"
304   user "tileupdate"
305   after "postgresql.service"
306   wants "postgresql.service"
307   sandbox :enable_network => true
308   restrict_address_families "AF_UNIX"
309   read_write_paths ["/srv/vector.openstreetmap.org/data/"]
310   exec_start "/usr/local/bin/vector-update"
311 end
312
313 systemd_timer "replicate" do
314   description "Get replication updates"
315   on_boot_sec 60
316   on_unit_active_sec 30
317   accuracy_sec 5
318 end
319
320 if node[:vectortile][:replication][:enabled]
321   service "replicate.timer" do
322     action [:enable, :start]
323   end
324 else
325   service "replicate.timer" do
326     action [:stop, :disable]
327   end
328 end
329
330 template "/usr/local/bin/render-lowzoom" do
331   source "render-lowzoom.erb"
332   owner "root"
333   group "root"
334   mode "755"
335   variables :tilekiln_bin => "#{tilekiln_directory}/bin/tilekiln", :source_database => "spirit", :storage_database => "tiles", :config_path => shortbread_config, :min_zoom => 0, :max_zoom => node[:vectortile][:rerender][:lowzoom][:maxzoom]
336 end
337
338 systemd_service "render-lowzoom" do
339   description "Render low zoom tiles"
340   user "tileupdate"
341   after "postgresql.service"
342   wants "postgresql.service"
343   restrict_address_families "AF_UNIX"
344   sandbox true
345   exec_start "/usr/local/bin/render-lowzoom"
346 end
347
348 systemd_timer "render-lowzoom" do
349   description "Render low zoom tiles"
350   on_calendar "23:00 #{node[:timezone]}"
351 end
352
353 if node[:vectortile][:rerender][:lowzoom][:enabled]
354   service "render-lowzoom.timer" do
355     action [:enable, :start]
356   end
357 else
358   service "render-lowzoom.timer" do
359     action [:stop, :disable]
360   end
361 end
362
363 package %w[
364   ruby-pg
365   ruby-webrick
366 ]
367
368 prometheus_exporter "osm2pgsql" do
369   port 10027
370   user "tileupdate"
371   restrict_address_families "AF_UNIX"
372   options [
373     "--database-name=spirit"
374   ]
375 end
376
377 systemd_service "tilekiln-prometheus" do
378   description "Tilekiln vector tile server"
379   user "tilekiln"
380   after "postgresql.service"
381   wants "postgresql.service"
382   sandbox :enable_network => true
383   environment "PGAPPNAME" => "tilekiln-prometheus"
384   restrict_address_families "AF_UNIX"
385   exec_start "#{tilekiln_directory}/bin/tilekiln prometheus --bind-host #{node[:prometheus][:address]} --storage-dbname tiles"
386 end
387
388 service "tilekiln-prometheus" do
389   action [:enable, :start]
390 end
391
392 node.default[:prometheus][:exporters][10013] = {
393   :name => "tilekiln",
394   :address => "#{node[:prometheus][:address]}:10013",
395 }
396
397 podman_service "vectortile_demo" do
398   description "Container service for /demo pages"
399   image "ghcr.io/openstreetmap/vectortile-website:latest"
400   ports 8080 => 8080
401 end