8
7

More than 3 years have passed since last update.

【Rails】wheneverを本番環境+Capistranoで使う

Last updated at Posted at 2020-08-26

環境

  • Ruby: 2.5.7
  • Rails: 5.2.4
  • 本番環境:AWS EC2/MySQL2/Nginx/Puma/Linux(CentOS)

前提

  • Capistrano導入済み

本番環境で動かす

1. wheneverを本番環境にセッティング

  • config/schedule.rb
env :PATH, ENV['PATH']
# ログファイルの出力先
set :output, 'log/cron.log'
# ジョブの実行環境の指定
set :environment, :production  ★ ここ変更


# 日本時間の午前8:00にメール送信される(JSTは+9:00なので-9:00の時間を記述)
# 未読通知が3件以上たまっているユーザーにメール通知
every 1.days, at: '11:00 pm' do
  runner "ScheduledProcessingMailer.check_notice_mail.deliver_now"
endb

実行環境はprodaction環境がデフォルト設定なのでset :environment, :developmentを下記に変更

2. config.application.rbに追記

  • config.application.rb
config.paths.add 'lib', eager_load: true

Rails5からデフォルトで本番環境時においてはautoloadが無効化されておりeager load(rails起動時にまとめて読み込む機能)が有効で、開発環境では逆にautoloadが有効でeager loadが無効になっているため。

こちらの記事を参考にさせていただきました。
Rails5のproduction環境でlib/配下のクラス読込みがNameErrorになるのはautoloadが無効化されたからだった

3. EC2current上で下記実行

# 定時処理の内容更新を反映
RAILS_ENV=production bundle exec whenever --update-crontab

# 無効化
RAILS_ENV=production bundle exec whenever --clear-crontab

# cronのログ確認
RAILS_ENV=production crontab  -l

ちなみに開発環境ではlog/cron.logでログが確認できたが本番環境では出力されない(当たり前)

Capistranoでwheneverをセットする

1. Capfile

require 'whenever/capistrano'

2. config/deploy.rb

set :whenever_roles,        ->{ :app }

3. 開発環境でcapコマンドを実行

bundle exec cap production deploy

参考にさせていただきました

capistrano3 + wheneverでハマったメモ

Railsでwheneverを使ってcronを設定する

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7