何年ぶりかの「10分でできるwebサイト」

Ruby on Railsをインストールして、f2pを動かしてみた。フレームワークを準備するのに数時間かかって、その先のdeployは一瞬というところがRoRの醍醐味(汗

long runテストと負荷分散に役立つといい。

bloggerのサイトだとコードが読みにくいので、こちらに日本語で手順をポスト

まず、今回セットアップしたのは、Nahiによる、ffp(f2p)というアプリケーションで、FriendFeedを携帯端末で利用しやすくしよう、というもの。

ソースはgithubにある。http://github.com/nahi/f2p/tree/master

自分の環境であるCentOS5.2(Xen3上のDom-U)では、デフォルトではrubygemsも何もないので、そこから手順を記載しますが、すでにRoRとgitがセットアップされているなら、そこはすっとばしてください。

CentOS5.2でのRuby on RailsのSetupの例

まず、rubygemが依存しているrdocをインストール

# yum install rdoc
Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 ruby-rdoc               i386       1.8.5-5.el5_2.6  updates           136 k
Updating:
 ruby                    i386       1.8.5-5.el5_2.6  updates           280 k
 ruby-libs               i386       1.8.5-5.el5_2.6  updates           1.6 M
Installing for dependencies:
 ruby-irb                i386       1.8.5-5.el5_2.6  updates            69 k
Updating for dependencies:
 ruby-devel              i386       1.8.5-5.el5_2.6  updates           555 k

あらためてrubygem(1.3.1)のインストール

# wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz
# tar zxf rubygems-1.3.1.tgz
# cd rubygems-1.3.1
# ruby setup.rb

そこでやっとRuby on Railsのインストール開始

# gem install rails
Successfully installed rake-0.8.3
Successfully installed activesupport-2.2.2
Successfully installed activerecord-2.2.2
Successfully installed actionpack-2.2.2
Successfully installed actionmailer-2.2.2
Successfully installed activeresource-2.2.2
Successfully installed rails-2.2.2
7 gems installed
Installing ri documentation for rake-0.8.3...
Installing ri documentation for activesupport-2.2.2...
Installing ri documentation for activerecord-2.2.2...
Installing ri documentation for actionpack-2.2.2...
Installing ri documentation for actionmailer-2.2.2...
Installing ri documentation for activeresource-2.2.2...
Installing RDoc documentation for rake-0.8.3...
Installing RDoc documentation for activesupport-2.2.2...
Installing RDoc documentation for activerecord-2.2.2...
Installing RDoc documentation for actionpack-2.2.2...
Installing RDoc documentation for actionmailer-2.2.2...
Installing RDoc documentation for activeresource-2.2.2...

ここでちょっとrailsで「10分でアプリを立ち上げ」体験してみる。単に体験するだけではなくて、設定が十分にできているかは、serviceを起動してみないとわからない部分もあるのだ。ここが味噌(汗

$ mkdir rails
$ rails /home/username/rails
      exists
      create  app/controllers
      create  app/helpers
(中略)
      create  log/development.log
      create  log/test.log

デフォルトではRoRのサービスは3000番のポートを使う。良い子のサーバはiptablesなどで余計なポートは塞いであるはずだから、あらためてポートを開けないと、ブラウザからアクセスできないのが普通(sshで接続してport forwardingする、という手もあるけれど、そうなるとホスト名の解決のところでハマることもあるので注意)

# iptables -A INPUT -p tcp --dport 3000 -j ACCEPT

http://webserver.yourdomain:3000/ っていうのはちょっと不恰好かなー、と思うのなら、apache(httpd)でreverse proxyを設定する手もある(これが原因で、パスのタイプによってはうまく処理されないこともあるけど)

    ProxyPass /ffp/     http://webserver.yourdomain:3000/
    ProxyPassReverse /ffp/      http://webserver.yourdomain:3000/

それでは、サーバを立ち上げよう。

$ cd rails
$ script/server
=> Booting WEBrick...
=> Rails 2.2.2 application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2009-02-16 09:30:40] INFO  WEBrick 1.3.1
[2009-02-16 09:30:40] INFO  ruby 1.8.5 (2006-08-25) [i386-linux]
[2009-02-16 09:30:40] INFO  WEBrick::HTTPServer#start: pid=16622 port=3000
192.168.0.51 - - [16/Feb/2009:09:30:48 JST] "GET / HTTP/1.0" 200 7385- -> /
192.168.0.51 - - [16/Feb/2009:09:33:45 JST] "GET / HTTP/1.1" 200 7385- -> /
192.168.0.51 - - [16/Feb/2009:09:33:45 JST] "GET /javascripts/prototype.js HTTP/1.1" 200 129738 http://yourpublicserver/ffp/ -> /javascripts/prototype.js
192.168.0.51 - - [16/Feb/2009:09:33:46 JST] "GET /javascripts/effects.js HTTP/1.1" 200 38675 http://yourpublicserver/ffp/ -> /javascripts/effects.js
192.168.0.51 - - [16/Feb/2009:09:33:46 JST] "GET /images/rails.png HTTP/1.1" 200 6646 http://yourpublicserver/ffp/ -> /images/rails.png
192.168.0.51 - - [16/Feb/2009:09:34:02 JST] "GET /rails/info/properties HTTP/1.1" 500 13415 http://yourpublicserver/ffp/ -> /rails/info/properties

上のログでもわかるとおり、propertiesを表示しようとしたら500(internal serer error)になった。画面の表示は以下のとおりで、

MissingSourceFile

no such file to load -- sqlite3

というわけで、sqliteをインストールする必要があることがわかる。
ちなみに、Rails + sqlite3 の落とし穴 - まちゅダイアリー(2007-01-17)によれば、sqlite3はSWIGに依存しているので、そちらを先にインストールする必要がある。この辺はrpmになっててくれ、と思うところだ<ならば自分でせよ。
SWIGのインストールは、それが必要だとわかってしまえば簡単だ
まず、ダウンロードしてくる。http://www.swig.org/download.html
そして、展開してmakeだ

# tar zxf swig-1.3.38.tar.gz
# cd swig-1.3.38
# ./configure && make && make install

sqliteのインストールはさらに簡単だ。さすがにgemである。でも、gemでインストールできない依存関係もちゃんと示しておいてくれるとさらに良かったかも(SWIGはnice to haveなのだろうか?)

# gem install sqlite3-ruby
Building native extensions.  This could take a while...
Successfully installed sqlite3-ruby-1.2.4
1 gem installed
Installing ri documentation for sqlite3-ruby-1.2.4...
Installing RDoc documentation for sqlite3-ruby-1.2.4...

これでrailsのアプリケーションの表示も正常になる。たとえばこんな風に環境が表示される。Ruby savvyな方はノけぞるかもしれないが、CentOS5.2(RHEL5相当)ってば、ちゃんとyum update rubyしてもこんなもん(1.8.5)である。

Now your Environment seems OK
About your application’s environment

Ruby version	1.8.5 (i386-linux)
RubyGems version	1.3.1
Rails version	2.2.2
Active Record version	2.2.2
Action Pack version	2.2.2
Active Resource version	2.2.2
Action Mailer version	2.2.2
Active Support version	2.2.2
Application root	/home/yourname/ffp
Environment	development
Database adapter	sqlite3
Database schema version	0
やっと本題のf2p(ffp)のセットアップである

まず、githubからコードをとってくる。gitはインストールされていますか?そうでないなら→A-Liaison BLOG: githubに自分のリポジトリを作ってコミットしてみるなどがお役に立つかも。

$ cd working_directory
$ git clone git://github.com/nahi/f2p.git

2009.2.17現在のコードだと、暗号化の鍵や、googlemapのAPIにアクセスする鍵などを修正してから運用することなるけれども、まずは起動。実はまだセットアップは完了していないのだ。

$ script/server
=> Booting WEBrick...
Missing these required gems:
  httpclient
  json
You're running:
  ruby 1.8.5 at /usr/bin/ruby
  rubygems 1.3.1 at /home/yourname/.gem/ruby/1.8, /usr/lib/ruby/gems/1.8

Run `rake gems:install` to install the missing gems.

というわけで、RoRとは別にこのアプリ専用にhttpclientとjsonをインストールする必要があるとわかる。
この場合、メッセージの通り単純に rake gems:install とタイプしてもダメである。

$ rake gems:install
(in /home/username/f2p)
** Invoke gems:install (first_time)
** Invoke gems:base (first_time)
** Execute gems:base
** Invoke environment (first_time)
** Execute environment
rake aborted!
no such file to load -- httpclient

まずはhttpclientのコードを取ってくる必要がある。404 Not Found
にある。

# wget http://dev.ctor.org/download/httpclient-2.1.4.tar.gz
# tar zxf httpclient-2.1.4.tar.gz
# cd httpclient-2.1.4
# ruby install.rb

jsonについても同様だが、こちらはgemでとってこれる。

# gem install json

この状態で、やっとサービスは立ち上がる。(まだ鍵の設定はしていないので、本番運用はダメ)

$ script/server
=> Booting WEBrick...
=> Rails 2.2.2 application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2009-02-16 10:53:05] INFO  WEBrick 1.3.1
[2009-02-16 10:53:05] INFO  ruby 1.8.5 (2006-08-25) [i386-linux]
[2009-02-16 10:53:05] INFO  WEBrick::HTTPServer#start: pid=25199 port=3000
192.168.0.51 - - [16/Feb/2009:10:53:15 JST] "GET / HTTP/1.1" 302 110 - -> /
192.168.0.51 - - [16/Feb/2009:10:53:16 JST] "GET /login HTTP/1.1" 200 863 - -> /login
192.168.0.51 - - [16/Feb/2009:10:54:02 JST] "POST /login/authenticate HTTP/1.1" 500 13753 http://b137053.ppp.asahi-net.or.jp/f2p/login -> /login/authenticate

上記のようにログイン失敗する。やるべきことは、

  1. データベースのmigrate 参照:本番環境でテーブルがないと怒られた - DUNNO-CLEARブログ2.0
  2. 鍵の生成、登録

まず、データベースのmigrateは次のようにして行う。

$ rake RAILS_ENV=production db:migrate

もし、productionの状態でアプリケーションを公開していない状態ならば、developmentのdbを更新。でも、productionの状態にしておくことをお薦め(repositoryのコードや、各種ドキュメントはそれを前提にしているだろうから)。。。でも私、まだproductionの状態にする方法を知りません、、だって、使い始めて10分ですから(ぉ

$ rake RAILS_ENV=development db:migrate

次に、鍵の生成と登録は、ランダムな16バイトということで

# ruby -ropenssl -e 'p OpenSSL::Random.random_bytes(16).unpack("H*")[0]'
# vi app/controllers/application.rb
protect_from_forgeryのsecretの値を上記の文字列に書き換え

他に、googleMapの画像をちゃんと表示したい場合は、GoogleMap APIの鍵を取得する必要がある→Google Maps API に登録する - Google Maps API — Google Developers
取得した鍵は、config/environment.rb のF2P::Config.google_maps_api_keyに設定。