]> git.openstreetmap.org Git - chef.git/blob - cookbooks/vectortile/recipes/default.rb
vectortile: Make the spirit and themepark versions attributes
[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 "postgresql"
24 include_recipe "prometheus"
25 include_recipe "python"
26 include_recipe "tools"
27
28 directory "/srv/vector.openstreetmap.org" do
29   user "tileupdate"
30   group "tileupdate"
31   mode "755"
32 end
33
34 nginx_site "default" do
35   action [:delete]
36 end
37
38 nginx_site "vector.openstreetmap.org" do
39   template "nginx.erb"
40 end
41
42 ssl_certificate node[:fqdn] do
43   domains [node[:fqdn]]
44   notifies :reload, "service[nginx]"
45 end
46
47 remote_directory "/srv/vector.openstreetmap.org/html" do
48   source "html"
49   owner "www-data"
50   group "www-data"
51   mode "755"
52   files_owner "www-data"
53   files_group "www-data"
54   files_mode "644"
55 end
56
57 template "/srv/vector.openstreetmap.org/html/index.html" do
58   source "index.html.erb"
59   owner "www-data"
60   group "www-data"
61   mode "644"
62 end
63
64 postgresql_version = node[:vectortile][:database][:cluster].split("/").first
65 postgis_version = node[:vectortile][:database][:postgis]
66
67 package "postgresql-#{postgresql_version}-postgis-#{postgis_version}"
68
69 # Spirit dependencies
70 package %w[
71   osm2pgsql
72   gdal-bin
73   python3-yaml
74   python3-psycopg2
75 ]
76
77 style_directory = "/srv/vector.openstreetmap.org/spirit"
78 git style_directory do
79   repository "https://github.com/pnorman/spirit.git"
80   revision node[:vectortile][:spirit][:version]
81   user "tileupdate"
82   group "tileupdate"
83 end
84
85 shortbread_config = "#{style_directory}/shortbread.yaml"
86
87 themepark_directory = "/srv/vector.openstreetmap.org/osm2pgsql-themepark"
88 git themepark_directory do
89   repository "https://github.com/osm2pgsql-dev/osm2pgsql-themepark.git"
90   revision node[:vectortile][:themepark][:version]
91   user "tileupdate"
92   group "tileupdate"
93 end
94
95 tilekiln_directory = "/opt/tilekiln"
96
97 python_virtualenv tilekiln_directory do
98   interpreter "/usr/bin/python3"
99 end
100
101 python_package "tilekiln" do
102   python_virtualenv tilekiln_directory
103   python_version "3"
104   version node[:vectortile][:tilekiln][:version]
105 end
106
107 template "/srv/vector.openstreetmap.org/html/index.html" do
108   source "index.html.erb"
109   owner "www-data"
110   group "www-data"
111   mode "644"
112 end
113
114 directory "/srv/vector.openstreetmap.org/data" do
115   user "tileupdate"
116   group "tileupdate"
117   mode "755"
118 end
119
120 node_store_options = node[:vectortile][:database][:nodes_store] == :flat ? "--flat-nodes '/srv/vector.openstreetmap.org/data/nodes.bin'" : ""
121 template "/usr/local/bin/import-planet" do
122   source "import-planet.erb"
123   owner "root"
124   group "root"
125   mode "755"
126   variables :node_store_options => "#{node_store_options}"
127 end
128
129 template "/usr/local/bin/tilekiln-storage-init" do
130   source "tilekiln-storage-init.erb"
131   owner "root"
132   group "root"
133   mode "755"
134   variables :tilekiln_bin => "#{tilekiln_directory}/bin/tilekiln", :storage_database => "tiles", :config_path => "#{shortbread_config}"
135 end
136
137 postgresql_user "tomh" do
138   cluster node[:vectortile][:database][:cluster]
139   superuser true
140 end
141
142 postgresql_user "pnorman" do
143   cluster node[:vectortile][:database][:cluster]
144   superuser true
145 end
146
147 postgresql_user "tilekiln" do
148   cluster node[:vectortile][:database][:cluster]
149 end
150
151 postgresql_user "tileupdate" do
152   cluster node[:vectortile][:database][:cluster]
153 end
154
155 postgresql_database "tiles" do
156   cluster node[:vectortile][:database][:cluster]
157   owner "tileupdate"
158 end
159
160 postgresql_database "spirit" do
161   cluster node[:vectortile][:database][:cluster]
162   owner "tileupdate"
163 end
164
165 postgresql_extension "postgis" do
166   cluster node[:vectortile][:database][:cluster]
167   database "spirit"
168 end
169
170 postgresql_schema "tilekiln" do
171   cluster node[:vectortile][:database][:cluster]
172   database "tiles"
173   owner "tileupdate"
174   permissions "tileupdate" => :all, "tilekiln" => :usage
175   notifies :run, "execute[tilekiln-storage-init]", :immediately
176 end
177
178 execute "tilekiln-storage-init" do
179   action :nothing
180   command "/usr/local/bin/tilekiln-storage-init"
181   user "tileupdate"
182 end
183
184 %w[metadata shortbread_v1].each do |table|
185   postgresql_table table do
186     cluster node[:vectortile][:database][:cluster]
187     database "tiles"
188     schema "tilekiln"
189     owner "tileupdate"
190     permissions "tileupdate" => :all, "tilekiln" => :select
191   end
192 end
193
194 postgresql_table "tile_stats" do
195   cluster node[:vectortile][:database][:cluster]
196   database "tiles"
197   schema "tilekiln"
198   owner "tilekiln"
199 end
200
201 (0..14).each do |zoom|
202   postgresql_table "shortbread_v1_z#{zoom}" do
203     cluster node[:vectortile][:database][:cluster]
204     database "tiles"
205     schema "tilekiln"
206     owner "tileupdate"
207     permissions "tileupdate" => :all, "tilekiln" => node[:vectortile][:serve][:mode] == :live ? [:select, :insert, :update] : :select
208   end
209 end
210
211 %w[addresses aerialways aeroways boundaries boundary_labels bridges buildings
212 dam_lines dam_polygons ferries land pier_lines pier_polygons place_labels
213 planet_osm_nodes planet_osm_rels planet_osm_ways pois public_transport railways
214 road_routes roads sites street_polygons streets_labels_points
215 streets_polygons_labels water_area_labels water_areas water_lines water_lines_labels].each do |table|
216   postgresql_table table do
217     cluster node[:vectortile][:database][:cluster]
218     database "spirit"
219     schema "public"
220     owner "tileupdate"
221     permissions "tileupdate" => :all, "tilekiln" => :select
222   end
223 end
224
225 tilekiln_mode = node[:vectortile][:serve][:mode] == :live ? "live --config #{shortbread_config} --source-dbname spirit" : "static"
226
227 systemd_service "tilekiln" do
228   description "Tilekiln vector tile server"
229   user "tilekiln"
230   after "postgresql.service"
231   wants "postgresql.service"
232   sandbox :enable_network => true
233   restrict_address_families "AF_UNIX"
234   exec_start "#{tilekiln_directory}/bin/tilekiln serve #{tilekiln_mode} --storage-dbname tiles --num-threads #{node[:vectortile][:serve][:threads]} --base-url 'https://vector.openstreetmap.org'"
235 end
236
237 service "tilekiln" do
238   action [:enable, :start]
239 end
240
241 execute "/srv/vector.openstreetmap.org/spirit/scripts/get-external-data.py" do
242   command "/srv/vector.openstreetmap.org/spirit/scripts/get-external-data.py -R tilekiln"
243   cwd "/srv/vector.openstreetmap.org/spirit"
244   user "tileupdate"
245   group "tileupdate"
246   ignore_failure true
247 end
248
249 template "/usr/local/bin/vector-update" do
250   source node[:vectortile][:replication][:tileupdate] ? "vector-update-tile.erb" : "vector-update-notile.erb"
251   owner "root"
252   group "root"
253   mode "755"
254   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"
255 end
256
257 rerender_layers = %w[addresses boundaries bridges buildings land pois public_transport sites street_polygons streets water_lines_labels water_lines water_polygons].join(" ")
258
259 template "/usr/local/bin/tiles-rerender" do
260   source "tiles-rerender.erb"
261   owner "root"
262   group "root"
263   mode "755"
264   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}"
265 end
266
267 systemd_service "replicate" do
268   description "Get replication updates"
269   user "tileupdate"
270   after "postgresql.service"
271   wants "postgresql.service"
272   sandbox :enable_network => true
273   restrict_address_families "AF_UNIX"
274   read_write_paths ["/srv/vector.openstreetmap.org/data/"]
275   exec_start "/usr/local/bin/vector-update"
276 end
277
278 systemd_timer "replicate" do
279   description "Get replication updates"
280   on_boot_sec 60
281   on_unit_active_sec 30
282   accuracy_sec 5
283 end
284
285 if node[:vectortile][:replication][:enabled]
286   service "replicate.timer" do
287     action [:enable, :start]
288   end
289 else
290   service "replicate.timer" do
291     action [:stop, :disable]
292   end
293 end
294
295 package %w[
296   ruby-pg
297   ruby-webrick
298 ]
299
300 prometheus_exporter "osm2pgsql" do
301   port 10027
302   user "tileupdate"
303   restrict_address_families "AF_UNIX"
304   options [
305     "--database-name=spirit"
306   ]
307 end
308
309 systemd_service "tilekiln-prometheus" do
310   description "Tilekiln vector tile server"
311   user "tilekiln"
312   after "postgresql.service"
313   wants "postgresql.service"
314   sandbox :enable_network => true
315   restrict_address_families "AF_UNIX"
316   exec_start "#{tilekiln_directory}/bin/tilekiln prometheus --bind-host #{node[:prometheus][:address]} --storage-dbname tiles"
317 end
318
319 service "tilekiln-prometheus" do
320   action [:enable, :start]
321 end
322
323 node.default[:prometheus][:exporters][10013] = {
324   :name => "tilekiln",
325   :address => "#{node[:prometheus][:address]}:10013",
326 }