]> git.openstreetmap.org Git - chef.git/blob - cookbooks/planet/recipes/replication.rb
68868d1921dcb751d4c964e189ad5b58815b39d2
[chef.git] / cookbooks / planet / recipes / replication.rb
1 #
2 # Cookbook:: planet
3 # Recipe:: dump
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 #     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 require "yaml"
21
22 include_recipe "accounts"
23 include_recipe "apt"
24 include_recipe "osmosis"
25 include_recipe "ruby"
26 include_recipe "tools"
27
28 db_passwords = data_bag_item("db", "passwords")
29
30 ## Install required packages
31
32 package %w[
33   postgresql-client
34   ruby-libxml
35   make
36   gcc
37   libc6-dev
38   libpq-dev
39   osmdbt
40 ]
41
42 gem_package "pg" do
43   gem_binary node[:ruby][:gem]
44 end
45
46 ## Build preload library to flush files
47
48 remote_directory "/opt/flush" do
49   source "flush"
50   owner "root"
51   group "root"
52   mode "755"
53   files_owner "root"
54   files_group "root"
55   files_mode "755"
56 end
57
58 execute "/opt/flush/Makefile" do
59   action :nothing
60   command "make"
61   cwd "/opt/flush"
62   user "root"
63   group "root"
64   subscribes :run, "remote_directory[/opt/flush]"
65 end
66
67 ## Install scripts
68
69 remote_directory "/usr/local/bin" do
70   source "replication-bin"
71   owner "root"
72   group "root"
73   mode "755"
74   files_owner "root"
75   files_group "root"
76   files_mode "755"
77 end
78
79 template "/usr/local/bin/users-agreed" do
80   source "users-agreed.erb"
81   owner "root"
82   group "root"
83   mode "755"
84 end
85
86 template "/usr/local/bin/users-deleted" do
87   source "users-deleted.erb"
88   owner "root"
89   group "root"
90   mode "755"
91 end
92
93 ## Published deleted users directory
94
95 remote_directory "/store/planet/users_deleted" do
96   source "users_deleted"
97   owner "planet"
98   group "planet"
99   mode "755"
100   files_owner "root"
101   files_group "root"
102   files_mode "644"
103 end
104
105 ## Published replication directory
106
107 remote_directory "/store/planet/replication" do
108   source "replication-cgi"
109   owner "root"
110   group "root"
111   mode "755"
112   files_owner "root"
113   files_group "root"
114   files_mode "755"
115 end
116
117 ## Configuration directory
118
119 directory "/etc/replication" do
120   owner "root"
121   group "root"
122   mode "755"
123 end
124
125 ## Transient state directory
126
127 systemd_tmpfile "/run/replication" do
128   type "d"
129   owner "planet"
130   group "planet"
131   mode "755"
132 end
133
134 ## Persistent state directory
135
136 directory "/var/lib/replication" do
137   owner "planet"
138   group "planet"
139   mode "755"
140 end
141
142 ## Temporary directory
143
144 directory "/store/replication" do
145   owner "planet"
146   group "planet"
147   mode "755"
148 end
149
150 ## Users replication
151
152 template "/etc/replication/users-agreed.conf" do
153   source "users-agreed.conf.erb"
154   user "planet"
155   group "planet"
156   mode "600"
157   variables :password => db_passwords["planetdiff"]
158 end
159
160 systemd_service "users-agreed" do
161   description "Update list of users accepting CTs"
162   user "planet"
163   exec_start "/usr/local/bin/users-agreed"
164   nice 10
165   private_tmp true
166   private_devices true
167   protect_system "strict"
168   protect_home true
169   read_write_paths "/store/planet/users_agreed"
170   restrict_address_families %w[AF_INET AF_INET6]
171   no_new_privileges true
172 end
173
174 systemd_timer "users-agreed" do
175   description "Update list of users accepting CTs"
176   on_calendar "7:00"
177 end
178
179 systemd_service "users-deleted" do
180   description "Update list of deleted users"
181   user "planet"
182   exec_start "/usr/local/bin/users-deleted"
183   nice 10
184   private_tmp true
185   private_devices true
186   protect_system "strict"
187   protect_home true
188   read_write_paths "/store/planet/users_deleted"
189   restrict_address_families %w[AF_INET AF_INET6]
190   no_new_privileges true
191 end
192
193 systemd_timer "users-deleted" do
194   description "Update list of deleted users"
195   on_calendar "17:00"
196 end
197
198 ## Changeset replication
199
200 directory "/store/planet/replication/changesets" do
201   owner "planet"
202   group "planet"
203   mode "755"
204 end
205
206 template "/etc/replication/changesets.conf" do
207   source "changesets.conf.erb"
208   user "root"
209   group "planet"
210   mode "640"
211   variables :password => db_passwords["planetdiff"]
212 end
213
214 systemd_service "replication-changesets" do
215   description "Changesets replication"
216   user "planet"
217   exec_start "/usr/local/bin/replicate-changesets /etc/replication/changesets.conf"
218   private_tmp true
219   private_devices true
220   protect_system "strict"
221   protect_home true
222   read_write_paths [
223     "/run/replication",
224     "/store/planet/replication/changesets"
225   ]
226   restrict_address_families %w[AF_INET AF_INET6]
227   no_new_privileges true
228 end
229
230 systemd_timer "replication-changesets" do
231   description "Changesets replication"
232   on_boot_sec 60
233   on_unit_active_sec 60
234   accuracy_sec 5
235 end
236
237 ## Minutely replication
238
239 directory "/store/planet/replication/minute" do
240   owner "planet"
241   group "planet"
242   mode "755"
243 end
244
245 directory "/var/lib/replication/minute" do
246   owner "planet"
247   group "planet"
248   mode "755"
249 end
250
251 directory "/store/replication/minute" do
252   owner "planet"
253   group "planet"
254   mode "755"
255 end
256
257 osmdbt_config = {
258   "database" => {
259     "host" => node[:web][:database_host],
260     "dbname" => "openstreetmap",
261     "user" => "planetdiff",
262     "password" => db_passwords["planetdiff"],
263     "replication_slot" => "osmdbt"
264   },
265   "log_dir" => "/var/lib/replication/minute",
266   "changes_dir" => "/store/planet/replication/minute",
267   "tmp_dir" => "/store/replication/minute",
268   "run_dir" => "/run/replication"
269 }
270
271 file "/etc/replication/osmdbt-config.yaml" do
272   user "root"
273   group "planet"
274   mode "640"
275   content YAML.dump(osmdbt_config)
276 end
277
278 systemd_service "replication-minutely" do
279   description "Minutely replication"
280   user "planet"
281   working_directory "/etc/replication"
282   exec_start "/usr/local/bin/replicate-minute"
283   private_tmp true
284   private_devices true
285   protect_system "strict"
286   protect_home true
287   read_write_paths [
288     "/run/replication",
289     "/store",
290     "/var/lib/replication/minute"
291   ]
292   restrict_address_families %w[AF_INET AF_INET6]
293   no_new_privileges true
294 end
295
296 systemd_timer "replication-minutely" do
297   description "Minutely replication"
298   on_boot_sec 60
299   on_unit_active_sec 60
300   accuracy_sec 5
301 end
302
303 ## Hourly replication
304
305 directory "/store/planet/replication/hour" do
306   owner "planet"
307   group "planet"
308   mode "755"
309 end
310
311 directory "/var/lib/replication/hour" do
312   owner "planet"
313   group "planet"
314   mode "755"
315 end
316
317 link "/var/lib/replication/hour/data" do
318   to "/store/planet/replication/hour"
319 end
320
321 template "/var/lib/replication/hour/configuration.txt" do
322   source "replication.config.erb"
323   owner "planet"
324   group "planet"
325   mode "644"
326   variables :base => "minute", :interval => 3600
327 end
328
329 systemd_service "replication-hourly" do
330   description "Hourly replication"
331   user "planet"
332   exec_start "/usr/local/bin/osmosis -q --merge-replication-files workingDirectory=/var/lib/replication/hour"
333   environment "LD_PRELOAD" => "/opt/flush/flush.so"
334   private_tmp true
335   private_devices true
336   protect_system "strict"
337   protect_home true
338   read_write_paths [
339     "/store/planet/replication/hour",
340     "/var/lib/replication/hour"
341   ]
342   restrict_address_families %w[AF_INET AF_INET6]
343   no_new_privileges true
344 end
345
346 systemd_timer "replication-hourly" do
347   description "Daily replication"
348   on_calendar "*-*-* *:02/15:00"
349 end
350
351 ## Daily replication
352
353 directory "/store/planet/replication/day" do
354   owner "planet"
355   group "planet"
356   mode "755"
357 end
358
359 directory "/var/lib/replication/day" do
360   owner "planet"
361   group "planet"
362   mode "755"
363 end
364
365 link "/var/lib/replication/day/data" do
366   to "/store/planet/replication/day"
367 end
368
369 template "/var/lib/replication/day/configuration.txt" do
370   source "replication.config.erb"
371   owner "planet"
372   group "planet"
373   mode "644"
374   variables :base => "hour", :interval => 86400
375 end
376
377 systemd_service "replication-daily" do
378   description "Daily replication"
379   user "planet"
380   exec_start "/usr/local/bin/osmosis -q --merge-replication-files workingDirectory=/var/lib/replication/day"
381   environment "LD_PRELOAD" => "/opt/flush/flush.so"
382   private_tmp true
383   private_devices true
384   protect_system "strict"
385   protect_home true
386   read_write_paths [
387     "/store/planet/replication/day",
388     "/var/lib/replication/day"
389   ]
390   restrict_address_families %w[AF_INET AF_INET6]
391   no_new_privileges true
392 end
393
394 systemd_timer "replication-daily" do
395   description "Daily replication"
396   on_calendar "*-*-* *:02/15:00"
397 end
398
399 ## Replication cleanup
400
401 systemd_service "replication-cleanup" do
402   description "Cleanup replication"
403   user "planet"
404   exec_start "/usr/local/bin/replicate-cleanup"
405   private_tmp true
406   private_devices true
407   private_network true
408   protect_system "strict"
409   protect_home true
410   read_write_paths "/var/lib/replication"
411   no_new_privileges true
412 end
413
414 systemd_timer "replication-cleanup" do
415   description "Cleanup replication"
416   on_boot_sec 60
417   on_unit_active_sec 86400
418   accuracy_sec 1800
419 end
420
421 ## Enable/disable feeds
422
423 if node[:planet][:replication] == "enabled"
424   service "users-agreed.timer" do
425     action [:enable, :start]
426   end
427
428   service "users-deleted.timer" do
429     action [:enable, :start]
430   end
431
432   service "replication-changesets.timer" do
433     action [:enable, :start]
434   end
435
436   service "replication-minutely.timer" do
437     action [:enable, :start]
438   end
439
440   service "replication-hourly.timer" do
441     action [:enable, :start]
442   end
443
444   service "replication-daily.timer" do
445     action [:enable, :start]
446   end
447
448   service "replication-cleanup.timer" do
449     action [:enable, :start]
450   end
451 else
452   service "users-agreed.timer" do
453     action [:stop, :disable]
454   end
455
456   service "users-deleted.timer" do
457     action [:stop, :disable]
458   end
459
460   service "replication-changesets.timer" do
461     action [:stop, :disable]
462   end
463
464   service "replication-minutely.timer" do
465     action [:stop, :disable]
466   end
467
468   service "replication-hourly.timer" do
469     action [:stop, :disable]
470   end
471
472   service "replication-daily.timer" do
473     action [:stop, :disable]
474   end
475
476   service "replication-cleanup.timer" do
477     action [:stop, :disable]
478   end
479 end