サイト移転のお知らせ

しばらくブログお休みしていましたが、こちらに移転しました。よろしければこちらへどうぞ。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

さくらサーバにRedmine-1.3.2 + gateway.cgiを入れてみた

ネットを探してみるとさくらサーバにRedmineを入れる方法に関する記事や、動作を高速化させるgateway.cgiの記事が多く見つかりますが、使用している バージョンが0.8.xと古い記事しか見つからないので、改めて現時点での最新版で試してみたいと思います。
※さくらサーバでは0.9.x以降のバージョンは動かない、なんて記事もあるので若干不安いっぱいでしたが、結果としてなんとか動かすことができました(正しいかどうかは別として)。

基本的な手順はこちらを参考にさせていただきました。
さくらインターネットにRedmineを入れたメモ - へたれエンジニア日記 ver.2

まずはバージョンの確認。
http://www.redmine.org/projects/redmine/wiki/RedmineInstall
をみると、Redmineの最新版は1.3.2で、その他以下のバージョンが必要とのこと。
- RubyGems <= 1.7
- Rack 1.1.x
- Rails 2.3.14
- ruby 1.8.6, 1.8.7

これ以外にも、Compativility notesとしていくつかの要件が記載されています。
今回重要そうなのは
- Ruby 1.9はまだ非サポート
- Rake 0.8.7が必要(rake 0.9.xはRailesで非サポート)
- I18n 0.4.2が必要
あたりでしょうか。このあたりに注意しながらインストールして行きます。

まず、さくらサーバのツールのバージョンの確認。

$ which ruby
/usr/local/bin/ruby
$ ruby -v
ruby 1.8.7 (2011-12-28 patchlevel 357) [i386-freebsd7]

お、そのまま使えそうだ。
続いてgem
$ which gem
/usr/local/bin/gem
$ gem -v
1.6.2
惜しい。というわけで、まずはgemから入れる必要がありそうです。
※(2012/5/27追記)
 2012/5/27時点でさくらのgemコマンドのバージョンが1.8.11に変わっていました。なので、ここのgemを入れる手順は不要になります。

なお、今回ローカルのインストール先は$HOME/localとしています。
また、環境変数を以下のように設定しておきます。
export PATH=$HOME/local/bin:$PATH
export RUBYLIB=$HOME/local/lib
export GEM_HOME=$HOME/local/lib/ruby/gem
export PATH=$GEM_HOME/bin:$PATH
export RB_USER_INSTALL="true"

- rubygemsのインストール

こちらから各バージョンがダウンロードできます。
http://rubyforge.org/frs/?group_id=126&release_id=27655

$ wget http://rubyforge.org/frs/download.php/74619/rubygems-1.7.2.tgz
$ tar xvzf rubygems-1.7.2.tgz
$ cd rubygems-1.7.2
$ ruby setup.rb --prefix $HOME/local
$ cd $HOME/local/bin
$ ln -s gem18 gem
$HOME/local/bin/gem18としてインストールされるので、gemで使えるようにシンボリックリンクも張っておきました。
# /usr/local/bin/gemもgem18のシンボリックリンクになっているみたいだし、これでよいでしょう。

つづいて、gem install railsとすれば依存関係を考慮して必要なコマンドと共にrailsが入りますが
こうすると、前述したバージョンの要件に合わないものが入ってしまうので、個別に入れて行きます。

- Rakeのインストール

http://www.redmine.org/projects/redmine/wiki/RedmineInstall
のCompatibility notesにあるように、0.8.7を入れます。
$ gem install rake -v=0.8.7
Fetching: rake-0.8.7.gem (100%)
Successfully installed rake-0.8.7
1 gem installed
Installing ri documentation for rake-0.8.7...
Installing RDoc documentation for rake-0.8.7...
$ which rake
/home/user/local/lib/ruby/gem/bin/rake
$ rake --version
rake, version 0.8.7

- Rackのインストール
1.1.0はダメで1.1.xが必要とのこと。1.1.3があるようなのでこれを入れます。
$ gem install rack -v=1.1.3
Fetching: rack-1.1.3.gem (100%)
Successfully installed rack-1.1.3
1 gem installed
Installing ri documentation for rack-1.1.3...
Installing RDoc documentation for rack-1.1.3...

- I18nのインストール
これは0.4.2が必要です。
$ gem install i18n -v=0.4.2
Fetching: i18n-0.4.2.gem (100%)
Successfully installed i18n-0.4.2
1 gem installed
Installing ri documentation for i18n-0.4.2...
Installing RDoc documentation for i18n-0.4.2...

