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