]> git.openstreetmap.org Git - chef.git/blob - cookbooks/letsencrypt/recipes/default.rb
Use volume for nested podman container storage
[chef.git] / cookbooks / letsencrypt / recipes / default.rb
1 #
2 # Cookbook:: letsencrypt
3 # Recipe:: default
4 #
5 # Copyright:: 2017, 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 "apache"
21 include_recipe "chef::knife"
22 include_recipe "ruby"
23
24 keys = data_bag_item("chef", "keys")
25
26 package "certbot"
27
28 group "letsencrypt" do
29   gid 526
30   append true
31 end
32
33 user "letsencrypt" do
34   uid 526
35   gid 526
36   comment "Let's Encrypt"
37   home "/srv/acme.openstreetmap.org"
38   shell "/usr/sbin/nologin"
39   manage_home false
40 end
41
42 directory "/etc/letsencrypt" do
43   owner "letsencrypt"
44   group "letsencrypt"
45   mode "755"
46 end
47
48 directory "/var/lib/letsencrypt" do
49   owner "letsencrypt"
50   group "letsencrypt"
51   mode "755"
52 end
53
54 directory "/var/log/letsencrypt" do
55   owner "letsencrypt"
56   group "letsencrypt"
57   mode "700"
58 end
59
60 directory "/srv/acme.openstreetmap.org" do
61   owner "letsencrypt"
62   group "letsencrypt"
63   mode "755"
64 end
65
66 directory "/srv/acme.openstreetmap.org/html" do
67   owner "letsencrypt"
68   group "letsencrypt"
69   mode "755"
70 end
71
72 ssl_certificate "acme.openstreetmap.org" do
73   domains ["acme.openstreetmap.org", "acme.osm.org"]
74   notifies :reload, "service[apache2]"
75 end
76
77 apache_site "acme.openstreetmap.org" do
78   template "apache.erb"
79   directory "/srv/acme.openstreetmap.org"
80 end
81
82 directory "/srv/acme.openstreetmap.org/config" do
83   owner "letsencrypt"
84   group "letsencrypt"
85   mode "755"
86 end
87
88 directory "/srv/acme.openstreetmap.org/work" do
89   owner "letsencrypt"
90   group "letsencrypt"
91   mode "755"
92 end
93
94 directory "/srv/acme.openstreetmap.org/logs" do
95   owner "letsencrypt"
96   group "letsencrypt"
97   mode "700"
98 end
99
100 directory "/srv/acme.openstreetmap.org/.cinc" do
101   owner "letsencrypt"
102   group "letsencrypt"
103   mode "2775"
104 end
105
106 file "/srv/acme.openstreetmap.org/.cinc/client.pem" do
107   content keys["letsencrypt"].join("\n")
108   owner "letsencrypt"
109   group "letsencrypt"
110   mode "660"
111 end
112
113 cookbook_file "/srv/acme.openstreetmap.org/.cinc/knife.rb" do
114   source "knife.rb"
115   owner "letsencrypt"
116   group "letsencrypt"
117   mode "660"
118 end
119
120 remote_directory "/srv/acme.openstreetmap.org/bin" do
121   source "bin"
122   owner "root"
123   group "root"
124   mode "755"
125   files_owner "root"
126   files_group "root"
127   files_mode "755"
128 end
129
130 template "/srv/acme.openstreetmap.org/bin/upload" do
131   source "upload.erb"
132   owner "root"
133   group "root"
134   mode "755"
135 end
136
137 directory "/srv/acme.openstreetmap.org/requests" do
138   owner "root"
139   group "root"
140   mode "755"
141 end
142
143 certificates = search(:node, "letsencrypt:certificates").each_with_object({}) do |n, c|
144   n[:letsencrypt][:certificates].each do |name, details|
145     c[name] ||= details.merge(:nodes => [])
146
147     c[name][:nodes] << {
148       :name => n[:fqdn],
149       :address => n.external_ipaddress || n.internal_ipaddress
150     }
151   end
152 end
153
154 certificates.each do |name, details|
155   certificate_path = "/srv/acme.openstreetmap.org/config/live/#{name}/fullchain.pem"
156
157   template "/srv/acme.openstreetmap.org/requests/#{name}" do
158     source "request.erb"
159     owner "root"
160     group "letsencrypt"
161     mode "754"
162     variables details
163   end
164
165   # This is used to trigger the execute request resource if certificate does not exist yet
166   notify_group "letsencrypt-request-#{name}" do
167     action :run
168     not_if { ::File.exist?(certificate_path) }
169   end
170
171   execute "/srv/acme.openstreetmap.org/requests/#{name}" do
172     action :nothing
173     command "/srv/acme.openstreetmap.org/requests/#{name}"
174     cwd "/srv/acme.openstreetmap.org"
175     user "letsencrypt"
176     group "letsencrypt"
177     subscribes :run, "template[/srv/acme.openstreetmap.org/requests/#{name}]"
178     subscribes :run, "notify_group[letsencrypt-request-#{name}]"
179     not_if { kitchen? }
180   end
181 end
182
183 Dir.glob("*", :base => "/srv/acme.openstreetmap.org/requests") do |name|
184   next if certificates.include?(name)
185
186   file "/srv/acme.openstreetmap.org/requests/#{name}" do
187     action :delete
188   end
189
190   execute "certbot-delete-#{name}" do
191     command "/usr/bin/certbot delete --config-dir /srv/acme.openstreetmap.org/config --work-dir /srv/acme.openstreetmap.org/work --logs-dir /srv/acme.openstreetmap.org/logs --cert-name #{name}"
192     cwd "/srv/acme.openstreetmap.org"
193     user "letsencrypt"
194     group "letsencrypt"
195   end
196 end
197
198 template "/srv/acme.openstreetmap.org/bin/check-certificate" do
199   source "check-certificate.erb"
200   owner "root"
201   group "root"
202   mode "755"
203 end
204
205 template "/srv/acme.openstreetmap.org/bin/check-certificates" do
206   source "check-certificates.erb"
207   owner "root"
208   group "root"
209   mode "755"
210   variables :certificates => certificates
211 end
212
213 systemd_service "letsencrypt-renew" do
214   description "Renew letsencrypt certificates"
215   exec_start "/srv/acme.openstreetmap.org/bin/renew"
216   user "letsencrypt"
217   sandbox :enable_network => true
218   read_write_paths [
219     "/srv/acme.openstreetmap.org/config",
220     "/srv/acme.openstreetmap.org/html",
221     "/srv/acme.openstreetmap.org/logs",
222     "/srv/acme.openstreetmap.org/work"
223   ]
224 end
225
226 systemd_timer "letsencrypt-renew" do
227   description "Renew letsencrypt certificates"
228   on_boot_sec "1h"
229   on_unit_inactive_sec "12h"
230 end
231
232 service "letsencrypt-renew.timer" do
233   action [:enable, :start]
234 end
235
236 systemd_service "letsencrypt-check" do
237   description "Check letsencrypt certificates"
238   exec_start "/srv/acme.openstreetmap.org/bin/check-certificates"
239   user "letsencrypt"
240   sandbox :enable_network => true
241 end
242
243 systemd_timer "letsencrypt-check" do
244   description "Check letsencrypt certificates"
245   on_boot_sec "2h"
246   on_unit_inactive_sec "12h"
247 end
248
249 service "letsencrypt-check.timer" do
250   action [:enable, :start]
251 end
252
253 template "/etc/logrotate.d/letsencrypt" do
254   source "logrotate.erb"
255   owner "root"
256   group "root"
257   mode "644"
258 end