diff --git a/Gemfile b/Gemfile index 0473c2c0..35855b67 100644 --- a/Gemfile +++ b/Gemfile @@ -27,6 +27,7 @@ gem 'rails-i18n' gem 'rollbar', require: ENV.key?('ROLLBAR_ACCESS_TOKEN') gem 'ruby-vips' gem 'shakapacker' +gem 'sidekiq', require: ENV.key?('REDIS_URL') gem 'sqlite3', require: false gem 'strip_attributes' gem 'turbo-rails' diff --git a/Gemfile.lock b/Gemfile.lock index 4988cb69..509eedc7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -388,6 +388,8 @@ GEM zeitwerk (~> 2.5) rainbow (3.1.1) rake (13.0.6) + redis-client (0.14.1) + connection_pool regexp_parser (2.8.1) reline (0.3.5) io-console (~> 0.5) @@ -458,6 +460,11 @@ GEM rack-proxy (>= 0.6.1) railties (>= 5.2) semantic_range (>= 2.3.0) + sidekiq (7.1.2) + concurrent-ruby (< 2) + connection_pool (>= 2.3.0) + rack (>= 2.2.4) + redis-client (>= 0.14.0) signet (0.17.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) @@ -554,6 +561,7 @@ DEPENDENCIES rubocop-rspec ruby-vips shakapacker + sidekiq simplecov sqlite3 strip_attributes diff --git a/config/environments/development.rb b/config/environments/development.rb index 79c1486c..78916919 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -45,6 +45,8 @@ Rails.application.configure do config.cache_store = :null_store end + config.active_job.queue_adapter = :sidekiq if defined?(Sidekiq) + # Store uploaded files on the local file system (see config/storage.yml for options). config.active_storage.service = :disk config.active_storage.resolve_model_to_route = :rails_storage_proxy diff --git a/config/environments/production.rb b/config/environments/production.rb index 45e74ce2..34b3443d 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -25,6 +25,8 @@ Rails.application.configure do config.action_controller.perform_caching = true config.active_record.sqlite3_production_warning = false + config.active_job.queue_adapter = :sidekiq if defined?(Sidekiq) + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). # config.require_master_key = true diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb new file mode 100644 index 00000000..4733a1c1 --- /dev/null +++ b/config/initializers/sidekiq.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +if defined?(Sidekiq) + require 'sidekiq/web' + + Sidekiq::Web.use(Rack::Auth::Basic) do |_, password| + next true if Rails.env.development? + + ActiveSupport::SecurityUtils.secure_compare( + Digest::SHA256.hexdigest(password), + Digest::SHA256.hexdigest(ENV.fetch('SIDEKIQ_BASIC_AUTH_PASSWORD')) + ) + end + + Sidekiq.strict_args! +end diff --git a/config/routes.rb b/config/routes.rb index f20fa0cf..03a89a6e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,7 @@ Rails.application.routes.draw do mount LetterOpenerWeb::Engine, at: '/letter_opener' if Rails.env.development? + mount Sidekiq::Web => '/sidekiq' if defined?(Sidekiq) root 'dashboard#index' diff --git a/config/sidekiq.yml b/config/sidekiq.yml new file mode 100644 index 00000000..36e2a6f3 --- /dev/null +++ b/config/sidekiq.yml @@ -0,0 +1,6 @@ +queues: + - [default, 1] + - [mailers, 1] + +production: + :concurrency: 15