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