]> git.openstreetmap.org Git - chef.git/blob - cookbooks/planet/recipes/replication.rb
Renice background services
[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 "full"
168   protect_home true
169   restrict_address_families %w[AF_INET AF_INET6]
170   no_new_privileges true
171 end
172
173 systemd_timer "users-agreed" do
174   description "Update list of users accepting CTs"
175   on_calendar "7:00"
176 end
177
178 systemd_service "users-deleted" do
179   description "Update list of deleted users"
180   user "planet"
181   exec_start "/usr/local/bin/users-deleted"
182   nice 10
183   private_tmp true
184   private_devices true
185   protect_system "full"
186   protect_home true
187   restrict_address_families %w[AF_INET AF_INET6]
188   no_new_privileges true
189 end
190
191 systemd_timer "users-deleted" do
192   description "Update list of deleted users"
193   on_calendar "17:00"
194 end
195
196 ## Changeset replication
197
198 directory "/store/planet/replication/changesets" do
199   owner "planet"
200   group "planet"
201   mode "755"
202 end
203
204 template "/etc/replication/changesets.conf" do
205   source "changesets.conf.erb"
206   user "root"
207   group "planet"
208   mode "640"
209   variables :password => db_passwords["planetdiff"]
210 end
211
212 systemd_service "replication-changesets" do
213   description "Changesets replication"
214   user "planet"
215   exec_start "/usr/local/bin/replicate-changesets /etc/replication/changesets.conf"
216   private_tmp true
217   private_devices true
218   protect_system "full"
219   protect_home true
220   restrict_address_families %w[AF_INET AF_INET6]
221   no_new_privileges true
222 end
223
224 systemd_timer "replication-changesets" do
225   description "Changesets replication"
226   on_boot_sec 60
227   on_unit_active_sec 60
228   accuracy_sec 5
229 end
230
231 ## Minutely replication
232
233 directory "/store/planet/replication/minute" do
234   owner "planet"
235   group "planet"
236   mode "755"
237 end
238
239 directory "/var/lib/replication/minute" do
240   owner "planet"
241   group "planet"
242   mode "755"
243 end
244
245 directory "/store/replication/minute" do
246   owner "planet"
247   group "planet"
248   mode "755"
249 end
250
251 osmdbt_config = {
252   "database" => {
253     "host" => node[:web][:database_host],
254     "dbname" => "openstreetmap",
255     "user" => "planetdiff",
256     "password" => db_passwords["planetdiff"],
257     "replication_slot" => "osmdbt"
258   },
259   "log_dir" => "/var/lib/replication/minute",
260   "changes_dir" => "/store/planet/replication/minute",
261   "tmp_dir" => "/store/replication/minute",
262   "run_dir" => "/run/replication"
263 }
264
265 file "/etc/replication/osmdbt-config.yaml" do
266   user "root"
267   group "planet"
268   mode "640"
269   content YAML.dump(osmdbt_config)
270 end
271
272 systemd_service "replication-minutely" do
273   description "Minutely replication"
274   user "planet"
275   working_directory "/etc/replication"
276   exec_start "/usr/local/bin/replicate-minute"
277   private_tmp true
278   private_devices true
279   protect_system "full"
280   protect_home true
281   restrict_address_families %w[AF_INET AF_INET6]
282   no_new_privileges true
283 end
284
285 systemd_timer "replication-minutely" do
286   description "Minutely replication"
287   on_boot_sec 60
288   on_unit_active_sec 60
289   accuracy_sec 5
290 end
291
292 ## Hourly replication
293
294 directory "/store/planet/replication/hour" do
295   owner "planet"
296   group "planet"
297   mode "755"
298 end
299
300 directory "/var/lib/replication/hour" do
301   owner "planet"
302   group "planet"
303   mode "755"
304 end
305
306 link "/var/lib/replication/hour/data" do
307   to "/store/planet/replication/hour"
308 end
309
310 template "/var/lib/replication/hour/configuration.txt" do
311   source "replication.config.erb"
312   owner "planet"
313   group "planet"
314   mode "644"
315   variables :base => "minute", :interval => 3600
316 end
317
318 systemd_service "replication-hourly" do
319   description "Hourly replication"
320   user "planet"
321   exec_start "/usr/local/bin/osmosis -q --merge-replication-files workingDirectory=/var/lib/replication/hour"
322   environment "LD_PRELOAD" => "/opt/flush/flush.so"
323   private_tmp true
324   private_devices true
325   protect_system "full"
326   protect_home true
327   restrict_address_families %w[AF_INET AF_INET6]
328   no_new_privileges true
329 end
330
331 systemd_timer "replication-hourly" do
332   description "Daily replication"
333   on_calendar "*-*-* *:02/15:00"
334 end
335
336 ## Daily replication
337
338 directory "/store/planet/replication/day" do
339   owner "planet"
340   group "planet"
341   mode "755"
342 end
343
344 directory "/var/lib/replication/day" do
345   owner "planet"
346   group "planet"
347   mode "755"
348 end
349
350 link "/var/lib/replication/day/data" do
351   to "/store/planet/replication/day"
352 end
353
354 template "/var/lib/replication/day/configuration.txt" do
355   source "replication.config.erb"
356   owner "planet"
357   group "planet"
358   mode "644"
359   variables :base => "hour", :interval => 86400
360 end
361
362 systemd_service "replication-daily" do
363   description "Daily replication"
364   user "planet"
365   exec_start "/usr/local/bin/osmosis -q --merge-replication-files workingDirectory=/var/lib/replication/day"
366   environment "LD_PRELOAD" => "/opt/flush/flush.so"
367   private_tmp true
368   private_devices true
369   protect_system "full"
370   protect_home true
371   restrict_address_families %w[AF_INET AF_INET6]
372   no_new_privileges true
373 end
374
375 systemd_timer "replication-daily" do
376   description "Daily replication"
377   on_calendar "*-*-* *:02/15:00"
378 end
379
380 ## Replication cleanup
381
382 systemd_service "replication-cleanup" do
383   description "Cleanup replication"
384   user "planet"
385   exec_start "/usr/local/bin/replicate-cleanup"
386   private_tmp true
387   private_devices true
388   private_network true
389   protect_system "full"
390   protect_home true
391   no_new_privileges true
392 end
393
394 systemd_timer "replication-cleanup" do
395   description "Cleanup replication"
396   on_boot_sec 60
397   on_unit_active_sec 86400
398   accuracy_sec 1800
399 end
400
401 ## Enable/disable feeds
402
403 if node[:planet][:replication] == "enabled"
404   service "users-agreed.timer" do
405     action [:enable, :start]
406   end
407
408   service "users-deleted.timer" do
409     action [:enable, :start]
410   end
411
412   service "replication-changesets.timer" do
413     action [:enable, :start]
414   end
415
416   service "replication-minutely.timer" do
417     action [:enable, :start]
418   end
419
420   service "replication-hourly.timer" do
421     action [:enable, :start]
422   end
423
424   service "replication-daily.timer" do
425     action [:enable, :start]
426   end
427
428   service "replication-cleanup.timer" do
429     action [:enable, :start]
430   end
431 else
432   service "users-agreed.timer" do
433     action [:stop, :disable]
434   end
435
436   service "users-deleted.timer" do
437     action [:stop, :disable]
438   end
439
440   service "replication-changesets.timer" do
441     action [:stop, :disable]
442   end
443
444   service "replication-minutely.timer" do
445     action [:stop, :disable]
446   end
447
448   service "replication-hourly.timer" do
449     action [:stop, :disable]
450   end
451
452   service "replication-daily.timer" do
453     action [:stop, :disable]
454   end
455
456   service "replication-cleanup.timer" do
457     action [:stop, :disable]
458   end
459 end