- Railsのインストール
Railsは2.3.14を入れます。
$ gem install rails -v=2.3.14
Fetching: activerecord-2.3.14.gem (100%)
Fetching: actionpack-2.3.14.gem (100%)
Fetching: actionmailer-2.3.14.gem (100%)
Fetching: activeresource-2.3.14.gem (100%)
Fetching: rails-2.3.14.gem (100%)
Successfully installed activesupport-2.3.14
Successfully installed activerecord-2.3.14
Successfully installed actionpack-2.3.14
Successfully installed actionmailer-2.3.14
Successfully installed activeresource-2.3.14
Successfully installed rails-2.3.14
6 gems installed
Installing ri documentation for activesupport-2.3.14...
Installing ri documentation for activerecord-2.3.14...
Installing ri documentation for actionpack-2.3.14...
Installing ri documentation for actionmailer-2.3.14...
Installing ri documentation for activeresource-2.3.14...
Installing ri documentation for rails-2.3.14...
Installing RDoc documentation for activesupport-2.3.14...
Installing RDoc documentation for activerecord-2.3.14...
Installing RDoc documentation for actionpack-2.3.14...
Installing RDoc documentation for actionmailer-2.3.14...
Installing RDoc documentation for activeresource-2.3.14...
Installing RDoc documentation for rails-2.3.14...

最後に確認。
$ gem list

*** LOCAL GEMS ***

actionmailer (2.3.14)
actionpack (2.3.14)
activerecord (2.3.14)
activeresource (2.3.14)
activesupport (2.3.14)
deprecated (2.0.1)
i18n (0.4.2)
rack (1.1.3)
rails (2.3.14)
rake (0.8.7)
sources (0.0.2)
ちゃんと必要なバージョンが入って、ようやくRedmineを入れる準備ができました。

- fcgiのインストール
dispatch.cgiを使う場合は以上でよいのですが、今回はgateway.cgiを使うことを目標にしているので
以下の手順でfcgiもインストールします。
ここの手順は以下のサイトを参考にさせていただきました。
さくらサーバーでRailsを高速に動作させる方法 - cimada-ism
mechanical DIARY さくらサーバへRedmineをインストールしてみた

※(2012/5/12追記)
 さくらサーバの環境が変わったようで(変わったのは自分の設定かもしれませんが)、以下の赤字の部分の指定が必要なようです。
詳細については、さくらサーバでのfastcgiのコンパイルでこけたをご覧ください。

$ wget http://fastcgi.com/dist/fcgi-2.4.0.tar.gz
$ tar xvzf fcgi-2.4.0.tar.gz
$ cd fcgi-2.4.0
$ ./configure --prefix=$HOME/local CFLAGS="-g -O2 -Wall -fPIC" CXXFLAGS="-g -O2 -Wall -fPIC"
$ make
$ make install
$
$ gem install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib
Fetching: fcgi-0.8.8.gem (100%)
Building native extensions.  This could take a while...
WARNING: fcgi-0.8.8 has an invalid nil value for @cert_chain
Successfully installed fcgi-0.8.8
1 gem installed
Installing ri documentation for fcgi-0.8.8...
Installing RDoc documentation for fcgi-0.8.8...
$ 
$ gem list

*** LOCAL GEMS ***

actionmailer (2.3.14)
actionpack (2.3.14)
activerecord (2.3.14)
activeresource (2.3.14)
activesupport (2.3.14)
deprecated (2.0.1)
fcgi (0.8.8)
i18n (0.4.2)
rack (1.1.3)
rails (2.3.14)
rake (0.8.7)
sources (0.0.2)

- redmineの展開
redmineは、$HOME/rails/redmineでアクセスできるように展開することにします。
redmine自体は以下から取得できます。
RubyForge: Redmine: ファイルリスト
$ mkdir $HOME/rails
$ cd $HOME/rails
$ wget http://rubyforge.org/frs/download.php/75910/redmine-1.3.2.tar.gz
$ tar xvzf redmine-1.3.2.tar.gz 
$ ln -s redmine-1.3.2 redmine

環境に合わせて各種ファイルを修正します。修正するファイルは以下。
- config/database.yml
- config/environment.rb
- config/environments/production.rb
- public/.htaccess
- config/database.yml

