3590fc94d106b7f2160687c5068d52dffad62f98
[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 "accounts"
21 include_recipe "apache"
22
23 keys = data_bag_item("chef", "keys")
24
25 package %w[
26   certbot
27   ruby
28 ]
29
30 directory "/etc/letsencrypt" do
31   owner "letsencrypt"
32   group "letsencrypt"
33   mode "755"
34 end
35
36 directory "/var/lib/letsencrypt" do
37   owner "letsencrypt"
38   group "letsencrypt"
39   mode "755"
40 end
41
42 directory "/var/log/letsencrypt" do
43   owner "letsencrypt"
44   group "letsencrypt"
45   mode "700"
46 end
47
48 directory "/srv/acme.openstreetmap.org" do
49   owner "letsencrypt"
50   group "letsencrypt"
51   mode "755"
52 end
53
54 directory "/srv/acme.openstreetmap.org/html" do
55   owner "letsencrypt"
56   group "letsencrypt"
57   mode "755"
58 end
59
60 ssl_certificate "acme.openstreetmap.org" do
61   domains ["acme.openstreetmap.org", "acme.osm.org"]
62   notifies :reload, "service[apache2]"
63 end
64
65 apache_site "acme.openstreetmap.org" do
66   template "apache.erb"
67   directory "/srv/acme.openstreetmap.org"
68 end
69
70 directory "/srv/acme.openstreetmap.org/config" do
71   owner "letsencrypt"
72   group "letsencrypt"
73   mode "755"
74 end
75
76 directory "/srv/acme.openstreetmap.org/work" do
77   owner "letsencrypt"
78   group "letsencrypt"
79   mode "755"
80 end
81
82 directory "/srv/acme.openstreetmap.org/logs" do
83   owner "letsencrypt"
84   group "letsencrypt"
85   mode "700"
86 end
87
88 directory "/srv/acme.openstreetmap.org/.chef" do
89   owner "letsencrypt"
90   group "letsencrypt"
91   mode "2775"
92 end
93
94 file "/srv/acme.openstreetmap.org/.chef/client.pem" do
95   content keys["letsencrypt"].join("\n")
96   owner "letsencrypt"
97   group "letsencrypt"
98   mode "660"
99 end
100
101 cookbook_file "/srv/acme.openstreetmap.org/.chef/knife.rb" do
102   source "knife.rb"
103   owner "letsencrypt"
104   group "letsencrypt"
105   mode "660"
106 end
107
108 remote_directory "/srv/acme.openstreetmap.org/bin" do
109   source "bin"
110   owner "root"
111   group "root"
112   mode "755"
113   files_owner "root"
114   files_group "root"
115   files_mode "755"
116 end
117
118 directory "/srv/acme.openstreetmap.org/requests" do
119   owner "root"
120   group "root"
121   mode "755"
122 end
123
124 certificates = search(:node, "letsencrypt:certificates").each_with_object({}) do |n, c|
125   n[:letsencrypt][:certificates].each do |name, details|
126     c[name] ||= details.merge(:nodes => [])
127
128     c[name][:nodes] << {
129       :name => n[:fqdn],
130       :address => n.external_ipaddress || n.internal_ipaddress
131     }
132   end
133 end
134
135 certificates.each do |name, details|
136   template "/srv/acme.openstreetmap.org/requests/#{name}" do
137     source "request.erb"
138     owner "root"
139     group "letsencrypt"
140     mode "754"
141     variables details
142   end
143
144   execute "/srv/acme.openstreetmap.org/requests/#{name}" do
145     action :nothing
146     command "/srv/acme.openstreetmap.org/requests/#{name}"
147     cwd "/srv/acme.openstreetmap.org"
148     user "letsencrypt"
149     group "letsencrypt"
150     subscribes :run, "template[/srv/acme.openstreetmap.org/requests/#{name}]"
151     not_if { ENV["TEST_KITCHEN"] }
152   end
153 end
154
155 Dir.glob("*", :base => "/srv/acme.openstreetmap.org/requests") do |name|
156   next if certificates.include?(name)
157
158   file "/srv/acme.openstreetmap.org/requests/#{name}" do
159     action :delete
160   end
161
162   execute "certbot-delete-#{name}" do
163     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}"
164     cwd "/srv/acme.openstreetmap.org"
165     user "letsencrypt"
166     group "letsencrypt"
167   end
168 end
169
170 template "/srv/acme.openstreetmap.org/bin/check-certificates" do
171   source "check-certificates.erb"
172   owner "root"
173   group "root"
174   mode "755"
175   variables :certificates => certificates
176 end
177
178 cron_d "letencrypt-renew" do
179   minute "00"
180   hour "*/12"
181   user "letsencrypt"
182   command "/srv/acme.openstreetmap.org/bin/renew"
183   mailto "admins@openstreetmap.org"
184 end
185
186 cron_d "letencrypt-check" do
187   minute "30"
188   hour "*/12"
189   user "letsencrypt"
190   command "/srv/acme.openstreetmap.org/bin/check-certificates"
191   mailto "admins@openstreetmap.org"
192 end