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