From 933ca8c8d6dd314300f450742ca4edf548e7d3d3 Mon Sep 17 00:00:00 2001 From: Marc Anguera Insa Date: Thu, 3 Oct 2019 20:45:16 +0200 Subject: [PATCH 1/5] Remove LazyRecoverable and dalli --- Gemfile | 1 - Gemfile.lock | 2 -- app/models/concerns/lazy_recoverable.rb | 18 ------------------ app/models/user.rb | 2 -- app/views/devise/passwords/new.html.erb | 2 +- config/environments/production.rb | 1 - config/environments/staging.rb | 1 - 7 files changed, 1 insertion(+), 26 deletions(-) delete mode 100644 app/models/concerns/lazy_recoverable.rb diff --git a/Gemfile b/Gemfile index f8b962925..76bb04c84 100644 --- a/Gemfile +++ b/Gemfile @@ -10,7 +10,6 @@ gem 'has_scope' gem 'pundit', '~> 2.0.0' gem 'pg', '0.21.0' gem 'hstore_translate' -gem 'dalli' gem 'devise', '~> 4.5.0' gem "http_accept_language", '~> 2.1.1' gem 'unicorn' diff --git a/Gemfile.lock b/Gemfile.lock index 0e5810de5..400b860bc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -107,7 +107,6 @@ GEM concurrent-ruby (1.1.5) connection_pool (2.2.1) crass (1.0.4) - dalli (2.7.2) database_cleaner (1.6.2) debug_inspector (0.0.3) devise (4.5.0) @@ -405,7 +404,6 @@ DEPENDENCIES capistrano-rbenv (~> 2.1) capybara (~> 3.15) coffee-rails - dalli database_cleaner (= 1.6.2) devise (~> 4.5.0) dotenv-rails (~> 2.7.1) diff --git a/app/models/concerns/lazy_recoverable.rb b/app/models/concerns/lazy_recoverable.rb deleted file mode 100644 index 897fdcab1..000000000 --- a/app/models/concerns/lazy_recoverable.rb +++ /dev/null @@ -1,18 +0,0 @@ -# Overrides part of Devise::Models::Recoverable -# -# If the devised model has a recent enough token, just use it again! -# This way, the user will get the same token even if they receive two -# password recover email. -module LazyRecoverable - extend ActiveSupport::Concern - - RESET_PASSWORD_TOKEN_LAZINESS = 20.minutes - - def set_reset_password_token - # Just cache it! :) - cache_key = "reset_password_token_hash:#{self.reset_password_token}" - Rails.cache.fetch(cache_key, expires_in: RESET_PASSWORD_TOKEN_LAZINESS) do - super - end - end -end diff --git a/app/models/user.rb b/app/models/user.rb index fca0fdff6..11e194e7d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,6 +1,4 @@ class User < ActiveRecord::Base - include LazyRecoverable - devise *[ :database_authenticatable, :recoverable, diff --git a/app/views/devise/passwords/new.html.erb b/app/views/devise/passwords/new.html.erb index 3a1d0144b..fe217bb68 100644 --- a/app/views/devise/passwords/new.html.erb +++ b/app/views/devise/passwords/new.html.erb @@ -18,7 +18,7 @@
- <%= f.submit t(".send_instructions"), class: "btn btn-primary btn-lg col-xs-12" %> + <%= f.submit t(".send_instructions"), class: "btn btn-primary btn-lg col-xs-12", data: { disable_with: '...' } %>
diff --git a/config/environments/production.rb b/config/environments/production.rb index 63287d136..a08c2828b 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -56,7 +56,6 @@ # Use a different cache store in production. # config.cache_store = :mem_cache_store - config.cache_store = :dalli_store # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.action_controller.asset_host = 'http://assets.example.com' diff --git a/config/environments/staging.rb b/config/environments/staging.rb index 1ba241c29..1020fbbbf 100644 --- a/config/environments/staging.rb +++ b/config/environments/staging.rb @@ -56,7 +56,6 @@ # Use a different cache store in production. # config.cache_store = :mem_cache_store - config.cache_store = :dalli_store # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.action_controller.asset_host = 'http://assets.example.com' From ee4af8df9bf588b2215013c2001e6ff440576ad6 Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Fri, 20 Dec 2019 14:27:58 +0100 Subject: [PATCH 2/5] Require capistrano/rbenv always The new production server does work the same way as staging and this hack is not needed anymore. --- Capfile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Capfile b/Capfile index 961d5b90b..0f81c1684 100644 --- a/Capfile +++ b/Capfile @@ -16,11 +16,7 @@ require 'capistrano/deploy' # https://github.com/capistrano/passenger # require 'capistrano/rails' - -stage = ARGV.first -if stage != 'production' # Sorry, production is not ready yet - require 'capistrano/rbenv' -end +require 'capistrano/rbenv' # Load custom tasks from `lib/capistrano/tasks` if you have any defined Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r } From 1972bd6219b6b63426573da9fef95760acb64389 Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Fri, 20 Dec 2019 16:01:14 +0100 Subject: [PATCH 3/5] Reload Unicorn and Sidekiq after deployment So we can remove the following manual step from the deployment process: > 9. There is one last step though. Until we don't fix it, the app server needs to be restarted manually for the changes to be loaded. Run: > $ ssh timeoverflow@www.timeoverflow.org > $ sudo systemctl restart timeoverflow > $ sudo systemctl restart sidekiq Now Capistrano's output looks like: ``` INFO [fbff0613] Running /usr/bin/env rm -rf /var/www/timeoverflow/releases/20191220151536 as timeoverflow@staging.timeoverflow.org DEBUG [fbff0613] Command: ( export RBENV_ROOT="$HOME/.rbenv" RBENV_VERSION="" ; /usr/bin/env rm -rf /var/www/timeoverflow/releases/20191220151536 ) INFO [fbff0613] Finished in 0.183 seconds with exit status 0 (successful). INFO [9ab57c12] Running sudo systemctl reload timeoverflow as timeoverflow@staging.timeoverflow.org DEBUG [9ab57c12] Command: sudo systemctl reload timeoverflow INFO [9ab57c12] Finished in 0.218 seconds with exit status 0 (successful). INFO [41e063eb] Running sudo systemctl restart sidekiq as timeoverflow@staging.timeoverflow.org DEBUG [41e063eb] Command: sudo systemctl restart sidekiq INFO [41e063eb] Finished in 2.895 seconds with exit status 0 (successful). DEBUG [3772e021] Running if test ! -d /var/www/timeoverflow/releases; then echo "Directory does not exist '/var/www/timeoverflow/releases'" 1>&2; false; fi as timeoverflow@staging.timeoverflow.org DEBUG [3772e021] Command: if test ! -d /var/www/timeoverflow/releases; then echo "Directory does not exist '/var/www/timeoverflow/releases'" 1>&2; false; fi DEBUG [3772e021] Finished in 0.181 seconds with exit status 0 (successful). INFO [266848f2] Running echo "Branch reload-unicorn-after-deployment (at fad9dbd) deployed as release 20191220152039 by pau" >> /var/www/timeoverflow/revisions.log as timeoverflow@staging.timeoverflow.org DEBUG [266848f2] Command: echo "Branch reload-unicorn-after-deployment (at fad9dbd) deployed as release 20191220152039 by pau" >> /var/www/timeoverflow/revisions.log INFO [266848f2] Finished in 0.181 seconds with exit status 0 (successful). ``` Which generates the following log line ``` ==> log/unicorn.err.log <== E, [2019-12-20T16:20:59.911297 #32630] ERROR -- : reexec-ed child already running PID:1213 ``` --- config/deploy.rb | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/config/deploy.rb b/config/deploy.rb index eb4d44cf7..ba4e81a33 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -47,13 +47,20 @@ # Default value for keep_releases is 5 # set :keep_releases, 5 -namespace :deploy do - after :restart, :clear_cache do - on roles(:web), in: :groups, limit: 3, wait: 10 do - # Here we can do anything such as: - # within release_path do - # execute :rake, 'cache:clear' - # end +namespace :unicorn do + desc 'reload Unicorn' + task :reload do + on roles(:app) do + execute "sudo systemctl reload timeoverflow" + end + end +end + +namespace :sidekiq do + desc 'reload Sidekiq' + task :restart do + on roles(:app) do + execute "sudo systemctl restart sidekiq" end end end @@ -67,4 +74,8 @@ end end end + before "deploy:migrate", "deploy:db:load" if ENV["COLD"] + +after "deploy:finishing", "unicorn:reload" +after "deploy:finishing", "sidekiq:restart" From e702af3b50ff7d0cb9b88eb43a11db1762a7ed98 Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Fri, 20 Dec 2019 16:33:30 +0100 Subject: [PATCH 4/5] Symlink next env config to production's This is the safest way to have the exact same config across these two envs. Keep in mind next will die in the upcoming days. Meanwhile, let's keep them in sync. --- config/environments/next.rb | 99 +------------------------------------ 1 file changed, 1 insertion(+), 98 deletions(-) mode change 100644 => 120000 config/environments/next.rb diff --git a/config/environments/next.rb b/config/environments/next.rb deleted file mode 100644 index 1ba241c29..000000000 --- a/config/environments/next.rb +++ /dev/null @@ -1,98 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # Code is not reloaded between requests. - config.cache_classes = true - - # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both threaded web servers - # and those relying on copy on write to perform better. - # Rake tasks automatically ignore this option for performance. - config.eager_load = true - - # Full error reports are disabled and caching is turned on. - config.consider_all_requests_local = false - config.action_controller.perform_caching = true - - # Enable Rack::Cache to put a simple HTTP cache in front of your application - # Add `rack-cache` to your Gemfile before enabling this. - # For large-scale production use, consider using a caching reverse proxy like - # NGINX, varnish or squid. - # config.action_dispatch.rack_cache = true - - # Disable serving static files from the `/public` folder by default since - # Apache or NGINX already handles this. - config.serve_static_files = true - - # Compress JavaScripts and CSS. - config.assets.js_compressor = :uglifier - # config.assets.css_compressor = :sass - - # Do not fallback to assets pipeline if a precompiled asset is missed. - config.assets.compile = true # false - - # Asset digests allow you to set far-future HTTP expiration dates on all assets, - # yet still be able to expire them through the digest params. - config.assets.digest = true - - # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb - - # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX - - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - config.force_ssl = true - - # Use the lowest log level to ensure availability of diagnostic information - # when problems arise. - config.log_level = :debug - - # Prepend all log lines with the following tags. - # config.log_tags = [ :subdomain, :uuid ] - - # Use a different logger for distributed setups. - # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) - - # Use a different cache store in production. - # config.cache_store = :mem_cache_store - config.cache_store = :dalli_store - - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = 'http://assets.example.com' - - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - config.action_mailer.raise_delivery_errors = true - - config.action_mailer.delivery_method = :smtp - config.action_mailer.default_url_options = { - host: ENV["MAIL_LINK_HOST"], - protocol: (ENV["MAIL_LINK_PROTO"] || "https") - } - - # Retrieve SMTP configuration from environment variables - # starting with `SMTP_` - smtp_env = Hash[ENV.map do |k,v| - if /^SMTP_(.*)$/ === k - [$1.downcase.to_sym, YAML.load(v)] - end - end.compact] - - if smtp_env.present? - config.action_mailer.smtp_settings = smtp_env - end - - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation cannot be found). - config.i18n.fallbacks = true - - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify - - # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new - - # Do not dump schema after migrations. - config.active_record.dump_schema_after_migration = false -end diff --git a/config/environments/next.rb b/config/environments/next.rb new file mode 120000 index 000000000..0c153beb0 --- /dev/null +++ b/config/environments/next.rb @@ -0,0 +1 @@ +config/environments/production.rb \ No newline at end of file From 5a607e9f0beab191c06dd2f16861bdcbac99c742 Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Tue, 21 Jan 2020 17:51:35 +0100 Subject: [PATCH 5/5] Replace DATABASE_URL with DATABASE_NAME We used to connect to it through the PostgreSQL URL but that ENV var is no longer present in the server and we have `DATABASE_NAME` instead. That's what we already used successfully with the `next` environment. This is required to deploy using the `production` environment or the app won't be able to connect to the DB. --- config/database.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/database.yml b/config/database.yml index 83e46dd15..cc142aa2d 100644 --- a/config/database.yml +++ b/config/database.yml @@ -31,8 +31,8 @@ staging: database: <%= ENV.fetch('DATABASE_NAME', 'timeoverflow_staging') %> production: - # Set DATABASE_URL environment variable - url: <%= ENV['DATABASE_URL'] %> + <<: *defaults + database: <%= ENV.fetch('DATABASE_NAME', 'timeoverflow_production') %> next: <<: *defaults