]> git.openstreetmap.org Git - chef.git/blob - cookbooks/nominatim/recipes/default.rb
nominatim: temporary exception for Gnome proxy
[chef.git] / cookbooks / nominatim / recipes / default.rb
1 #
2 # Cookbook:: nominatim
3 # Recipe:: base
4 #
5 # Copyright:: 2015, 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 "munin"
21
22 basedir = data_bag_item("accounts", "nominatim")["home"]
23 email_errors = data_bag_item("accounts", "lonvia")["email"]
24
25 directory basedir do
26   owner "nominatim"
27   group "nominatim"
28   mode 0o755
29   recursive true
30 end
31
32 directory node[:nominatim][:logdir] do
33   owner "nominatim"
34   group "nominatim"
35   mode 0o755
36   recursive true
37 end
38
39 file "#{node[:nominatim][:logdir]}/query.log" do
40   action :create_if_missing
41   owner "www-data"
42   group "adm"
43   mode 0o664
44 end
45
46 file "#{node[:nominatim][:logdir]}/update.log" do
47   action :create_if_missing
48   owner "nominatim"
49   group "adm"
50   mode 0o664
51 end
52
53 # exception granted for a limited time so that they can set up their own server
54 firewall_rule "increase-limits-gnome-proxy" do
55   action :accept
56   source "net:8.43.85.23"
57   dest "fw"
58   proto "tcp:syn"
59   dest_ports "https"
60   rate_limit "s:10/sec:30"
61 end
62
63 ## Postgresql
64
65 include_recipe "postgresql"
66
67 postgresql_version = node[:nominatim][:dbcluster].split("/").first
68 postgis_version = node[:nominatim][:postgis]
69
70 package "postgresql-#{postgresql_version}-postgis-#{postgis_version}"
71
72 node[:nominatim][:dbadmins].each do |user|
73   postgresql_user user do
74     cluster node[:nominatim][:dbcluster]
75     superuser true
76     only_if { node[:nominatim][:state] != "slave" }
77   end
78 end
79
80 postgresql_user "nominatim" do
81   cluster node[:nominatim][:dbcluster]
82   superuser true
83   only_if { node[:nominatim][:state] != "slave" }
84 end
85
86 postgresql_user "www-data" do
87   cluster node[:nominatim][:dbcluster]
88   only_if { node[:nominatim][:state] != "slave" }
89 end
90
91 postgresql_munin "nominatim" do
92   cluster node[:nominatim][:dbcluster]
93   database node[:nominatim][:dbname]
94 end
95
96 directory "#{basedir}/tablespaces" do
97   owner "postgres"
98   group "postgres"
99   mode 0o700
100 end
101
102 # Note: tablespaces must be exactly in the same location on each
103 #       Nominatim instance when replication is in use. Therefore
104 #       use symlinks to canonical directory locations.
105 node[:nominatim][:tablespaces].each do |name, location|
106   directory location do
107     owner "postgres"
108     group "postgres"
109     mode 0o700
110     recursive true
111   end
112
113   link "#{basedir}/tablespaces/#{name}" do
114     to location
115   end
116
117   postgresql_tablespace name do
118     cluster node[:nominatim][:dbcluster]
119     location "#{basedir}/tablespaces/#{name}"
120   end
121 end
122
123 if node[:nominatim][:state] == "master"
124   postgresql_user "replication" do
125     cluster node[:nominatim][:dbcluster]
126     password data_bag_item("nominatim", "passwords")["replication"]
127     replication true
128   end
129
130   directory node[:rsyncd][:modules][:archive][:path] do
131     owner "postgres"
132     group "postgres"
133     mode 0o700
134   end
135
136   template "/usr/local/bin/clean-db-nominatim" do
137     source "clean-db-nominatim.erb"
138     owner "root"
139     group "root"
140     mode 0o755
141     variables :archive_dir => node[:rsyncd][:modules][:archive][:path],
142               :update_stop_file => "#{basedir}/status/updates_disabled",
143               :streaming_clients => search(:node, "nominatim_state:slave").map { |slave| slave[:fqdn] }.join(" ")
144   end
145 end
146
147 ## Nominatim backend
148
149 include_recipe "git"
150
151 package %w[
152   build-essential
153   cmake
154   g++
155   libboost-dev
156   libboost-system-dev
157   libboost-filesystem-dev
158   libexpat1-dev
159   zlib1g-dev
160   libxml2-dev
161   libbz2-dev
162   libpq-dev
163   libgeos++-dev
164   libproj-dev
165   python3-pyosmium
166   pyosmium
167   python3-psycopg2
168 ]
169
170 source_directory = "#{basedir}/nominatim"
171 build_directory = "#{basedir}/bin"
172
173 directory build_directory do
174   owner "nominatim"
175   group "nominatim"
176   mode 0o755
177   recursive true
178 end
179
180 # Normally syncing via chef is a bad idea because syncing might involve
181 # an update of database functions which should not be done while an update
182 # is ongoing. Therefore we sync in between update cycles. There is an
183 # exception for slaves: they get DB function updates from the master, so
184 # only the source code needs to be updated, which chef may do.
185 git source_directory do
186   action node[:nominatim][:state] == "slave" ? :sync : :checkout
187   repository node[:nominatim][:repository]
188   revision node[:nominatim][:revision]
189   enable_submodules true
190   user "nominatim"
191   group "nominatim"
192   not_if { node[:nominatim][:state] != "slave" && File.exist?("#{source_directory}/README.md") }
193   notifies :run, "execute[compile_nominatim]", :immediately
194 end
195
196 execute "compile_nominatim" do
197   action :nothing
198   user "nominatim"
199   cwd build_directory
200   command "cmake #{source_directory} && make"
201 end
202
203 template "#{source_directory}/.git/hooks/post-merge" do
204   source "git-post-merge-hook.erb"
205   owner "nominatim"
206   group "nominatim"
207   mode 0o755
208   variables :srcdir => source_directory,
209             :builddir => build_directory,
210             :dbname => node[:nominatim][:dbname]
211 end
212
213 template "#{build_directory}/settings/local.php" do
214   source "settings.erb"
215   owner "nominatim"
216   group "nominatim"
217   mode 0o664
218   variables :base_url => node[:nominatim][:state] == "off" ? node[:fqdn] : "nominatim.openstreetmap.org",
219             :dbname => node[:nominatim][:dbname],
220             :flatnode_file => node[:nominatim][:flatnode_file],
221             :log_file => "#{node[:nominatim][:logdir]}/query.log"
222 end
223
224 if node[:nominatim][:flatnode_file]
225   directory File.dirname(node[:nominatim][:flatnode_file]) do
226     recursive true
227   end
228 end
229
230 template "/etc/logrotate.d/nominatim" do
231   source "logrotate.nominatim.erb"
232   owner "root"
233   group "root"
234   mode 0o644
235 end
236
237 external_data = [
238   "wikimedia-importance.sql.gz",
239   "gb_postcode_data.sql.gz"
240 ]
241
242 external_data.each do |fname|
243   remote_file "#{source_directory}/data/#{fname}" do
244     action :create_if_missing
245     source "https://www.nominatim.org/data/#{fname}"
246     owner "nominatim"
247     group "nominatim"
248     mode 0o644
249   end
250 end
251
252 remote_file "#{source_directory}/data/country_osm_grid.sql.gz" do
253   action :create_if_missing
254   source "https://www.nominatim.org/data/country_grid.sql.gz"
255   owner "nominatim"
256   group "nominatim"
257   mode 0o644
258 end
259
260 template "/etc/cron.d/nominatim" do
261   action node[:nominatim][:state] == "off" ? :delete : :create
262   source "nominatim.cron.erb"
263   owner "root"
264   group "root"
265   mode "0644"
266   variables :bin_directory => "#{source_directory}/utils",
267             :mailto => email_errors,
268             :update_maintenance_trigger => "#{basedir}/status/update_maintenance"
269 end
270
271 template "#{source_directory}/utils/nominatim-update" do
272   source "updater.erb"
273   user "nominatim"
274   group "nominatim"
275   mode 0o755
276   variables :bindir => build_directory,
277             :srcdir => source_directory,
278             :logfile => "#{node[:nominatim][:logdir]}/update.log",
279             :branch => node[:nominatim][:revision],
280             :update_stop_file => "#{basedir}/status/updates_disabled",
281             :update_maintenance_trigger => "#{basedir}/status/update_maintenance"
282 end
283
284 template "/etc/init.d/nominatim-update" do
285   source "updater.init.erb"
286   user "nominatim"
287   group "nominatim"
288   mode 0o755
289   variables :source_directory => source_directory
290 end
291
292 %w[backup-nominatim vacuum-db-nominatim].each do |fname|
293   template "/usr/local/bin/#{fname}" do
294     source "#{fname}.erb"
295     owner "root"
296     group "root"
297     mode 0o755
298     variables :db => node[:nominatim][:dbname]
299   end
300 end
301
302 ## webserver frontend
303
304 template "#{build_directory}/settings/ip_blocks.conf" do
305   action :create_if_missing
306   source "ipblocks.erb"
307   owner "nominatim"
308   group "nominatim"
309   mode 0o664
310 end
311
312 file "#{build_directory}/settings/apache_blocks.conf" do
313   action :create_if_missing
314   owner "nominatim"
315   group "nominatim"
316   mode 0o664
317 end
318
319 file "#{build_directory}/settings/ip_blocks.map" do
320   action :create_if_missing
321   owner "nominatim"
322   group "nominatim"
323   mode 0o664
324 end
325
326 include_recipe "apache"
327
328 package "php"
329 package "php-fpm"
330 package "php-pgsql"
331 package "php-intl"
332
333 apache_module "rewrite"
334 apache_module "proxy"
335 apache_module "proxy_fcgi"
336 apache_module "proxy_http"
337 apache_module "headers"
338
339 service "php7.2-fpm" do
340   action [:enable, :start]
341   supports :status => true, :restart => true, :reload => true
342 end
343
344 node[:nominatim][:fpm_pools].each do |name, data|
345   template "/etc/php/7.2/fpm/pool.d/#{name}.conf" do
346     source "fpm.conf.erb"
347     owner "root"
348     group "root"
349     mode 0o644
350     variables data.merge(:name => name)
351     notifies :reload, "service[php7.2-fpm]"
352   end
353 end
354
355 systemd_service "apache-nominatim" do
356   service "apache2"
357   dropin "nominatim"
358   tasks_max 12000
359   notifies :restart, "service[apache2]"
360 end
361
362 ssl_certificate "nominatim.openstreetmap.org" do
363   domains ["nominatim.openstreetmap.org",
364            "nominatim.osm.org",
365            "nominatim.openstreetmap.com",
366            "nominatim.openstreetmap.net",
367            "nominatim.openstreetmaps.org",
368            "nominatim.openmaps.org"]
369   notifies :reload, "service[apache2]"
370 end
371
372 apache_site "nominatim.openstreetmap.org" do
373   template "apache.erb"
374   directory build_directory
375   variables :pools => node[:nominatim][:fpm_pools]
376   only_if { node[:nominatim][:state] != "off" }
377 end
378
379 apache_site "default" do
380   action [:disable]
381 end
382
383 template "/etc/logrotate.d/apache2" do
384   source "logrotate.apache.erb"
385   owner "root"
386   group "root"
387   mode 0o644
388 end
389
390 include_recipe "fail2ban"
391
392 munin_plugin_conf "nominatim" do
393   template "munin.erb"
394   variables :db => node[:nominatim][:dbname],
395             :querylog => "#{node[:nominatim][:logdir]}/query.log"
396 end
397
398 munin_plugin "nominatim_importlag" do
399   target "#{source_directory}/munin/nominatim_importlag"
400 end
401
402 munin_plugin "nominatim_query_speed" do
403   target "#{source_directory}/munin/nominatim_query_speed_querylog"
404 end
405
406 munin_plugin "nominatim_requests" do
407   target "#{source_directory}/munin/nominatim_requests_querylog"
408 end
409
410 munin_plugin "nominatim_throttled_ips" do
411   target "#{source_directory}/munin/nominatim_throttled_ips"
412 end
413
414 directory "#{basedir}/status" do
415   owner "nominatim"
416   group "postgres"
417   mode 0o775
418 end