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