- config/database.yml
database.ymlはデフォルトではファイルとして存在しないので、database.yml.exampleをコピーして使います。
変更個所は、productionの項目。さくらのmysqlデータベースを設定しておき、それに合わせて修正します。
修正前
production:
  adapter: mysql
  database: redmine
  host: localhost
  username: root
  password:
  encoding: utf8
修正後
production:
    adapter: mysql
    database: user_redmine
    host: mysql417.db.sakura.ne.jp
    username: user
    password: xxxxx
    encoding: utf8
    socket: /tmp/mysql.sock
最後のsocketがポイントらしいです。

- config/environment.rb
environment.rb
先頭に以下の記述を追加します。
user_home="/home/user/local"
$LOAD_PATH.push(user_home + "/lib/")
$LOAD_PATH.push(user_home + "/lib/ruby")
ENV['GEM_HOME'] ||= user_home + '/lib/ruby/gem'
# user_homeの値は各自の環境に合わせてください。

- config/environments/production.rb
ファイルの最後に以下の記述を追加します。
24行目
ActionController::Base.relative_url_root = "/redmine"
#これも、ブラウザでアクセスするパスに合わせて変更変更してください。

- public/.htaccess
これもデフォルトでは存在しないので、htaccess.fcgi.exampleをコピーして使います。
変更内容は、以下の行をコメントアウトします。
また、dispatch.cgiを使うようになっているところをgateway.cgiを使うように変更します。

変更前
Options +FollowSymLinks +ExecCGI
変更後
#Options +FollowSymLinks +ExecCGI
変更前

	RewriteRule ^(.*)$ dispatch.cgi [QSA,L]

変更後

	RewriteRule ^(.*)$ gateway.cgi [QSA,L]

- public/gateway.cgi
gateway.cgiを使うようにするファイルです。Railsに含まれているものをコピーして使います。
$ cd $HOME/rails/redmine
$ cp $HOME/local/lib/ruby/gem/gems/rails-2.3.14/dispatches/gateway.cgi public/
修正前
#!/usr/bin/env ruby
修正後
#!/usr/local/bin/ruby
ENV['RAILS_ENV']||='production'

- script/listener
これもgateway.cgiを使うようにするファイルです。Railsに含まれているものをコピーして使います。

$ cp $HOME/local/lib/ruby/gem/gems/rails-2.3.14/lib/commands/ncgi/listener script/
以下のとおり、2カ所行の追加を行います。
修正前
#!/usr/bin/env ruby

require 'stringio'
require 'fileutils'
require 'fcgi_handler'

修正後
#!/usr/local/bin/ruby

require 'stringio' require 'fileutils' require 'rubygems' gem 'fcgi' require 'fcgi_handler'
修正前
class RemoteCGI < CGI
  attr_accessor :stdinput, :stdoutput, :env_table
  def initialize(env_table, input = nil, output = nil)
    self.env_table = env_table
    self.stdinput = input || StringIO.new
    self.stdoutput = output || StringIO.new
    super()
  end
修正後
class RemoteCGI < CGI
  attr_accessor :stdinput, :stdoutput, :env_table
  def initialize(env_table, input = nil, output = nil)
    self.env_table = env_table
    self.stdinput = input || StringIO.new
    self.stdoutput = output || StringIO.new
    $stdin = self.stdinput
    $stdout = self.stdoutput
    super()
  end

- script/tracker
これもgateway.cgiを使うようにするファイルです。Railsに含まれているものをコピーして使います。
$ cp $HOME/local/lib/ruby/gem/gems/rails-2.3.14/lib/commands/ncgi/tracker script/
修正前
#!/usr/bin/env ruby
修正後
#!/usr/local/bin/ruby

- public/dispatch.cgi
今回は、gateway.cgiで動かすことを目標としているので不要ですが、ついでなので、dispatch.cgiの用意と修正も実施しておきます。

$ cd $HOME/rails/redmine/public/
$ cp dispatch.cgi.example dispatch.cgi
変更前
#!/usr/bin/env ruby
変更後
#!/usr/local/bin/ruby
ENV['RAILS_ENV']||='production'

