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