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