=================
RedmineのSidekiqプラグインを作ったのでHerokuにRedmineをデプロイしました。
(MOGOKにデプロイした手順は[こちら]
(http://qiita.com/items/887f93ed6fe08539ab59))
Sidekiqは非同期の処理が簡単に実装できるライブラリです。
Redmineではチケットの一括処理やレポーティングなど時間のかかる
処理を実施するときに非同期処理が便利です。
Clockworkも便利なライブラリでcron
の様な定期的な処理が簡単に実装できます。
時間帯によってメニューを変更するやロールを自動で設定するなどの用途に使えます。
Sidekiqプラグインを利用するとClockworkのGemもインストールされます。
また、SidekiqのアドインのGemもいくつかインストールされます。
Sandboxのサンプルを使えばすぐにSidekiqの非同期処理を試す事ができます。
今回はHerokuでSidekiqのWorkerをClockworkで定期的に実行してみました。
Rails(Redmine),Sidekiq,Clockworkの3プロセスを動かすとコストは高いですが
多様なアプリケーションを実装することができます。
環境
- Mac OS X Lion
- Ruby 1.9.3p392
- Redmine 2.2.4
- Sidekiq 2.10.0
- Clockwork 0.5.0
手順
エディタを使わないでコマンドのみでRedmineを公開できます。
(作業時間は10分程度です。)
主にgit
、bundler
、heroku
のコマンドを利用します。
$ gem install bundler
$ gem install heroku
Redmine
GitのリポジトリからRedmineをダウンロードして安定版を使います。
$ git clone https://github.com/redmine/redmine.git
$ cd redmine
$ git checkout 2.2-stable
Comment Out
Herokuのデプロイでエラーになる箇所をコメントアウトします。
HerokuでSqlite
は使えません。
$ sed -i.bak 's/gem "sqlite3"/#gem "sqlite3"/g' Gemfile
$ rm Gemfile.bak
secret_token.rb
などをリポジトリに含めます。
$ sed -i.bak 's/\/config\/configuration.yml/#\/config\/configuration.yml/g' .gitignore
$ sed -i.bak 's/\/config\/email.yml/#\/config\/email.yml/g' .gitignore
$ sed -i.bak 's/\/config\/initializers\/session_store.rb/#\/config\/initializers\/session_store.rb/g' .gitignore
$ sed -i.bak 's/\/config\/initializers\/secret_token.rb/#\/config\/initializers\/secret_token.rb/g' .gitignore
$ sed -i.bak 's/\/public\/plugin_assets/#\/public\/plugin_assets/g' .gitignore
$ sed -i.bak 's/\/Gemfile.lock/#\/Gemfile.lock/g' .gitignore
$ sed -i.bak 's/\/Gemfile.local/#\/Gemfile.local/g' .gitignore
$ rm .gitignore.bak
exit 1
をコメントアウトします。
$ sed -i.bak 's/exit/#exit/g' ./config/environment.rb
$ rm ./config/environment.rb.bak
Sidekiq
Redisが必要なのでREDIS TO GOのfree plan
を使いました。
$ git clone https://github.com/ogom/redmine_sidekiq.git ./plugins/redmine_sidekiq
$ rm -rf ./plugins/redmine_sidekiq/.git
$ rm ./plugins/redmine_sidekiq/.gitignore
$ cat << __EOS__ > ./plugins/redmine_sidekiq/config/sidekiq.yml
production:
redis:
url: redis://redistogo:abc123def456hij789@dogfish.redistogo.com:9876
namespace: sidekiqspace
status:
expiration: 30
__EOS__
Foreman
HerokuはForemanでSidekiqのWorkerを管理します。
Procfileを作成するとHerokuでForemanが実行されます。
$ cat << __EOS__ > Procfile
web: bundle exec rails server -p \$PORT
worker: bundle exec sidekiq -c 2
clock: bundle exec clockwork schedule/clock.rb
__EOS__
Clockwork
こちらのサンプルはSandboxWorker
が1分間隔で実行されます。
$ mkdir schedule
$ cat << __EOS__ > ./schedule/clock.rb
require_relative '../config/boot'
require_relative '../config/environment'
require 'clockwork'
module Clockwork
every(1.minutes, 'SandboxWorker') { SandboxWorker.perform_async }
end
__EOS__
Bundler
シークレットトークンを作成します。
$ bundle install --path=.bundle --without development test mysql postgresql rmagick
$ bundle exec rake generate_secret_token
Heroku
Deploy
Herokuにアプリケーションをデプロイします。
(ブランチはstable
をmaster
にします。)
heroku open
コマンドでブラウザにRedmineが表示されるとデプロイは成功です。
$ heroku create redmine224
$ git add .
$ git commit -m "prepare for heroku"
$ git push heroku 2.2-stable:master
$ heroku run rake db:migrate
$ heroku run rake redmine:load_default_data REDMINE_LANG=en
$ heroku restart
$ heroku open
デフォルト管理アカウント
- username:admin
- password:admin
デフォルトの管理アカウントは変更しましょう!
Resources
Herokuは単体プロセスの利用のみ無料です。順番にプロセスを切替えて
Rails、Sidekiq、Clockworkの動作を確認しましょう。
(heroku ps
コマンドでプロセスの一覧が表示されます。)
まず、clockworkを起動して、次にsidekiqでWorker
が実施します。
最後にWeb UIでProcessed
の数字が増えていたら処理が実行されています。
(heroku logs
コマンドでForemanの標準出力が表示されます。)
$ heroku ps:scale web=0 worker=0 clock=0
$ heroku ps:scale web=0 worker=0 clock=1
$ heroku ps:scale web=0 worker=1 clock=0
$ heroku ps:scale web=1 worker=0 clock=0
Tips
SidekiqプラグインはTopメニューにSidekiq
が表示されます。
クリックするとSidekiqのWeb UI
が表示されます。
(Web UI
は管理者でログインすると表示されます。管理者のみ利用可能です。)
Herokuはファイルの書き込みが可能なのでチケットにファイルの添付ができます。