CentOS4 + Ruby1.9.1でRedmineを動かす

Redmineを使いたかったものの、ちょうどいいサーバがCentOS4しかなかったので、動かすまでの手順メモ。以前のメモの書き直し。

環境は以下の通り。

rubyのインストール

CentOS4でもrubyのrpmは提供されているが、rubygemsのrpmはyumでは見当たらない。そこで、rubygems-1.3.6をサイトからダウンロードしてインストールしようとするが、rubyのバージョンが低いためか、以下のようなエラーに遭遇する。

./lib/rubygems.rb:124: uninitialized constant Gem::RbConfig (NameError)
from setup.rb:24:in `require'
from setup.rb:24

RbConfigが 1.8.5 からのサポートであるのが原因らしいので、新しいバージョンのrubyをインストールする。ruby公式サイトからソースをダウンロード。今回は色気を出して最新の安定板 1.9.1-p378 を使用。おそらく、ここで 1.8系を選択しておけば、後に出てくるような日本語の問題は出なかったっぽい。

ビルドとインストールは通常通りで特に問題なし。インストールパスは /usr/local/ruby/ を指定。

$ tar xzfv ruby-1.9.1-p378.tar.gz
$ cd ruby-1.9.1-p378
$ ./configure --prefix=/usr/local/ruby
$ make
$ sudo make install

パスを通す。必要であれば、.bashrcにも書く。

$ export PATH=/usr/local/ruby/bin:$PATH
$ ruby -v
ruby 1.9.1p378 (2010-01-10 revision 26273) [x86_64-linux]

その後、rubygems の tar.gz を展開したディレクトリに移動し、インストール。

$ sudo ruby ./setup.rb

Redmineのインストール

ここからは、Redmineの公式サイトにあるインストール手順通りに進むので、手順のみ簡単に記載。

railsその他をインストールする。railsは 2.3.5がインストールされた。

# プロキシが必要な場合は、プロキシを設定
$ export http_proxy=...
$ sudo gem install rails
$ sudo gem install mysql

redmineのパッケージを展開。

$ tar xzfv ../redmine-0.9.3.tar.gz
$ cd redmine-0.9.3

セッションストアの設定。

$ rake config/initializers/session_store.rb

データベースを設定。MySQLを使用する。

# vi config/database.yml
production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8


上記のデータベースを作成。今回はRedmineを内部だけで利用するので、DBの権限は全面的に許可。ここは必要なクエリだけに制限した方が良い。

$ mysql -u root
> create database redmine;
> grant all on redmine.* to redmine@'localhost' identified by 'redmine';
> flush privileges;
> exit;

mysqlのデフォルトエンコーディングが utf8になっていなかったので、修正。

# vi /etc/my.cnf
(以下を追加)
[mysqld]
default-character-set=utf8
[mysql.server]
default-character-set=utf8
[mysql]
default-character-set=utf8

mysqlサーバーを再起動して、エンコーディングを確認。

$ sudo /etc/init.d/mysql restart
$ mysql -u root
> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.01 sec)


データベースを初期化して、Webrickを起動。

$ rake db:migrate RAILS_ENV=production
$ ./script/server -e production

ブラウザで http://hostname:3000/ にアクセスすると、Redmineが利用できる。

日本語の問題

上記だけだと、テキストフォームに日本語を利用すると、500番エラーになる。
エラーメッセージは下記。

ActionView::TemplateError (incompatible character encodings: UTF-8 and ASCII-8BIT) on line

Webを調べると以下のような情報がある。
https://rails.lighthouseapp.com/projects/8994/tickets/2476
https://rails.lighthouseapp.com/projects/8994/tickets/2188

どうも、ruby1.9から文字列にエンコーディングが設定されて、それがデフォルトでASCII-8BITになるのだが、DB adapter(MySQL/Ruby)がエンコーディングを気にせずに、デフォルトのASCII-8BITのまま返してしまうのが原因らしい。

今回はパッチをあてて対応。上記のサイトにはquickfixがいくつかあるが、以下のサイトの情報をたよりに良さげなパッチを入手。

http://kimiyure.betoku.jp/article/0240496.html
パッチ http://gist.github.com/273741

ダウンロードリンクからパッチをダウンロード。tar.gzを展開し、中のrbファイルを、パッチ冒頭の説明にあるとおりのパスにファイルを配置する。具体的には、redmine-0.9.3/config/initializers/ 以下。

再度サーバーを起動

$ ./script/server -e production

これだけだと以下のエラーが発生しうまく行かない。

*** Exception RuntimeError in PhusionPassenger::Railz::ApplicationSpawner (can't modify frozen string) (process 30678):
from /usr/local/ruby/lib/ruby/site_ruby/1.9.1/rubygems/version.rb:186:in `strip!'
from /usr/local/ruby/lib/ruby/site_ruby/1.9.1/rubygems/version.rb:186:in `initialize'
from /var/www/redmine-0.9.3/config/initializers/ruby_191_hacks.rb:12:in `new'
from /var/www/redmine-0.9.3/config/initializers/ruby_191_hacks.rb:12:in `'
...

どうもパッチ内部のバージョンチェックの部分で失敗しているらしいので、12行目のifと対応するendをコメントアウト。
再度サーバーを再起動すると、プロジェクトの詳細などに日本語を入れてもうまくいく。OK