rbenv+ruby-buildとunicornでもっとさくっとRedmine入れてみる

前にこういう記事書いたんですけど、Redmine プロジェクトは結構活発でついこの間 1.4.0 がリリースされてました。なんと Ruby1.9 系へ対応!Gemfile も提供されるようになってよりインストールが簡単になってたのでかっとなってやってみました。ついでにこちらもだいぶ枯れてきた rbenv+ruby-build を使い、HTTP サーバとしては unicorn を使ってみました。

rbenv+ruby-build のインストール

git は入っている前提ですが、超簡単です。

$ cd
$ git clone https://github.com/sstephenson/rbenv.git .rbenv
$ mkdir -p ~/.rbenv/plugins
$ cd ~/.rbenv/plugins
$ git clone https://github.com/sstephenson/ruby-build.git

あとは.bashrc とかに以下の記述をして再読込。

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

これで rbenv コマンドが(タブ補完つきで)使うことができます。さて、早速 ruby を入れたいんですが、後ほどハマらないように先に OS のパッケージ管理で openssl の開発パッケージを入れておきます。

# yum install openssl-devel

Redmine1.4 からはついに ruby1.9 が使えるので 1.9.3 を入れてみましょう。

$ rbenv install 1.9.3-p125
$ rbenv rehash
$ rbenv versions
  1.9.3-p125

Redmine のダウンロード

tar.gz をダウンロードしてもいいんですが、有志の方が本家の svn を github に上げてくれいているのでそれを使ってみます。

$ cd
$ git clone https://github.com/redmine/redmine.git
$ cd redmine
$ git branch -a
  master
  remotes/origin/0.6-stable
  remotes/origin/0.7-stable
  remotes/origin/0.8-stable
  remotes/origin/0.9-stable
  remotes/origin/1.0-stable
  remotes/origin/1.1-stable
  remotes/origin/1.2-stable
  remotes/origin/1.3-stable
  remotes/origin/1.4-stable
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

こういう感じでバージョンごとに stable の branch があるのでとりあえずこれに切り替えておけば多分 git pull するだけで stable の最新版を追いかけられる様な気がしました(勘で言ってます)。

$ cd ~/redmine
$ git checkout -b 1.4-stable remotes/origin/1.4-stable
$ git branch
* 1.4-stable
  master

ではここで先程ビルドしたバージョンの ruby を使う様に rbenv の設定をします。

$ cd ~/redmine
$ rbenv local 1.9.3-p125
$ ruby -v
ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-linux]
$ rbenv which ruby
/home/riywo/.rbenv/versions/1.9.3-p125/bin/ruby

このディレクトリ配下にいるときだけこの設定は効果を発揮しますので、別のディレクトリに移ると元に戻ります。おもしろいですね。

$ cd ~
$ rbenv which ruby
/usr/bin/ruby

bundler のインストール

基本的に gem パッケージはアプリケーション毎にローカルに持つんですけど、それを実現するための bundler パッケージだけは先程ビルドした ruby 本体の中に入れてしまいます。rbenv shellとかでもいんですけど、先程rbenv localで設定したディレクトリで作業しちゃいます。

$ cd ~/redmine
$ rbenv which gem
/home/riywo/.rbenv/versions/1.9.3-p125/bin/gem
$ gem install bundler
$ rbenv rehash
$ bundle -v
Bundler version 1.1.3

これ以降、このバージョンの ruby に対しては直接gemコマンドを叩くことはありません。全て Gemfile という DSL に記述してbundleコマンドで、アプリケーションローカルにインストールしていきます。

Redmine の依存モジュールをインストール

Redmine1.4 からは Gemfile が提供されているので何も考えずに叩くだけです。ただし、普通に叩くと ruby 本体の方に入ってしまうので、オプションでインストール場所をローカルにしておきます。Imagemagick とかポスグレとかは無視。MySQL のクライアントライブラリは先に頑張って入れておいて下さい。

$ cd ~/redmine
$ bundle install --path vendor/bundle --without development test rmagick postgresql sqlite

簡単ですね!ついでに Unicorn も入れておきたいので Gemfile.local というファイルを作ってもう一回実行します。すでにインストール先は設定されてるのでオプション不要です。

$ cd ~/redmine
$ echo 'gem "unicorn"' > Gemfile.local
$ bundle install
$ bundle --verbose list

初めてのインストールの場合

Redmine を初めてインストールする場合はドキュメントに従ってゴニョゴニョします。一応コマンド書いてますが、最新のドキュメントを常に参照して下さい。

MySQL のユーザは適当に。

create database redmine character set utf8;
create user 'redmine'@'localhost' identified by 'my_password';
grant all privileges on redmine.* to 'redmine'@'localhost';

config/database.yml は以下の様に。mysql2を指定するのがポイントだそうです。

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: my_password

あとはひたすらrakeコマンド。ただし、bundler で gem を入れているのでbundle execで実行します。終わったら試しに WEBrick で起動してブラウザで見てみましょう。

$ cd ~/redmine
$ bundle exec rake -- generate_session_store
$ RAILS_ENV=production bundle exec rake db:migrate
$ RAILS_ENV=production bundle exec rake  redmine:load_default_data
$ bundle exec script/server webrick -e production

1.2 とかからアップデートする場合

解説めんどいのでドキュメント見てください。。。大して難しくないです。rakeするときにbundle execするのをお忘れなく。

Unicorn で起動

あとはこれを unicorn で起動するだけです。起動方法のデファクトがよく分からなかったので、とりあえず慣れてる daemontools ならこんな感じかと。unicorn の config 自体はイマイチよく分かってないのでサンプルを適当にいじっただけ。

https://gist.github.com/240882

これで 8080 ポートで待ち受けているので、後は Apache なり nginx なりからリバースプロキシしてあげれば完成かなと思います。

おわりに

だいぶすっきりしたなぁという印象です。ruby は bundler も rbenv もよくできていて、スタンドアロンな環境をさくさく作れていい感じだと思います。

また、Redmine プロジェクトはこれだけの結構大きいアプリケーションなのに精力的に開発されていてすばらしいと思いました。ちっぽけですが少しでも貢献できればと思い記事をしたためました。


Ryosuke Iwanaga

Software engineer / Anime / NFL / Father. Posts are my own, not endorsed by any org.