]> git.openstreetmap.org Git - chef.git/blob - cookbooks/dev/recipes/default.rb
Convert letsencrypt to use systemd timers
[chef.git] / cookbooks / dev / recipes / default.rb
1 #
2 # Cookbook:: dev
3 # Recipe:: default
4 #
5 # Copyright:: 2011, 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 require "securerandom"
22
23 include_recipe "apache"
24 include_recipe "passenger"
25 include_recipe "geoipupdate"
26 include_recipe "git"
27 include_recipe "memcached"
28 include_recipe "munin"
29 include_recipe "mysql"
30 include_recipe "nodejs"
31 include_recipe "php::fpm"
32 include_recipe "postgresql"
33 include_recipe "python"
34 include_recipe "ruby"
35
36 package %w[
37   ant
38   default-jdk-headless
39   default-jre-headless
40   golang
41   composer
42   php-apcu
43   php-cgi
44   php-cli
45   php-curl
46   php-db
47   php-gd
48   php-igbinary
49   php-imagick
50   php-intl
51   php-mbstring
52   php-memcache
53   php-mysql
54   php-pear
55   php-pgsql
56   php-sqlite3
57   php-xml
58   pngcrush
59   pngquant
60   python3
61   python3-brotli
62   python3-bs4
63   python3-cheetah
64   python3-dateutil
65   python3-dev
66   python3-dotenv
67   python3-lxml
68   python3-lz4
69   python3-magic
70   python3-pil
71   python3-psycopg2
72   python3-pyproj
73   python3-gdal
74   gdal-bin
75   proj-bin
76   g++
77   gcc
78   make
79   autoconf
80   automake
81   libtool
82   libargon2-dev
83   libfcgi-dev
84   libxml2-dev
85   libmemcached-dev
86   libboost-dev
87   libboost-regex-dev
88   libboost-system-dev
89   libboost-program-options-dev
90   libboost-date-time-dev
91   libboost-filesystem-dev
92   libboost-locale-dev
93   libpqxx-dev
94   libcrypto++-dev
95   libyajl-dev
96   libfmt-dev
97   zlib1g-dev
98   nano
99   osm2pgsql
100   osmosis
101   at
102   awscli
103   mailutils
104   lua-any
105   luajit
106   fonts-dejavu
107   fonts-dejavu-core
108   fonts-dejavu-extra
109   fonts-droid-fallback
110   fonts-liberation
111   fonts-noto-mono
112   gnuplot-nox
113   graphviz
114   irssi
115   jq
116   lz4
117   lzip
118   lzop
119   pbzip2
120   pigz
121   unrar
122   unzip
123   zip
124   netcat
125   tmux
126   whois
127   redis
128   r-base
129   pandoc
130 ]
131
132 # Add uk_os_OSTN15_NTv2_OSGBtoETRS.tif used for reprojecting OS data
133 execute "uk_os_OSTN15_NTv2_OSGBtoETRS.tif" do
134   command "projsync --file uk_os_OSTN15_NTv2_OSGBtoETRS.tif --system-directory"
135   not_if { ::File.exist?("/usr/share/proj/uk_os_OSTN15_NTv2_OSGBtoETRS.tif") }
136 end
137
138 nodejs_package "svgo"
139
140 python_package "geojson" do
141   python_version "3"
142 end
143
144 apache_module "env"
145 apache_module "expires"
146 apache_module "headers"
147 apache_module "proxy"
148 apache_module "proxy_fcgi"
149 apache_module "rewrite"
150 apache_module "suexec"
151 apache_module "userdir"
152
153 apache_module "wsgi" do
154   package "libapache2-mod-wsgi-py3"
155 end
156
157 package "apache2-suexec-pristine"
158
159 php_fpm "default" do
160   pm_max_children 10
161   pm_start_servers 4
162   pm_min_spare_servers 2
163   pm_max_spare_servers 6
164 end
165
166 php_fpm "www" do
167   action :delete
168 end
169
170 directory "/srv/dev.openstreetmap.org" do
171   owner "root"
172   group "root"
173   mode "755"
174 end
175
176 template "/srv/dev.openstreetmap.org/index.html" do
177   source "dev.html.erb"
178   owner "root"
179   group "root"
180   mode "644"
181 end
182
183 ssl_certificate "dev.openstreetmap.org" do
184   domains "dev.openstreetmap.org"
185   notifies :reload, "service[apache2]"
186 end
187
188 apache_site "dev.openstreetmap.org" do
189   template "apache.dev.erb"
190 end
191
192 package "phppgadmin"
193
194 template "/etc/phppgadmin/config.inc.php" do
195   source "phppgadmin.conf.erb"
196   owner "root"
197   group "root"
198   mode "644"
199 end
200
201 file "/etc/apache2/conf.d/phppgadmin" do
202   action :delete
203 end
204
205 ssl_certificate "phppgadmin.dev.openstreetmap.org" do
206   domains "phppgadmin.dev.openstreetmap.org"
207   notifies :reload, "service[apache2]"
208 end
209
210 apache_site "phppgadmin.dev.openstreetmap.org" do
211   template "apache.phppgadmin.erb"
212 end
213
214 search(:accounts, "*:*").each do |account|
215   name = account["id"]
216   details = node[:accounts][:users][name] || {}
217
218   next unless %w[user administrator].include?(details[:status])
219
220   user_home = details[:home] || account["home"] || "#{node[:accounts][:home]}/#{name}"
221
222   next unless File.directory?("#{user_home}/public_html")
223
224   php_fpm name do
225     user name
226     group name
227     pm_max_children 10
228     pm_start_servers 4
229     pm_min_spare_servers 2
230     pm_max_spare_servers 6
231     pm_max_requests 10000
232     request_terminate_timeout 1800
233     environment "HOSTNAME" => "$HOSTNAME",
234                 "PATH" => "/usr/local/bin:/usr/bin:/bin",
235                 "TMP" => "/tmp",
236                 "TMPDIR" => "/tmp",
237                 "TEMP" => "/tmp"
238     php_values "max_execution_time" => "300",
239                "memory_limit" => "128M",
240                "post_max_size" => "32M",
241                "upload_max_filesize" => "32M"
242     php_admin_values "sendmail_path" => "/usr/sbin/sendmail -t -i -f #{name}@dev.openstreetmap.org",
243                      "open_basedir" => "/home/#{name}/:/tmp/:/usr/share/php/"
244     php_flags "display_errors" => "on"
245   end
246
247   ssl_certificate "#{name}.dev.openstreetmap.org" do
248     domains ["#{name}.dev.openstreetmap.org", "#{name}.dev.osm.org"]
249     notifies :reload, "service[apache2]"
250   end
251
252   apache_site "#{name}.dev.openstreetmap.org" do
253     template "apache.user.erb"
254     directory "#{user_home}/public_html"
255     variables :user => name
256   end
257
258   template "/etc/sudoers.d/#{name}" do
259     source "sudoers.user.erb"
260     owner "root"
261     group "root"
262     mode "440"
263     variables :user => name
264   end
265 end
266
267 node[:postgresql][:versions].each do |version|
268   package "postgresql-#{version}-postgis-3"
269 end
270
271 if node[:postgresql][:clusters][:"14/main"]
272   postgresql_user "apis" do
273     cluster "14/main"
274   end
275
276   template "/usr/local/bin/cleanup-rails-assets" do
277     cookbook "web"
278     source "cleanup-assets.erb"
279     owner "root"
280     group "root"
281     mode "755"
282   end
283
284   systemd_service "rails-jobs@" do
285     description "Rails job queue runner"
286     type "simple"
287     environment "RAILS_ENV" => "production", "SLEEP_DELAY" => "60"
288     user "apis"
289     working_directory "/srv/%i.apis.dev.openstreetmap.org/rails"
290     exec_start "#{node[:ruby][:bundle]} exec rails jobs:work"
291     restart "on-failure"
292     nice 10
293     sandbox :enable_network => true
294     restrict_address_families "AF_UNIX"
295     memory_deny_write_execute false
296     read_write_paths "/srv/%i.apis.dev.openstreetmap.org/logs"
297   end
298
299   systemd_service "cgimap@" do
300     description "OpenStreetMap API Server"
301     type "forking"
302     environment_file "/etc/default/cgimap-%i"
303     user "apis"
304     exec_start "/srv/%i.apis.dev.openstreetmap.org/cgimap/openstreetmap-cgimap --daemon --port $CGIMAP_PORT --instances 5"
305     exec_reload "/bin/kill -HUP $MAINPID"
306     sandbox :enable_network => true
307     restrict_address_families "AF_UNIX"
308     read_write_paths ["/srv/%i.apis.dev.openstreetmap.org/logs", "/srv/%i.apis.dev.openstreetmap.org/rails/tmp"]
309     restart "on-failure"
310   end
311
312   cgimap_port = 9000
313
314   Dir.glob("/srv/*.apis.dev.openstreetmap.org").each do |dir|
315     node.default_unless[:dev][:rails][File.basename(dir).split(".").first] = {}
316   end
317
318   node[:dev][:rails].each do |name, details|
319     database_name = details[:database] || "apis_#{name}"
320     site_name = "#{name}.apis.dev.openstreetmap.org"
321     site_directory = "/srv/#{name}.apis.dev.openstreetmap.org"
322     log_directory = "#{site_directory}/logs"
323     rails_directory = "#{site_directory}/rails"
324     cgimap_directory = "#{site_directory}/cgimap"
325     gpx_directory = "#{site_directory}/gpx"
326
327     if details[:repository]
328       site_aliases = details[:aliases] || []
329       secret_key_base = persistent_token("dev", "rails", name, "secret_key_base")
330
331       postgresql_database database_name do
332         cluster "14/main"
333         owner "apis"
334       end
335
336       postgresql_extension "#{database_name}_btree_gist" do
337         cluster "14/main"
338         database database_name
339         extension "btree_gist"
340       end
341
342       directory site_directory do
343         owner "apis"
344         group "apis"
345         mode "755"
346       end
347
348       directory log_directory do
349         owner "apis"
350         group "apis"
351         mode "755"
352       end
353
354       directory gpx_directory do
355         owner "apis"
356         group "apis"
357         mode "755"
358       end
359
360       directory "#{gpx_directory}/traces" do
361         owner "apis"
362         group "apis"
363         mode "755"
364       end
365
366       directory "#{gpx_directory}/images" do
367         owner "apis"
368         group "apis"
369         mode "755"
370       end
371
372       rails_port site_name do
373         directory rails_directory
374         user "apis"
375         group "apis"
376         repository details[:repository]
377         revision details[:revision]
378         database_port node[:postgresql][:clusters][:"14/main"][:port]
379         database_name database_name
380         database_username "apis"
381         email_from "OpenStreetMap <web@noreply.openstreetmap.org>"
382         gpx_dir gpx_directory
383         log_path "#{log_directory}/rails.log"
384         memcache_servers ["127.0.0.1"]
385         csp_enforce true
386         run_migrations true
387         trace_use_job_queue true
388       end
389
390       template "#{rails_directory}/config/initializers/setup.rb" do
391         source "rails.setup.rb.erb"
392         owner "apis"
393         group "apis"
394         mode "644"
395         variables :site => site_name
396         notifies :restart, "rails_port[#{site_name}]"
397       end
398
399       service "rails-jobs@#{name}" do
400         action [:enable, :start]
401         supports :restart => true
402         subscribes :restart, "rails_port[#{site_name}]"
403         subscribes :restart, "systemd_service[rails-jobs@]"
404         only_if "fgrep -q delayed_job #{rails_directory}/Gemfile.lock"
405       end
406
407       if details[:cgimap_repository]
408         git cgimap_directory do
409           action :sync
410           repository details[:cgimap_repository]
411           revision details[:cgimap_revision]
412           user "apis"
413           group "apis"
414         end
415
416         execute "#{cgimap_directory}/autogen.sh" do
417           action :nothing
418           command "./autogen.sh"
419           cwd cgimap_directory
420           user "apis"
421           group "apis"
422           subscribes :run, "git[#{cgimap_directory}]", :immediately
423         end
424
425         execute "#{cgimap_directory}/configure" do
426           action :nothing
427           command "./configure --with-fcgi=/usr --with-boost-libdir=/usr/lib/x86_64-linux-gnu --enable-yajl"
428           cwd cgimap_directory
429           user "apis"
430           group "apis"
431           subscribes :run, "execute[#{cgimap_directory}/autogen.sh]", :immediately
432         end
433
434         execute "#{cgimap_directory}/Makefile" do
435           action :nothing
436           command "make -j"
437           cwd cgimap_directory
438           user "apis"
439           group "apis"
440           subscribes :run, "execute[#{cgimap_directory}/configure]", :immediately
441         end
442
443         template "/etc/default/cgimap-#{name}" do
444           source "cgimap.environment.erb"
445           owner "root"
446           group "root"
447           mode "640"
448           variables :cgimap_port => cgimap_port,
449                     :database_port => node[:postgresql][:clusters][:"14/main"][:port],
450                     :database_name => database_name,
451                     :log_directory => log_directory
452         end
453
454         service "cgimap@#{name}" do
455           action [:start, :enable]
456           subscribes :restart, "execute[#{cgimap_directory}/Makefile]"
457           subscribes :restart, "template[/etc/default/cgimap-#{name}]"
458           subscribes :restart, "systemd_service[cgimap@]"
459         end
460       end
461
462       ssl_certificate site_name do
463         domains [site_name] + site_aliases
464         notifies :reload, "service[apache2]"
465       end
466
467       apache_site site_name do
468         template "apache.rails.erb"
469         variables :application_name => name,
470                   :aliases => site_aliases,
471                   :secret_key_base => secret_key_base,
472                   :cgimap_enabled => details.key?(:cgimap_repository),
473                   :cgimap_port => cgimap_port
474       end
475
476       template "/etc/logrotate.d/apis-#{name}" do
477         source "logrotate.apis.erb"
478         owner "root"
479         group "root"
480         mode "644"
481         variables :name => name,
482                   :log_directory => log_directory,
483                   :rails_directory => rails_directory
484       end
485
486       cgimap_port += 1
487     else
488       file "/etc/logrotate.d/apis-#{name}" do
489         action :delete
490       end
491
492       apache_site site_name do
493         action [:delete]
494       end
495
496       service "cgimap@#{name}" do
497         action [:stop, :disable]
498       end
499
500       file "/etc/default/cgimap-#{name}" do
501         action :delete
502       end
503
504       service "rails-jobs@#{name}" do
505         action [:stop, :disable]
506       end
507
508       directory site_directory do
509         action :delete
510         recursive true
511       end
512
513       file "/etc/cron.daily/rails-#{site_name.tr('.', '-')}" do
514         action :delete
515       end
516
517       postgresql_database database_name do
518         action :drop
519         cluster "14/main"
520       end
521     end
522   end
523
524   directory "/srv/apis.dev.openstreetmap.org" do
525     owner "apis"
526     group "apis"
527     mode "755"
528   end
529
530   template "/srv/apis.dev.openstreetmap.org/index.html" do
531     source "apis.html.erb"
532     owner "apis"
533     group "apis"
534     mode "644"
535   end
536
537   ssl_certificate "apis.dev.openstreetmap.org" do
538     domains "apis.dev.openstreetmap.org"
539     notifies :reload, "service[apache2]"
540   end
541
542   apache_site "apis.dev.openstreetmap.org" do
543     template "apache.apis.erb"
544   end
545
546   node[:postgresql][:clusters].each_key do |name|
547     postgresql_munin name do
548       cluster name
549       database "ALL"
550     end
551   end
552 end
553
554 directory "/srv/ooc.openstreetmap.org" do
555   owner "root"
556   group "root"
557   mode "755"
558 end
559
560 remote_directory "/srv/ooc.openstreetmap.org/html" do
561   source "ooc"
562   owner "root"
563   group "root"
564   mode "755"
565   files_owner "root"
566   files_group "root"
567   files_mode "644"
568 end
569
570 ssl_certificate "ooc.openstreetmap.org" do
571   domains ["ooc.openstreetmap.org",
572            "a.ooc.openstreetmap.org",
573            "b.ooc.openstreetmap.org",
574            "c.ooc.openstreetmap.org"]
575   notifies :reload, "service[apache2]"
576 end
577
578 apache_site "ooc.openstreetmap.org" do
579   template "apache.ooc.erb"
580 end