- session sotre secretの生成
$ rake generate_session_store
(in /home/user/rails/redmine-1.3.2)
NOTE: SourceIndex.new(hash) is deprecated; From /home/user/rails/redmine-1.3.2/config/../vendor/rails/railties/lib/rails/vendor_gem_source_index.rb:100:in `new'.
Please install RDoc 2.4.2+ to generate documentation.
ちょっとワーニングっぽいものが出たけど、ドキュメント関係なので無視することにします。

- データベース構造の生成
PinMarch: Rails 2.3が動かず苦悩
を参考にしました。
$ RAILS_ENV=production rake db:migrate
$ RAILS_ENV=production rake redmine:load_default_data
(in /home/user/rails/redmine-1.3.2)
NOTE: SourceIndex.new(hash) is deprecated; From /home/user/rails/redmine-1.3.2/config/../vendor/rails/railties/lib/rails/vendor_gem_source_index.rb:100:in `new'.
Please install RDoc 2.4.2+ to generate documentation.

Select language: ar, bg, bs, ca, cs, da, de, el, en, en-GB, es, eu, fa, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, lv, mk, mn, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sr, sr-YU, sv, th, tr, uk, vi, zh, zh-TW [en] ja
====================================
Default configuration data loaded.
プロンプトが出たら、jaを入力してリターン。

- ディレクトリパーミッションの設定
ログが書き出されるディレクトリのパーミッションを変更しておきます。
$ cd $HOME/rails/redmine
$ chmod -R o+w files log tmp public/plugin_assets

- ログディレクトリの作成
gateway.cgiを使う場合は以下のディレクトリを作成しておきます。
$ cd $HOME/rails/redmine
$ mkdir log/drb_gateway
$ chmod o+w log/drb_gateway/

- WEBアクセスのためのシンボリックリンク
今回は、www.user.sakura.ne.jp/redmine/でアクセスできるようにするためwww以下にシンボリックリンクを置いておきます。
$ cd $HOME/www
$ ln -s $HOME/rails/redmine/public/ redmine
これで、ブラウザでアクセスすれば、redmineのトップページが表示されるはず、、、ですが、残念ながら ブラウザには
Application error
Rails application failed to start properly"
と出るのみ。

やはり、新しいredmineはさくらサーバでは使えないという都市伝説は真実だったということでしょうか。
rubyやらrailsに詳しくない私はここで諦めます。残念。

ちなみに、偉大な先人達がすでに成し遂げていることではありますが、 redmine-0.8.7では上記とほぼ同様の手順で動作させることができました。
(インストールするコマンド、ライブラリのバージョンは適宜変更する必要がありますが)。


- 再挑戦 script/listenerの修正
で、後日やはり何が起きているか気になってlog/fastcgi.crash.logというファイルを除いてみると、、、
  Dispatcher failed to catch: undefined method `each' for # (NoMethodError)
  /home/user/rails/redmine-1.3.2/vendor/rails/railties/lib/fcgi_handler.rb:77:in `process_each_request'
  /home/user/rails/redmine-1.3.2/vendor/rails/railties/lib/fcgi_handler.rb:76:in `catch'
  /home/user/rails/redmine-1.3.2/vendor/rails/railties/lib/fcgi_handler.rb:76:in `process_each_request'
  /home/user/rails/redmine-1.3.2/vendor/rails/railties/lib/fcgi_handler.rb:51:in `process!'
  /home/user/rails/redmine-1.3.2/script/listener:45:in `initialize'
  /home/user/rails/redmine-1.3.2/script/listener:90:in `new'
  /home/user/rails/redmine-1.3.2/script/listener:90
  /home/user/rails/redmine-1.3.2/vendor/rails/activesupport/lib/active_support/dependencies.rb:173:in `load_without_new_constant_marking'
  /home/user/rails/redmine-1.3.2/vendor/rails/activesupport/lib/active_support/dependencies.rb:173:in `load'
  gateway.cgi:57
  gateway.cgi:54:in `fork'
  gateway.cgi:54
  gateway.cgi:53:in `times'
  gateway.cgi:53
  gateway.cgi:37:in `fork'
  gateway.cgi:37
fcgi_handler.rbから呼ばれるはずのListenerというクラスのeachというメソッドが無いといっているか?
では、Listenerクラスはどこで定義されているのかと探してみると、、、
お、さきほどコピーしてきたscript/listenerに定義があるようです。
たしかに、eachというメソッドは無い。each_cgiというメソッドはあるようなんですが。
いかんせん、rubyは全くの素人なので文法レベルからわかりません。
呼び元のソースやらを見ながらネットでしばしrubyのお勉強。
そうこうしているうちに、適当にeachメソッドを追加したらどうなるだろう?という恐ろしい誘惑に誘われてしまったので、試してみました。

