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