7.3. Ruby on Rails
7.3.1. 概要
Ruby on Rails は Ruby で記述された一般的な Web フレームワークです。本書では、OpenShift Online での Rails 4 の使用について説明します。
チュートリアル全体をチェックして、OpenShift Online でアプリケーションを実行するために必要なすべての手順を概観することを強く推奨します。問題に直面した場合には、チュートリアル全体を振り返り、もう一度問題に対応してください。またチュートリアルは、実行済みの手順を確認し、すべての手順が適切に実行されていることを確認するのに役立ちます。
本書では、以下があることを前提としています。
- Ruby/Rails の基本知識
- Ruby 2.0.0+、Rubygems、Bundler のローカルにインストールされたバージョン
- Git の基本知識
- OpenShift Online でプロビジョニングされたアカウント
7.3.2. ローカルのワークステーション設定
まず、OpenShift Online のインスタンスが実行中であり、利用可能であることを確認してください。さらに、oc
CLI クライアントがインストールされており、コマンドがコマンドシェルからアクセスできることを確認し、メールアドレスおよびパスワードを使用してログインする際にこれを使用できるようにします。
7.3.2.1. データベースの設定
Rails アプリケーションはほぼ常にデータベースと併用されます。ローカル開発の場合は、PostgreSQL データベースを選択してください。PostgreSQL データベースをインストール方法するには、以下を入力します。
$ sudo yum install -y postgresql postgresql-server postgresql-devel
次に、以下のコマンドでデータベースを初期化する必要があります。
$ sudo postgresql-setup initdb
このコマンドで /var/lib/pgsql/data
ディレクトリーが作成され、このディレクトリーにデータが保存されます。
以下を入力してデータベースを起動します。
$ sudo systemctl start postgresql.service
データベースが実行されたら、rails
ユーザーを作成します。
$ sudo -u postgres createuser -s rails
作成をしたユーザーのパスワードは作成されていない点に留意してください。
7.3.3. アプリケーションの作成
Rails アプリケーションをゼロからビルドするには、Rails gem を先にインストールする必要があります。
$ gem install rails Successfully installed rails-4.2.0 1 gem installed
Rails gem のインストール後に、PostgreSQL をデータベースとして 指定して新規アプリケーションを作成します。
$ rails new rails-app --database=postgresql
次に、新規ディレクトリーに移動します。
$ cd rails-app
アプリケーションがすでにある場合には pg
(postgresql) gem が Gemfile
に配置されているはずです。配置されていない場合には、Gemfile
を編集して gem を追加します。
gem 'pg'
すべての依存関係を含む Gemfile.lock
を新たに生成するには、以下を実行します。
$ bundle install
pg
gem で postgresql
データベースを使用することのほかに、config/database.yml
が postgresql
アダプターを使用していることを確認する必要があります。
config/database.yml
ファイルの default
セクションを以下のように更新するようにしてください。
default: &default adapter: postgresql encoding: unicode pool: 5 host: localhost username: rails password:
アプリケーションの開発およびテストデータベースを作成するには、以下の rake
コマンドを使用します。
$ rake db:create
これで PostgreSQL サーバーに development
および test
データベースが作成されます。
7.3.3.1. Welcome ページの作成
Rails 4 では、静的な public/index.html
ページが実稼働環境で提供されなくなったので、新たに root ページを作成する必要があります。
welcome ページをカスタマイズするには、以下の手順を実行する必要があります。
- index アクションで コントローラー を作成します。
-
welcome
コントローラーindex
アクションの ビュー ページを作成します。 - 作成した コントローラー と ビュー と共にアプリケーションの root ページを提供する ルート を作成します。
Rails には、これらの必要な手順をすべて実行するジェネレーターがあります。
$ rails generate controller welcome index
必要なファイルはすべて作成されたので、config/routes.rb
ファイルの 2 行目を以下のように編集することのみが必要になります。
root 'welcome#index'
rails server を実行して、ページが利用できることを確認します。
$ rails server
ブラウザーで http://localhost:3000 に移動してページを表示してください。このページが表示されない場合は、サーバーに出力されるログを確認してデバッグを行ってください。
7.3.3.2. OpenShift Online のアプリケーションの設定
アプリケーションと OpenShift Online で実行されている PostgreSQL データベースサービスとを通信させるには、環境変数を使用するように config/database.yml
の default
セクションを編集する必要があります。 環境変数は、後のデータベースサービスの作成時に定義します。
編集した config/database.yml
の default
セクションに事前定義済みの変数を入力すると、以下のようになります。
<% user = ENV.key?("POSTGRESQL_ADMIN_PASSWORD") ? "root" : ENV["POSTGRESQL_USER"] %> <% password = ENV.key?("POSTGRESQL_ADMIN_PASSWORD") ? ENV["POSTGRESQL_ADMIN_PASSWORD"] : ENV["POSTGRESQL_PASSWORD"] %> <% db_service = ENV.fetch("DATABASE_SERVICE_NAME","").upcase %> default: &default adapter: postgresql encoding: unicode # For details on connection pooling, see rails configuration guide # http://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV["POSTGRESQL_MAX_CONNECTIONS"] || 5 %> username: <%= user %> password: <%= password %> host: <%= ENV["#{db_service}_SERVICE_HOST"] %> port: <%= ENV["#{db_service}_SERVICE_PORT"] %> database: <%= ENV["POSTGRESQL_DATABASE"] %>
最終的なファイルの内容のサンプルについては、「Ruby on Rails アプリケーションの例 config/database.yml」を参照してください。
7.3.3.3. git へのアプリケーションの保存
OpenShift Online には git が必要なので、まだインストールされていない場合はインストールする必要があります。
OpenShift Online でアプリケーションをビルドするには通常、ソースコードを git リポジトリーに保存する必要があるため、git
がない場合にはインストールしてください。
ls -1
コマンドを実行して、Rails アプリケーションのディレクトリーで操作を行っていることを確認します。コマンドの出力は以下のようになります。
$ ls -1 app bin config config.ru db Gemfile Gemfile.lock lib log public Rakefile README.rdoc test tmp vendor
Rails app ディレクトリーでこれらのコマンドを実行して、コードを初期化して、git にコミットします。
$ git init $ git add . $ git commit -m "initial commit"
アプリケーションをコミットしたら、リモートのリポジトリーにプッシュする必要があります。これには、GitHub アカウント が必要です。 このアカウントで 新しいリポジトリーを作成します。
お使いの git
リポジトリーを参照するリモートを設定します。
$ git remote add origin git@github.com:<namespace/repository-name>.git
次に、アプリケーションをリモートの git リポジトリーにプッシュします。
$ git push
7.3.4. アプリケーションの OpenShift Online へのデプロイ
rails-app
プロジェクトの作成後、新規プロジェクトの namespace に自動的に切り替えられます。
OpenShift Online へのアプリケーションのデプロイでは 3 つの手順を実行します。
- OpenShift Online の PostgreSQL イメージからデータべースサービスを作成します。
- OpenShift Online の Ruby 2.0 ビルダーイメージと Ruby on Rails のソースコードでフロントエンドのサービスを作成します。これをデータベースサービスに接続します。
- アプリケーションのルートを作成します。
7.3.4.1. データベースサービスの作成
Rails アプリケーションには、実行中のデータベースサービスが必要です。このサービスには、PostgeSQL データベースイメージを使用します。
データベースサービスを作成するために、oc new-app コマンドを使用します。このコマンドでは、必要な環境変数を渡す必要があります。この環境変数はデータベースコンテナー内で使用します。これらの環境変数は、ユーザー名、パスワード、およびデータベースの名前を設定するために必要です。 これらの環境変数の値を任意の値に変更できます。今回設定する変数は以下の通りです。
- POSTGRESQL_DATABASE
- POSTGRESQL_USER
- POSTGRESQL_PASSWORD
これらの変数を設定すると、以下を確認できます。
- 指定の名前でデータベースが存在する
- 指定の名前でユーザーが存在する
- ユーザーは指定のパスワードで指定のデータベースにアクセスできる
以下は例になります。
$ oc new-app postgresql -e POSTGRESQL_DATABASE=db_name -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password
データベース管理者のパスワードを設定するには、直前のコマンドに以下を追加します。
-e POSTGRESQL_ADMIN_PASSWORD=admin_pw
このコマンドの進捗を確認するには、以下を実行します。
$ oc get pods --watch
7.3.4.2. フロントエンドサービスの作成
アプリケーションを OpenShift Online にデプロイするには、oc new-app
コマンドをもう一度使用して、アプリケーションを配置するリポジトリーを指定する必要があります。このコマンドでは、「 データベースサービスの作成」で設定したデータベース関連の環境変数を指定する必要があります。
$ oc new-app path/to/source/code --name=rails-app -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=db_name -e DATABASE_SERVICE_NAME=postgresql
このコマンドでは、OpenShift Online は指定された環境変数を使用して、ソースコードの取得、ビルダーイメージのセットアップ、アプリケーションイメージのビルド、新規に作成されたイメージのデプロイを実行します。このアプリケーションは rails-app
という名前に指定します。
rails-app
DeploymentConfig の JSON ドキュメントを参照して、環境変数が追加されたかどうかを確認できます。
$ oc get dc rails-app -o json
以下のセクションが表示されるはずです。
env": [ { "name": "POSTGRESQL_USER", "value": "username" }, { "name": "POSTGRESQL_PASSWORD", "value": "password" }, { "name": "POSTGRESQL_DATABASE", "value": "db_name" }, { "name": "DATABASE_SERVICE_NAME", "value": "postgresql" } ],
ビルドプロセスを確認するには、以下を実行します。
$ oc logs -f build rails-app-1
ビルドが完了すると、OpenShift Online で Pod が実行されていることを確認できます。
$ oc get pods
myapp-<number>-<hash>
で始まる行が表示されますが、これは OpenShift Online で実行中のアプリケーションです。
データベースの移行スクリプトを実行してデータベースを初期化してからでないと、アプリケーションは機能しません。これを実行する 2 種類の方法があります。
- 実行中のフロントエンドコンテナーから手動で実行する
最初に rsh コマンドでフロントエンドコンテナーに対して実行します。
$ oc rsh <FRONTEND_POD_ID>
コンテナー内から移行を実行します。
$ RAILS_ENV=production bundle exec rake db:migrate
development
または test
環境で Rails アプリケーションを実行する場合には、RAILS_ENV
の環境変数を指定する必要はありません。
- デプロイメント前のライフサイクルフックをテンプレートに追加する。たとえば、Rails サンプル アプリケーションの フックのサンプル を確認します。
7.3.4.3. アプリケーションのルートの作成
以下を入力してフロントエンドサービスを公開します。
$ oc expose service rails-app