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