X-Git-Url: https://git.openstreetmap.org./chef.git/blobdiff_plain/a57bc7272b747eae6c08f79df516b6ddc3f5b71f..1db4fe4734ee6a296670740ca701dc9f965b7353:/cookbooks/community/recipes/default.rb diff --git a/cookbooks/community/recipes/default.rb b/cookbooks/community/recipes/default.rb index 35dec9156..a09762470 100644 --- a/cookbooks/community/recipes/default.rb +++ b/cookbooks/community/recipes/default.rb @@ -17,17 +17,21 @@ # limitations under the License. # +include_recipe "accounts" include_recipe "docker" include_recipe "git" include_recipe "ssl" -include_recipe "geoipupdate" passwords = data_bag_item("community", "passwords") -license_keys = data_bag_item("geoipupdate", "license-keys") +license_keys = data_bag_item("geoipupdate", "license-keys") unless kitchen? -ssl_certificate "community.openstreetmap.org" do - domains ["community.openstreetmap.org", "community.osm.org"] - notifies :run, "execute[discourse_container_web_only_rebuild]" +prometheus_servers = search(:node, "recipes:prometheus\\:\\:server").map do |server| + server.ipaddresses(:role => :external) +end.flatten + +# Disable any default installed apache2 service. Web server is embedded within the discourse docker container +service "apache2" do + action [:disable, :stop] end directory "/srv/community.openstreetmap.org" do @@ -42,71 +46,191 @@ directory "/srv/community.openstreetmap.org/shared" do mode "755" end +directory "/srv/community.openstreetmap.org/files" do + owner "community" + group "community" + mode "755" +end + +template "/srv/community.openstreetmap.org/files/update-feeds.atom" do + source "update-feeds.atom.erb" + owner "community" + group "community" + mode "644" +end + git "/srv/community.openstreetmap.org/docker" do action :sync repository "https://github.com/discourse/discourse_docker.git" - revision "main" + # DANGER launch wrapper automatically updates git repo if rebuild method used: https://github.com/discourse/discourse_docker/blob/107ffb40fe8b1ea40e00814468db974a4f3f8e8f/launcher#L799 + revision "b345430a822d6275573f3d82f1ad2e2b5fa1e0b1" depth 1 user "root" group "root" - notifies :run, "execute[discourse_container_data_rebuild]" - notifies :run, "execute[discourse_container_web_only_rebuild]" - notifies :run, "execute[discourse_container_mail_receiver_rebuild]" + notifies :run, "notify_group[discourse_container_new_data]" + notifies :run, "notify_group[discourse_container_new_web_only]" + notifies :run, "notify_group[discourse_container_new_mail_receiver]" end template "/srv/community.openstreetmap.org/docker/containers/data.yml" do source "data.yml.erb" owner "root" group "root" - mode "644" + mode "640" variables :passwords => passwords - notifies :run, "execute[discourse_container_data_rebuild]" + notifies :run, "notify_group[discourse_container_new_data]" +end + +resolvers = node[:networking][:nameservers].map do |resolver| + resolver =~ /:/ ? "[#{resolver}]" : resolver end template "/srv/community.openstreetmap.org/docker/containers/web_only.yml" do source "web_only.yml.erb" owner "root" group "root" + mode "640" + variables :license_keys => license_keys, :passwords => passwords, + :prometheus_servers => prometheus_servers, :resolvers => resolvers + notifies :run, "notify_group[discourse_container_new_web_only]" +end + +template "/srv/community.openstreetmap.org/files/policyd-spf.conf" do + source "policyd-spf.conf.erb" + owner "community" + group "community" mode "644" - variables :license_keys => license_keys, :passwords => passwords - notifies :run, "execute[discourse_container_web_only_rebuild]" + notifies :run, "notify_group[discourse_container_new_mail_receiver]" end template "/srv/community.openstreetmap.org/docker/containers/mail-receiver.yml" do source "mail-receiver.yml.erb" owner "root" group "root" - mode "644" + mode "640" variables :passwords => passwords - notifies :run, "execute[discourse_container_mail_receiver_rebuild]" + notifies :run, "notify_group[discourse_container_new_mail_receiver]" +end + +ssl_certificate "community.openstreetmap.org" do + domains ["community.openstreetmap.org", "community.osm.org", "communities.openstreetmap.org", "communities.osm.org", "c.openstreetmap.org", "c.osm.org", "forum.openstreetmap.org", "forum.osm.org"] + notifies :run, "notify_group[discourse_container_new_web_only]" + notifies :run, "notify_group[discourse_container_new_mail_receiver]" +end + +notify_group "discourse_container_new_web_only" do + notifies :run, "execute[discourse_container_data_start]", :immediately # noop if site up + notifies :run, "execute[discourse_container_web_only_bootstrap]", :immediately # site up but runs in parallel. Slow + notifies :run, "execute[discourse_container_web_only_destroy]", :immediately # site down + notifies :run, "execute[discourse_container_data_destroy]", :immediately # site down + notifies :run, "execute[discourse_container_data_bootstrap]", :immediately # site down + notifies :run, "execute[discourse_container_data_start]", :immediately # site down + notifies :run, "execute[discourse_container_web_only_start]", :immediately # site restore +end + +notify_group "discourse_container_new_data" do + notifies :run, "execute[discourse_container_web_only_destroy]", :immediately # site down + notifies :run, "execute[discourse_container_data_destroy]", :immediately # site down + notifies :run, "execute[discourse_container_data_bootstrap]", :immediately # site down + notifies :run, "execute[discourse_container_data_start]", :immediately # site down + notifies :run, "execute[discourse_container_web_only_start]", :immediately # site restore end -execute "discourse_container_data_rebuild" do +notify_group "discourse_container_new_mail_receiver" do + notifies :run, "execute[discourse_container_mail_receiver_destroy]", :immediately + notifies :run, "execute[discourse_container_mail_receiver_bootstrap]", :immediately + notifies :run, "execute[discourse_container_mail_receiver_start]", :immediately +end + +# Attempt at a failsafe to ensure all containers are running +notify_group "discourse_container_ensure_all_running" do + action :run + notifies :run, "execute[discourse_container_data_start]", :delayed + notifies :run, "execute[discourse_container_web_only_start]", :delayed + notifies :run, "execute[discourse_container_mail_receiver_start]", :delayed +end + +execute "discourse_container_data_bootstrap" do action :nothing - command "./launcher rebuild data" + command "./launcher bootstrap data" cwd "/srv/community.openstreetmap.org/docker/" user "root" group "root" end -execute "discourse_container_web_only_rebuild" do +execute "discourse_container_data_destroy" do action :nothing - command "./launcher rebuild web_only" + command "./launcher destroy data" cwd "/srv/community.openstreetmap.org/docker/" user "root" group "root" end -execute "discourse_container_mail_receiver_rebuild" do +execute "discourse_container_data_start" do action :nothing - command "./launcher rebuild mail-receiver" + command "./launcher start data" cwd "/srv/community.openstreetmap.org/docker/" user "root" group "root" end -## FIXME -# Backup the backups -# Maybe use /srv/community.openstreetmap.org/shared/web-only/backups/ -# Or https://github.com/discourse/discourse_docker/blob/8b0ae9b4da2f48d62d7a88035018dba403918325/templates/postgres.template.yml#L240 -# and tar of the shared web uploads +execute "discourse_container_web_only_bootstrap" do + action :nothing + command "./launcher bootstrap web_only" + cwd "/srv/community.openstreetmap.org/docker/" + user "root" + group "root" +end + +execute "discourse_container_web_only_destroy" do + action :nothing + command "./launcher destroy web_only" + cwd "/srv/community.openstreetmap.org/docker/" + user "root" + group "root" +end + +execute "discourse_container_web_only_start" do + action :nothing + command "./launcher start web_only" + cwd "/srv/community.openstreetmap.org/docker/" + user "root" + group "root" +end + +execute "discourse_container_mail_receiver_bootstrap" do + action :nothing + command "./launcher bootstrap mail-receiver" + cwd "/srv/community.openstreetmap.org/docker/" + user "root" + group "root" +end + +execute "discourse_container_mail_receiver_destroy" do + action :nothing + command "./launcher destroy mail-receiver" + cwd "/srv/community.openstreetmap.org/docker/" + user "root" + group "root" +end + +execute "discourse_container_mail_receiver_start" do + action :nothing + command "./launcher start mail-receiver" + cwd "/srv/community.openstreetmap.org/docker/" + user "root" + group "root" +end + +template "/etc/cron.daily/community-backup" do + source "backup.cron.erb" + owner "root" + group "root" + mode "750" +end + +node.default[:prometheus][:exporters][443] = { + :name => "community", + :address => "#{node[:prometheus][:address]}:443", + :sni => "community.openstreetmap.org" +}