]> git.openstreetmap.org Git - chef.git/blob - cookbooks/mediawiki/resources/site.rb
Configure phpfpm exporter for main wiki
[chef.git] / cookbooks / mediawiki / resources / site.rb
1 #
2 # Cookbook:: mediawiki
3 # Resource:: mediawiki_site
4 #
5 # Copyright:: 2015, 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 default_action :create
21
22 property :site, :kind_of => String, :name_property => true
23 property :aliases, :kind_of => [String, Array]
24 property :directory, :kind_of => String
25 property :version, :kind_of => String, :default => "1.35"
26 property :database_name, :kind_of => String, :required => true
27 property :database_user, :kind_of => String, :required => [:create, :update]
28 property :database_password, :kind_of => String, :required => [:create, :update]
29 property :sitename, :kind_of => String, :default => "OpenStreetMap Wiki"
30 property :metanamespace, :kind_of => String, :default => "OpenStreetMap"
31 property :logo, :kind_of => String, :default => "$wgStylePath/common/images/wiki.png"
32 property :email_contact, :kind_of => String, :default => ""
33 property :email_sender, :kind_of => String, :default => ""
34 property :email_sender_name, :kind_of => String, :default => "MediaWiki Mail"
35 property :commons, :kind_of => [TrueClass, FalseClass], :default => true
36 property :skin, :kind_of => String, :default => "vector"
37 property :site_notice, :kind_of => [String, TrueClass, FalseClass], :default => false
38 property :site_readonly, :kind_of => [String, TrueClass, FalseClass], :default => false
39 property :admin_user, :kind_of => String, :default => "Admin"
40 property :admin_password, :kind_of => String, :required => [:create]
41 property :private_accounts, :kind_of => [TrueClass, FalseClass], :default => false
42 property :private_site, :kind_of => [TrueClass, FalseClass], :default => false
43 property :recaptcha_public_key, :kind_of => String
44 property :recaptcha_private_key, :kind_of => String
45 property :extra_file_extensions, :kind_of => [String, Array], :default => []
46 property :fpm_max_children, :kind_of => Integer, :default => 5
47 property :fpm_request_terminate_timeout, :kind_of => Integer, :default => 300
48 property :fpm_prometheus_port, :kind_of => Integer
49 property :reload_apache, :kind_of => [TrueClass, FalseClass], :default => true
50
51 action :create do
52   node.default[:mediawiki][:sites][new_resource.site] = {
53     :directory => site_directory,
54     :version => new_resource.version
55   }
56
57   secret_key = persistent_token("mediawiki", new_resource.site, "wgSecretKey")
58
59   mysql_user "#{new_resource.database_user}@localhost" do
60     password new_resource.database_password
61   end
62
63   mysql_database new_resource.database_name do
64     permissions "#{new_resource.database_user}@localhost" => :all
65   end
66
67   mediawiki_directory = "#{site_directory}/w"
68
69   ruby_block "rename-installer-localsettings" do
70     action :nothing
71     block do
72       ::File.rename("#{mediawiki_directory}/LocalSettings.php", "#{mediawiki_directory}/LocalSettings-install.php")
73     end
74   end
75
76   execute "#{mediawiki_directory}/maintenance/install.php" do
77     action :nothing
78     # Use metanamespace as Site Name to ensure correct set namespace
79     command "php maintenance/install.php --server '#{name}' --dbtype 'mysql' --dbname '#{new_resource.database_name}' --dbuser '#{new_resource.database_user}' --dbpass '#{new_resource.database_password}' --dbserver 'localhost' --scriptpath /w --pass '#{new_resource.admin_password}' '#{new_resource.metanamespace}' '#{new_resource.admin_user}'"
80     cwd mediawiki_directory
81     user node[:mediawiki][:user]
82     group node[:mediawiki][:group]
83     not_if do
84       ::File.exist?("#{mediawiki_directory}/LocalSettings-install.php")
85     end
86     notifies :run, "ruby_block[rename-installer-localsettings]", :immediately
87   end
88
89   execute "#{mediawiki_directory}/maintenance/update.php" do
90     action :nothing
91     command "php maintenance/update.php --quick"
92     cwd mediawiki_directory
93     user node[:mediawiki][:user]
94     group node[:mediawiki][:group]
95   end
96
97   declare_resource :directory, site_directory do
98     owner node[:mediawiki][:user]
99     group node[:mediawiki][:group]
100     mode "775"
101   end
102
103   declare_resource :directory, mediawiki_directory do
104     owner node[:mediawiki][:user]
105     group node[:mediawiki][:group]
106     mode "775"
107   end
108
109   mediawiki_reference = "REL#{new_resource.version}".tr(".", "_")
110
111   git mediawiki_directory do
112     action :sync
113     repository "https://gerrit.wikimedia.org/r/mediawiki/core.git"
114     revision mediawiki_reference
115     depth 1
116     user node[:mediawiki][:user]
117     group node[:mediawiki][:group]
118     notifies :run, "execute[#{mediawiki_directory}/composer.json]", :immediately
119     notifies :run, "execute[#{mediawiki_directory}/maintenance/install.php]", :immediately
120     notifies :run, "execute[#{mediawiki_directory}/maintenance/update.php]"
121   end
122
123   execute "#{mediawiki_directory}/composer.json" do
124     action :nothing
125     command "composer update --no-dev"
126     cwd mediawiki_directory
127     user node[:mediawiki][:user]
128     group node[:mediawiki][:group]
129     environment "COMPOSER_HOME" => site_directory
130   end
131
132   template "#{mediawiki_directory}/composer.local.json" do
133     cookbook "mediawiki"
134     source "composer.local.json.erb"
135     owner node[:mediawiki][:user]
136     group node[:mediawiki][:group]
137     mode "664"
138   end
139
140   # Safety catch if git doesn't update but install.php hasn't run
141   ruby_block "catch-installer-localsettings-run" do
142     action :run
143     block do
144     end
145     not_if do
146       ::File.exist?("#{mediawiki_directory}/LocalSettings-install.php")
147     end
148     notifies :run, "execute[#{mediawiki_directory}/maintenance/install.php]", :immediately
149   end
150
151   declare_resource :directory, "#{mediawiki_directory}/images" do
152     owner "www-data"
153     group node[:mediawiki][:group]
154     mode "775"
155   end
156
157   declare_resource :directory, "#{mediawiki_directory}/cache" do
158     owner "www-data"
159     group node[:mediawiki][:group]
160     mode "775"
161   end
162
163   declare_resource :directory, "#{mediawiki_directory}/LocalSettings.d" do
164     user node[:mediawiki][:user]
165     group node[:mediawiki][:group]
166     mode "775"
167   end
168
169   template "#{mediawiki_directory}/LocalSettings.php" do
170     cookbook "mediawiki"
171     source "LocalSettings.php.erb"
172     owner node[:mediawiki][:user]
173     group node[:mediawiki][:group]
174     mode "664"
175     variables :name => new_resource.site,
176               :directory => mediawiki_directory,
177               :database_params => database_params,
178               :mediawiki => mediawiki_params,
179               :secret_key => secret_key
180     notifies :run, "execute[#{mediawiki_directory}/maintenance/update.php]"
181   end
182
183   cron_d "mediawiki-#{cron_name}-sitemap" do
184     comment "Generate sitemap.xml daily"
185     minute "30"
186     hour "0"
187     user node[:mediawiki][:user]
188     command "/usr/bin/nice /usr/bin/php -d memory_limit=2048M -d error_reporting=22517 #{site_directory}/w/maintenance/generateSitemap.php --server=https://#{new_resource.site} --urlpath=https://#{new_resource.site}/ --fspath=#{site_directory} --quiet --skip-redirects"
189   end
190
191   cron_d "mediawiki-#{cron_name}-jobs" do
192     comment "Run mediawiki jobs"
193     minute "*/3"
194     user node[:mediawiki][:user]
195     command "/usr/bin/nice /usr/bin/php -d memory_limit=2048M -d error_reporting=22517 #{site_directory}/w/maintenance/runJobs.php --server=https://#{new_resource.site} --maxtime=160 --memory-limit=2048M --procs=8 --quiet"
196   end
197
198   cron_d "mediawiki-#{cron_name}-email-jobs" do
199     comment "Run mediawiki email jobs"
200     user node[:mediawiki][:user]
201     command "/usr/bin/nice /usr/bin/php -d memory_limit=2048M -d error_reporting=22517 #{site_directory}/w/maintenance/runJobs.php --server=https://#{new_resource.site} --maxtime=30 --type=enotifNotify --memory-limit=2048M --procs=4 --quiet"
202   end
203
204   cron_d "mediawiki-#{cron_name}-refresh-links" do
205     comment "Run mediawiki refresh links table weekly"
206     minute "5"
207     hour "0"
208     weekday "0"
209     user node[:mediawiki][:user]
210     command "/usr/bin/nice /usr/bin/php -d memory_limit=2048M -d error_reporting=22517 #{site_directory}/w/maintenance/refreshLinks.php --server=https://#{new_resource.site} --memory-limit=2048M --quiet"
211   end
212
213   cron_d "mediawiki-#{cron_name}-cleanup-gs" do
214     comment "Clean up imagemagick garbage"
215     minute "10"
216     hour "2"
217     user node[:mediawiki][:user]
218     command "/usr/bin/find /tmp/ -maxdepth 1 -type f -user www-data -mmin +90 -name 'gs_*' -delete"
219   end
220
221   cron_d "mediawiki-#{cron_name}-cleanup-magick" do
222     comment "Clean up imagemagick garbage"
223     minute "20"
224     hour "2"
225     user node[:mediawiki][:user]
226     command "/usr/bin/find /tmp/ -maxdepth 1 -type f -user www-data -mmin +90 -name 'magick-*' -delete"
227   end
228
229   template "/etc/cron.daily/mediawiki-#{cron_name}-backup" do
230     cookbook "mediawiki"
231     source "mediawiki-backup.cron.erb"
232     owner "root"
233     group "root"
234     mode "700"
235     variables :name => new_resource.site,
236               :directory => site_directory,
237               :database_params => database_params
238   end
239
240   # MobileFrontend extension is required by MinervaNeue skin
241   mediawiki_extension "MobileFrontend" do
242     site new_resource.site
243     template "mw-ext-MobileFrontend.inc.php.erb"
244   end
245
246   # MobileFrontend extension is required by MinervaNeue skin
247   mediawiki_skin "MinervaNeue" do
248     site new_resource.site
249     update_site false
250     legacy false
251   end
252
253   mediawiki_skin "CologneBlue" do
254     site new_resource.site
255     update_site false
256     legacy false
257   end
258
259   mediawiki_skin "Modern" do
260     site new_resource.site
261     update_site false
262     legacy false
263   end
264
265   mediawiki_skin "MonoBook" do
266     site new_resource.site
267     update_site false
268     legacy false
269   end
270
271   mediawiki_skin "Vector" do
272     site new_resource.site
273     update_site false
274     legacy false
275   end
276
277   mediawiki_extension "Cite" do
278     site new_resource.site
279     update_site false
280   end
281
282   mediawiki_extension "CiteThisPage" do
283     site new_resource.site
284     update_site false
285   end
286
287   if new_resource.private_accounts || new_resource.private_site
288     mediawiki_extension "ConfirmEdit" do
289       site new_resource.site
290       update_site false
291       action :delete
292     end
293   else
294     mediawiki_extension "ConfirmEdit" do
295       site new_resource.site
296       template "mw-ext-ConfirmEdit.inc.php.erb"
297       variables :public_key => new_resource.recaptcha_public_key,
298                 :private_key => new_resource.recaptcha_private_key
299       update_site false
300     end
301   end
302
303   mediawiki_extension "Gadgets" do
304     site new_resource.site
305     update_site false
306   end
307
308   mediawiki_extension "ImageMap" do
309     site new_resource.site
310     update_site false
311   end
312
313   mediawiki_extension "InputBox" do
314     site new_resource.site
315     update_site false
316   end
317
318   mediawiki_extension "Interwiki" do
319     site new_resource.site
320     template "mw-ext-Interwiki.inc.php.erb"
321     update_site false
322   end
323
324   mediawiki_extension "Nuke" do
325     site new_resource.site
326     update_site false
327   end
328
329   mediawiki_extension "ParserFunctions" do
330     site new_resource.site
331     template "mw-ext-ParserFunctions.inc.php.erb"
332     update_site false
333   end
334
335   mediawiki_extension "PdfHandler" do
336     site new_resource.site
337     template "mw-ext-PdfHandler.inc.php.erb"
338     update_site false
339   end
340
341   mediawiki_extension "Poem" do
342     site new_resource.site
343     update_site false
344   end
345
346   mediawiki_extension "Renameuser" do
347     site new_resource.site
348     update_site false
349   end
350
351   mediawiki_extension "SimpleAntiSpam" do
352     site new_resource.site
353     update_site false
354     action :delete
355   end
356
357   mediawiki_extension "SpamBlacklist" do
358     site new_resource.site
359     template "mw-ext-SpamBlacklist.inc.php.erb"
360     update_site false
361   end
362
363   mediawiki_extension "SyntaxHighlight_GeSHi" do
364     site new_resource.site
365     template "mw-ext-SyntaxHighlight.inc.php.erb"
366     update_site false
367   end
368
369   mediawiki_extension "TitleBlacklist" do
370     site new_resource.site
371     template "mw-ext-TitleBlacklist.inc.php.erb"
372     update_site false
373   end
374
375   mediawiki_extension "WikiEditor" do
376     site new_resource.site
377     update_site false
378   end
379
380   mediawiki_extension "Babel" do
381     site new_resource.site
382     template "mw-ext-Babel.inc.php.erb"
383     update_site false
384   end
385
386   mediawiki_extension "cldr" do
387     site new_resource.site
388     template "mw-ext-cldr.inc.php.erb"
389     update_site false
390   end
391
392   mediawiki_extension "CleanChanges" do
393     site new_resource.site
394     template "mw-ext-CleanChanges.inc.php.erb"
395     update_site false
396   end
397
398   mediawiki_extension "LocalisationUpdate" do
399     site new_resource.site
400     template "mw-ext-LocalisationUpdate.inc.php.erb"
401     update_site false
402   end
403
404   # mediawiki_extension "Translate" do
405   #   site new_resource.site
406   #   template "mw-ext-Translate.inc.php.erb"
407   #   update_site false
408   # end
409
410   mediawiki_extension "UniversalLanguageSelector" do
411     site new_resource.site
412     template "mw-ext-UniversalLanguageSelector.inc.php.erb"
413     update_site false
414   end
415
416   mediawiki_extension "AntiSpoof" do
417     site new_resource.site
418     template "mw-ext-AntiSpoof.inc.php.erb"
419     update_site false
420   end
421
422   mediawiki_extension "AbuseFilter" do
423     site new_resource.site
424     template "mw-ext-AbuseFilter.inc.php.erb"
425     update_site false
426   end
427
428   mediawiki_extension "CheckUser" do
429     site new_resource.site
430     template "mw-ext-CheckUser.inc.php.erb"
431     update_site false
432   end
433
434   mediawiki_extension "DismissableSiteNotice" do
435     site new_resource.site
436     update_site false
437   end
438
439   mediawiki_extension "Elastica" do
440     site new_resource.site
441     update_site false
442   end
443
444   mediawiki_extension "CirrusSearch" do
445     site new_resource.site
446     template "mw-ext-CirrusSearch.inc.php.erb"
447     update_site false
448   end
449
450   mediawiki_extension "osmtaginfo" do
451     site new_resource.site
452     template "mw-ext-osmtaginfo.inc.php.erb"
453     repository "https://github.com/Firefishy/osmtaginfo.git"
454     tag "live"
455     update_site false
456   end
457
458   mediawiki_extension "SimpleMap" do
459     site new_resource.site
460     template "mw-ext-SimpleMap.inc.php.erb"
461     repository "https://github.com/Firefishy/SimpleMap.git"
462     tag "live"
463     update_site false
464   end
465
466   mediawiki_extension "SlippyMap" do
467     site new_resource.site
468     update_site false
469     action :delete
470   end
471
472   mediawiki_extension "Mantle" do
473     site new_resource.site
474     update_site false
475     action :delete
476   end
477
478   mediawiki_extension "DisableAccount" do
479     site new_resource.site
480     template "mw-ext-DisableAccount.inc.php.erb"
481     update_site false
482   end
483
484   mediawiki_extension "VisualEditor" do
485     site new_resource.site
486     template "mw-ext-VisualEditor.inc.php.erb"
487     update_site false
488   end
489
490   mediawiki_extension "TemplateData" do
491     site new_resource.site
492     update_site false
493   end
494
495   cookbook_file "#{site_directory}/cc-wiki.png" do
496     cookbook "mediawiki"
497     owner node[:mediawiki][:user]
498     group node[:mediawiki][:group]
499     mode "644"
500     backup false
501   end
502
503   cookbook_file "#{site_directory}/googled06a989d1ccc8364.html" do
504     cookbook "mediawiki"
505     owner node[:mediawiki][:user]
506     group node[:mediawiki][:group]
507     mode "644"
508     backup false
509   end
510
511   cookbook_file "#{site_directory}/googlefac54c35e800caab.html" do
512     cookbook "mediawiki"
513     owner node[:mediawiki][:user]
514     group node[:mediawiki][:group]
515     mode "644"
516     backup false
517   end
518
519   ssl_certificate new_resource.site do
520     domains [new_resource.site] + Array(new_resource.aliases)
521   end
522
523   php_fpm new_resource.site do
524     pm_max_children new_resource.fpm_max_children
525     request_terminate_timeout new_resource.fpm_request_terminate_timeout
526     php_admin_values "open_basedir" => "#{site_directory}/:/usr/share/php/:/dev/null:/tmp/"
527     php_values "memory_limit" => "500M",
528                "max_execution_time" => "240",
529                "upload_max_filesize" => "70M",
530                "post_max_size" => "100M"
531     prometheus_port new_resource.fpm_prometheus_port
532   end
533
534   apache_site new_resource.site do
535     cookbook "mediawiki"
536     template "apache.erb"
537     directory site_directory
538     variables :aliases => Array(new_resource.aliases),
539               :private_site => new_resource.private_site
540     reload_apache false
541   end
542
543   # FIXME: needs to run one
544   execute "#{mediawiki_directory}/extensions/CirrusSearch/maintenance/updateSearchIndexConfig.php" do
545     action :nothing
546     command "php extensions/CirrusSearch/maintenance/updateSearchIndexConfig.php"
547     cwd mediawiki_directory
548     user node[:mediawiki][:user]
549     group node[:mediawiki][:group]
550   end
551 end
552
553 action :update do
554   mediawiki_directory = "#{site_directory}/w"
555
556   template "#{mediawiki_directory}/LocalSettings.php" do
557     cookbook "mediawiki"
558     source "LocalSettings.php.erb"
559     owner node[:mediawiki][:user]
560     group node[:mediawiki][:group]
561     mode "664"
562     variables :name => new_resource.site,
563               :directory => mediawiki_directory,
564               :database_params => database_params,
565               :mediawiki => mediawiki_params
566     notifies :run, "execute[#{mediawiki_directory}/maintenance/update.php]"
567   end
568
569   execute "#{mediawiki_directory}/maintenance/update.php" do
570     action :run
571     command "php maintenance/update.php --quick"
572     cwd mediawiki_directory
573     user node[:mediawiki][:user]
574     group node[:mediawiki][:group]
575   end
576 end
577
578 action :delete do
579   apache_site new_resource.site do
580     action :delete
581     reload_apache false
582   end
583
584   declare_resource :directory, site_directory do
585     action :delete
586     recursive true
587   end
588
589   mysql_database new_resource.database_name do
590     action :drop
591   end
592
593   mysql_user "#{new_resource.database_user}@localhost" do
594     action :drop
595   end
596 end
597
598 action_class do
599   include Chef::Mixin::PersistentToken
600
601   def site_directory
602     new_resource.directory || "/srv/#{new_resource.site}"
603   end
604
605   def cron_name
606     new_resource.site.tr(".", "_")
607   end
608
609   def database_params
610     {
611       :host => "localhost",
612       :name => new_resource.database_name,
613       :username => new_resource.database_user,
614       :password => new_resource.database_password
615     }
616   end
617
618   def mediawiki_params
619     {
620       :sitename => new_resource.sitename,
621       :metanamespace => new_resource.metanamespace,
622       :logo => new_resource.logo,
623       :email_contact => new_resource.email_contact,
624       :email_sender => new_resource.email_sender,
625       :email_sender_name => new_resource.email_sender_name,
626       :commons => new_resource.commons,
627       :skin => new_resource.skin,
628       :site_notice => new_resource.site_notice,
629       :site_readonly => new_resource.site_readonly,
630       :extra_file_extensions => new_resource.extra_file_extensions,
631       :private_accounts => new_resource.private_accounts,
632       :private_site => new_resource.private_site
633     }
634   end
635 end
636
637 def after_created
638   notifies :reload, "service[apache2]" if reload_apache
639 end