# # Cookbook Name:: kosmos-mastodon # Recipe:: default # # The MIT License (MIT) # # Copyright:: 2019, Kosmos Developers # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. include_recipe "kosmos-nodejs" include_recipe "kosmos-redis" include_recipe "kosmos-postgresql" # TODO: Remove the condition once we have migrated mastodon to andromeda unless platform?('ubuntu') && node[:platform_version].to_f < 18.04 postgresql_data_bag_item = data_bag_item('credentials', 'postgresql') postgresql_user 'mastodon' do action :create password postgresql_data_bag_item['mastodon_user_password'] end postgresql_database 'mastodon' do owner 'mastodon' action :create end else postgresql_data_bag_item = {} end mastodon_path = node["kosmos-mastodon"]["directory"] mastodon_user = "mastodon" group mastodon_user do gid 62786 end user mastodon_user do comment "mastodon user" uid 62786 gid 62786 shell "/bin/bash" home mastodon_path end package %w(imagemagick ffmpeg libxml2-dev libxslt1-dev file git curl pkg-config libprotobuf-dev protobuf-compiler libidn11 libidn11-dev libjemalloc1) npm_package "yarn" do version "1.6.0" end ruby_version = "2.6.1" execute "systemctl daemon-reload" do command "systemctl daemon-reload" action :nothing end # mastodon-web service # template "/lib/systemd/system/mastodon-web.service" do source "mastodon-web.systemd.service.erb" variables user: mastodon_user, app_dir: mastodon_path, port: node["kosmos-mastodon"]["puma_port"], bundle_path: "/opt/ruby_build/builds/#{ruby_version}/bin/bundle" notifies :run, "execute[systemctl daemon-reload]", :immediately notifies :restart, "service[mastodon-web]", :delayed end # mastodon-sidekiq service # template "/lib/systemd/system/mastodon-sidekiq.service" do source "mastodon-sidekiq.systemd.service.erb" variables user: mastodon_user, app_dir: mastodon_path, bundle_path: "/opt/ruby_build/builds/#{ruby_version}/bin/bundle", sidekiq_threads: node["kosmos-mastodon"]["sidekiq_threads"] notifies :run, "execute[systemctl daemon-reload]", :immediately notifies :restart, "service[mastodon-sidekiq]", :delayed end # mastodon-streaming service # template "/lib/systemd/system/mastodon-streaming.service" do source "mastodon-streaming.systemd.service.erb" variables user: mastodon_user, app_dir: mastodon_path, port: node["kosmos-mastodon"]["streaming_port"] notifies :run, "execute[systemctl daemon-reload]", :immediately notifies :restart, "service[mastodon-streaming]", :delayed end application mastodon_path do owner "mastodon" group "mastodon" environment "HOME" => mastodon_path ruby_runtime ruby_version do provider :ruby_build version ruby_version end git do user mastodon_user group mastodon_user repository "https://gitea.kosmos.org/kosmos/mastodon.git" revision "production" end mastodon_credentials = data_bag_item('credentials', 'mastodon') template ".env.production" do source "env.production.erb" mode "0640" owner mastodon_user group mastodon_user variables redis_url: node["kosmos-mastodon"]["redis_url"], domain: node["kosmos-mastodon"]["server_name"], paperclip_secret: mastodon_credentials['paperclip_secret'], secret_key_base: mastodon_credentials['secret_key_base'], otp_secret: mastodon_credentials['otp_secret'], smtp_login: mastodon_credentials['smtp_user_name'], smtp_password: mastodon_credentials['smtp_password'], smtp_from_address: "mail@#{node['kosmos-mastodon']['server_name']}", s3_bucket: "kosmos-social", aws_access_key_id: mastodon_credentials['aws_access_key_id'], aws_secret_access_key: mastodon_credentials['aws_secret_access_key'], s3_region: "eu-west-1", vapid_private_key: mastodon_credentials['vapid_private_key'], vapid_public_key: mastodon_credentials['vapid_public_key'], db_pass: postgresql_data_bag_item['mastodon_user_password'] end execute "bundle install" do environment "HOME" => mastodon_path user mastodon_user cwd mastodon_path command "/opt/ruby_build/builds/#{ruby_version}/bin/bundle install --without development,test --deployment" end execute "yarn install" do environment "HOME" => mastodon_path user mastodon_user cwd mastodon_path command "yarn install --pure-lockfile" end rails do migrate false rails_env "production" precompile_assets false # buggy, done manually below end execute 'rake db:migrate' do environment "RAILS_ENV" => "production", "HOME" => mastodon_path user mastodon_user group mastodon_user cwd mastodon_path command "PATH=\"/opt/ruby_build/builds/#{ruby_version}/bin:$PATH\" bundle exec rake db:migrate" end # This is the only way I could find that makes compiling the assets # successfully for now. application_ruby's precompile_assets crashes because # it cannot find the bundled gems execute 'rake assets:precompile' do environment "RAILS_ENV" => "production", "HOME" => mastodon_path user mastodon_user group mastodon_user cwd mastodon_path command "PATH=\"/opt/ruby_build/builds/#{ruby_version}/bin:$PATH\" bundle exec rake assets:precompile" end service "mastodon-web" do action [:enable, :start] end service "mastodon-sidekiq" do action [:enable, :start] end service "mastodon-streaming" do action [:enable, :start] end end # # Backup # unless node.chef_environment == "development" unless node["backup"]["postgresql"]["databases"].keys.include? 'mastodon' node.override["backup"]["postgresql"]["databases"]["mastodon"] = { username: "mastodon", password: postgresql_data_bag_item['mastodon_user_password'] } end include_recipe "backup" end