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