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