ちょっと結果が変わりました。
  Dispatcher failed to catch: undefined method `env' for # (NoMethodError)
  /home/user/local/lib/ruby/gem/gems/rack-1.1.3/lib/rack/handler/fastcgi.rb:32:in `serve'
  /home/user/rails/redmine-1.3.2/vendor/rails/railties/lib/fcgi_handler.rb:103:in `process_request'
今度は、RemoteCGIのenvが無いと言っている。RemoteCGIも先と同じscript/listenerのファイルに定義されています。
呼び元のソースを眺めてみるとenv_tableを欲しがっているのか?
ということで、また適当にメソッドを追加して試してみる。

と、こんなことを繰り返すうちに、

Listenerクラスに
- each

RemoteCGIクラスに
- env
- in
- err
- finish
- out (元々あったメソッドの引数を修正)

のメソッド追加したところ、見事にブラウザにRedmineのトップページが表示されました。
とりあえず、adminアカウントのパスワードの変更くらいはできたので、とりあえず動いている、と思ってよいのかな。

最終的なscript/listenerの元のファイルとの差分はこんな感じです。
*** listener    2012-03-17 00:53:25.000000000 +0900
--- listener.new        2012-03-17 00:53:33.000000000 +0900
***************
*** 1,7 ****
! #!/usr/bin/env ruby

  require 'stringio'
  require 'fileutils'
  require 'fcgi_handler'

  def message(s)
--- 1,9 ----
! #!/usr/local/bin/ruby

  require 'stringio'
  require 'fileutils'
+ require 'rubygems'
+ gem 'fcgi'
  require 'fcgi_handler'

  def message(s)
***************
*** 14,24 ****
      self.env_table = env_table
      self.stdinput = input || StringIO.new
      self.stdoutput = output || StringIO.new
      super()
    end

!   def out(stream) # Ignore the requested output stream
!     super(stdoutput)
    end
  end

--- 16,44 ----
      self.env_table = env_table
      self.stdinput = input || StringIO.new
      self.stdoutput = output || StringIO.new
+     $stdin = self.stdinput
+     $stdout = self.stdoutput
      super()
    end

!   def env()
!     return self.env_table
!   end
!
!   def in()
!     return self.stdinput
!   end
!
!   def err()
!     return $stderr
!   end
!
!   def finish()
!
!   end
!
!   def out()
!     return self.stdoutput
    end
  end

***************
*** 51,56 ****
--- 71,86 ----
      end
    end

+   def each(&cgi_block)
+     @cgi_block = cgi_block
+     message 'entering idle loop'
+     loop do
+       sleep @timeout rescue nil
+       die! unless @active
+       @active = false
+     end
+   end
+
    def process(env, input)
      message 'received request'
      @mutex.synchronize do

くどいようですが、ruby歴1時間程度の超ど素人が書いたコードなのでこれでよいのかどうかなんてさっぱりわかりませんし、自分で書いたところすら理解できていません。
こんなこと業務でやったら即処刑です(笑)

redmine-0.8.7 + gateway.cgiの環境の場合、初回のアクセスでエラーになることが度々ありますが、1.3.2では初回アクセスでエラーになることもなく、安定度は高いように思います。

ちゃんと使えるか不安ではありますが、この環境を使ってみたいと思います。

関連記事
スポンサーサイト

テーマ : ツール・ソフトウェア
ジャンル : コンピュータ

トラックバック


この記事にトラックバックする(FC2ブログユーザー)

まとめteみた【ITで何かできないかを考えてみる】

ネットを探してみるとさくらサーバにRedmineを入れる方法に関する記事や、動作を高速化させるgateway.cgiの記事が多く見つかりますが、使用している バージョンが0.8.xと古い記事しか見つ

コメントの投稿

非公開コメント

サイト内検索
プロフィール

Author:imxs

Androidアプリ開発などを行っているimxsの開発者です。気になることを調べてメモって行きます。ほとんどの人にはどうでもいい内容でも、広い世の中一人くらいは同じ疑問を持った奇妙な人がいることを信じつつ。暖かい目で見守ってやってください。
imxsの開発者ブログは移転しました。よろしければこちらへどうぞ。

カテゴリ
最新記事
リンク
RSSリンクの表示
最新コメント
最新トラックバック
FC2カウンター
アクセスランキング
[ジャンルランキング]
携帯電話・PHS
105位
アクセスランキングを見る>>

[サブジャンルランキング]
Android(Google)
28位
アクセスランキングを見る>>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。