]> git.openstreetmap.org Git - chef.git/blob - cookbooks/dev/recipes/default.rb
Improve filesystem sandboxing for some services
[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}@errol.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     private_tmp true
294     private_devices true
295     protect_system "strict"
296     protect_home true
297     read_write_directories "/srv/%i.apis.dev.openstreetmap.org/logs"
298     no_new_privileges true
299   end
300
301   systemd_service "cgimap@" do
302     description "OpenStreetMap API Server"
303     type "forking"
304     environment_file "/etc/default/cgimap-%i"
305     user "apis"
306     exec_start "/srv/%i.apis.dev.openstreetmap.org/cgimap/openstreetmap-cgimap --daemon --port $CGIMAP_PORT --instances 5"
307     exec_reload "/bin/kill -HUP $MAINPID"
308     private_tmp true
309     private_devices true
310     protect_system "strict"
311     protect_home true
312     read_write_directories ["/srv/%i.apis.dev.openstreetmap.org/logs", "/srv/%i.apis.dev.openstreetmap.org/rails/tmp"]
313     no_new_privileges true
314     restart "on-failure"
315   end
316
317   cgimap_port = 9000
318
319   Dir.glob("/srv/*.apis.dev.openstreetmap.org").each do |dir|
320     node.default_unless[:dev][:rails][File.basename(dir).split(".").first] = {}
321   end
322
323   node[:dev][:rails].each do |name, details|
324     database_name = details[:database] || "apis_#{name}"
325     site_name = "#{name}.apis.dev.openstreetmap.org"
326     site_directory = "/srv/#{name}.apis.dev.openstreetmap.org"
327     log_directory = "#{site_directory}/logs"
328     rails_directory = "#{site_directory}/rails"
329     cgimap_directory = "#{site_directory}/cgimap"
330     gpx_directory = "#{site_directory}/gpx"
331
332     if details[:repository]
333       site_aliases = details[:aliases] || []
334       secret_key_base = persistent_token("dev", "rails", name, "secret_key_base")
335
336       postgresql_database database_name do
337         cluster "14/main"
338         owner "apis"
339       end
340
341       postgresql_extension "#{database_name}_btree_gist" do
342         cluster "14/main"
343         database database_name
344         extension "btree_gist"
345       end
346
347       directory site_directory do
348         owner "apis"
349         group "apis"
350         mode "755"
351       end
352
353       directory log_directory do
354         owner "apis"
355         group "apis"
356         mode "755"
357       end
358
359       directory gpx_directory do
360         owner "apis"
361         group "apis"
362         mode "755"
363       end
364
365       directory "#{gpx_directory}/traces" do
366         owner "apis"
367         group "apis"
368         mode "755"
369       end
370
371       directory "#{gpx_directory}/images" do
372         owner "apis"
373         group "apis"
374         mode "755"
375       end
376
377       rails_port site_name do
378         directory rails_directory
379         user "apis"
380         group "apis"
381         repository details[:repository]
382         revision details[:revision]
383         database_port node[:postgresql][:clusters][:"14/main"][:port]
384         database_name database_name
385         database_username "apis"
386         email_from "OpenStreetMap <web@noreply.openstreetmap.org>"
387         gpx_dir gpx_directory
388         log_path "#{log_directory}/rails.log"
389         memcache_servers ["127.0.0.1"]
390         csp_enforce true
391         run_migrations true
392         trace_use_job_queue true
393       end
394
395       template "#{rails_directory}/config/initializers/setup.rb" do
396         source "rails.setup.rb.erb"
397         owner "apis"
398         group "apis"
399         mode "644"
400         variables :site => site_name
401         notifies :restart, "rails_port[#{site_name}]"
402       end
403
404       service "rails-jobs@#{name}" do
405         action [:enable, :start]
406         supports :restart => true
407         subscribes :restart, "rails_port[#{site_name}]"
408         subscribes :restart, "systemd_service[#{name}]"
409         only_if "fgrep -q delayed_job #{rails_directory}/Gemfile.lock"
410       end
411
412       if details[:cgimap_repository]
413         git cgimap_directory do
414           action :sync
415           repository details[:cgimap_repository]
416           revision details[:cgimap_revision]
417           user "apis"
418           group "apis"
419         end
420
421         execute "#{cgimap_directory}/autogen.sh" do
422           action :nothing
423           command "./autogen.sh"
424           cwd cgimap_directory
425           user "apis"
426           group "apis"
427           subscribes :run, "git[#{cgimap_directory}]", :immediately
428         end
429
430         execute "#{cgimap_directory}/configure" do
431           action :nothing
432           command "./configure --with-fcgi=/usr --with-boost-libdir=/usr/lib/x86_64-linux-gnu --enable-yajl"
433           cwd cgimap_directory
434           user "apis"
435           group "apis"
436           subscribes :run, "execute[#{cgimap_directory}/autogen.sh]", :immediately
437         end
438
439         execute "#{cgimap_directory}/Makefile" do
440           action :nothing
441           command "make -j"
442           cwd cgimap_directory
443           user "apis"
444           group "apis"
445           subscribes :run, "execute[#{cgimap_directory}/configure]", :immediately
446           notifies :restart, "service[cgimap@#{name}]"
447         end
448
449         template "/etc/default/cgimap-#{name}" do
450           source "cgimap.environment.erb"
451           owner "root"
452           group "root"
453           mode "640"
454           variables :cgimap_port => cgimap_port,
455                     :database_port => node[:postgresql][:clusters][:"14/main"][:port],
456                     :database_name => database_name,
457                     :log_directory => log_directory
458           notifies :restart, "service[cgimap@#{name}]"
459         end
460
461         service "cgimap@#{name}" do
462           action [:start, :enable]
463         end
464       end
465
466       ssl_certificate site_name do
467         domains [site_name] + site_aliases
468         notifies :reload, "service[apache2]"
469       end
470
471       apache_site site_name do
472         template "apache.rails.erb"
473         variables :application_name => name,
474                   :aliases => site_aliases,
475                   :secret_key_base => secret_key_base,
476                   :cgimap_enabled => details.key?(:cgimap_repository),
477                   :cgimap_port => cgimap_port
478       end
479
480       template "/etc/logrotate.d/apis-#{name}" do
481         source "logrotate.apis.erb"
482         owner "root"
483         group "root"
484         mode "644"
485         variables :name => name,
486                   :log_directory => log_directory,
487                   :rails_directory => rails_directory
488       end
489
490       cgimap_port += 1
491     else
492       file "/etc/logrotate.d/apis-#{name}" do
493         action :delete
494       end
495
496       apache_site site_name do
497         action [:delete]
498       end
499
500       service "cgimap@#{name}" do
501         action [:stop, :disable]
502       end
503
504       file "/etc/default/cgimap-#{name}" do
505         action :delete
506       end
507
508       service "rails-jobs@#{name}" do
509         action [:stop, :disable]
510       end
511
512       directory site_directory do
513         action :delete
514         recursive true
515       end
516
517       file "/etc/cron.daily/rails-#{site_name.tr('.', '-')}" do
518         action :delete
519       end
520
521       postgresql_database database_name do
522         action :drop
523         cluster "14/main"
524       end
525     end
526   end
527
528   directory "/srv/apis.dev.openstreetmap.org" do
529     owner "apis"
530     group "apis"
531     mode "755"
532   end
533
534   template "/srv/apis.dev.openstreetmap.org/index.html" do
535     source "apis.html.erb"
536     owner "apis"
537     group "apis"
538     mode "644"
539   end
540
541   ssl_certificate "apis.dev.openstreetmap.org" do
542     domains "apis.dev.openstreetmap.org"
543     notifies :reload, "service[apache2]"
544   end
545
546   apache_site "apis.dev.openstreetmap.org" do
547     template "apache.apis.erb"
548   end
549
550   node[:postgresql][:clusters].each_key do |name|
551     postgresql_munin name do
552       cluster name
553       database "ALL"
554     end
555   end
556 end
557
558 directory "/srv/ooc.openstreetmap.org" do
559   owner "root"
560   group "root"
561   mode "755"
562 end
563
564 remote_directory "/srv/ooc.openstreetmap.org/html" do
565   source "ooc"
566   owner "root"
567   group "root"
568   mode "755"
569   files_owner "root"
570   files_group "root"
571   files_mode "644"
572 end
573
574 ssl_certificate "ooc.openstreetmap.org" do
575   domains ["ooc.openstreetmap.org",
576            "a.ooc.openstreetmap.org",
577            "b.ooc.openstreetmap.org",
578            "c.ooc.openstreetmap.org"]
579   notifies :reload, "service[apache2]"
580 end
581
582 apache_site "ooc.openstreetmap.org" do
583   template "apache.ooc.erb"
584 end