3.5. Ruby on Rails を使用したアプリケーションの作成
Ruby on Rails は Ruby で記述される Web フレームワークです。このガイドでは、OpenShift Container Platform での Rails 4 の使用を扱います。
チュートリアル全体をチェックして、OpenShift Container Platform でアプリケーションを実行するために必要なすべての手順を概観してください。問題に直面した場合には、チュートリアル全体を振り返り、もう一度問題に対応してください。またチュートリアルは、実行済みの手順を確認し、すべての手順が適切に実行されていることを確認するのに役立ちます。
3.5.1. 前提条件
- Ruby および Rails の基本知識
- Ruby 2.0.0+、Rubygems、Bundler のローカルにインストールされたバージョン
- Git の基本知識
- OpenShift Container Platform v4 の実行インスタンス
-
OpenShift Container Platform のインスタンスが実行中であり、利用可能であることを確認してください。さらに、
oc
CLI クライアントがインストールされており、コマンドがコマンドシェルからアクセスできることを確認し、メールアドレスおよびパスワードを使用してログインする際にこれを使用できるようにします。
3.5.2. データベースの設定
Rails アプリケーションはほぼ常にデータベースと併用されます。ローカル開発の場合は、PostgreSQL データベースを使用します。
手順
データベースをインストールします。
sudo yum install -y postgresql postgresql-server postgresql-devel
$ sudo yum install -y postgresql postgresql-server postgresql-devel
Copy to Clipboard Copied! データベースを初期化します。
sudo postgresql-setup initdb
$ sudo postgresql-setup initdb
Copy to Clipboard Copied! このコマンドで
/var/lib/pgsql/data
ディレクトリーが作成され、このディレクトリーにデータが保存されます。データベースを起動します。
sudo systemctl start postgresql.service
$ sudo systemctl start postgresql.service
Copy to Clipboard Copied! データベースが実行されたら、
rails
ユーザーを作成します。sudo -u postgres createuser -s rails
$ sudo -u postgres createuser -s rails
Copy to Clipboard Copied! 作成をしたユーザーのパスワードは作成されていない点に留意してください。
3.5.3. アプリケーションの作成
Rails アプリケーションをゼロからビルドするには、Rails gem を先にインストールする必要があります。その後に、アプリケーションを作成することができます。
手順
Rails gem をインストールします。
gem install rails
$ gem install rails
Copy to Clipboard Copied! 出力例
Successfully installed rails-4.3.0 1 gem installed
Successfully installed rails-4.3.0 1 gem installed
Copy to Clipboard Copied! Rails gem のインストール後に、PostgreSQL をデータベースとして指定して新規アプリケーションを作成します。
rails new rails-app --database=postgresql
$ rails new rails-app --database=postgresql
Copy to Clipboard Copied! 新規アプリケーションディレクトリーに切り替えます。
cd rails-app
$ cd rails-app
Copy to Clipboard Copied! アプリケーションがすでにある場合には
pg
(postgresql) gem がGemfile
に配置されていることを確認します。配置されていない場合には、gem を追加してGemfile
を編集します。gem 'pg'
gem 'pg'
Copy to Clipboard Copied! すべての依存関係を含む
Gemfile.lock
を新たに生成します。bundle install
$ bundle install
Copy to Clipboard Copied! pg
gem でpostgresql
データベースを使用するほか、config/database.yml
がpostgresql
アダプターを使用していることを確認する必要があります。config/database.yml
ファイルのdefault
セクションを以下のように更新するようにしてください。default: &default adapter: postgresql encoding: unicode pool: 5 host: localhost username: rails password: <password>
default: &default adapter: postgresql encoding: unicode pool: 5 host: localhost username: rails password: <password>
Copy to Clipboard Copied! アプリケーションの開発およびテスト用のデータベースを作成します。
rake db:create
$ rake db:create
Copy to Clipboard Copied! これで PostgreSQL サーバーに
development
およびtest
データベースが作成されます。
3.5.3.1. Welcome ページの作成
Rails 4 では静的な public/index.html
ページが実稼働環境で提供されなくなったので、新たに root ページを作成する必要があります。
Welcome ページをカスタマイズするには、以下の手順を実行する必要があります。
- index アクションでコントローラーを作成します。
- welcome コントローラーの index アクションの view ページを作成します。
- 作成したコントローラーとビューと共にアプリケーションの root ページを提供するルートを作成します。
Rails には、これらの必要な手順をすべて実行するジェネレーターがあります。
手順
Rails ジェネレーターを実行します。
rails generate controller welcome index
$ rails generate controller welcome index
Copy to Clipboard Copied! すべての必要なファイルが作成されます。
以下のように
config/routes.rb
ファイルの 2 行目を編集します。root 'welcome#index'
root 'welcome#index'
Copy to Clipboard Copied! rails server を実行して、ページが利用できることを確認します。
rails server
$ rails server
Copy to Clipboard Copied! ブラウザーで http://localhost:3000 に移動してページを表示してください。このページが表示されない場合は、サーバーに出力されるログを確認してデバッグを行ってください。
3.5.3.2. OpenShift Container Platform のアプリケーションの設定
アプリケーションが OpenShift Container Platform で実行中の PostgreSQL データベースサービスと通信できるようにするには、後のデータベースサービスの作成時に定義する必要のある環境変数を使用できるように config/database.yml
の default
セクションを編集する必要があります。
手順
以下のように事前に定義した変数で、
config/database.yml
のdefault
セクションを編集します。config/database
YAML ファイルのサンプル<% 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"] %>
<% 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"] %>
Copy to Clipboard Copied!
3.5.3.3. アプリケーションの Git への保存
通常 OpenShift Container Platform でアプリケーションをビルドする場合、ソースコードを git リポジトリーに保存する必要があるため、git
がない場合にはインストールしてください。
前提条件
- git をインストールします。
手順
ls -1
コマンドを実行して、Rails アプリケーションのディレクトリーで操作を行っていることを確認します。コマンドの出力は以下のようになります。ls -1
$ ls -1
Copy to Clipboard Copied! 出力例
app bin config config.ru db Gemfile Gemfile.lock lib log public Rakefile README.rdoc test tmp vendor
app bin config config.ru db Gemfile Gemfile.lock lib log public Rakefile README.rdoc test tmp vendor
Copy to Clipboard Copied! Rails app ディレクトリーで以下のコマンドを実行して、コードを初期化し、git にコミットします。
git init
$ git init
Copy to Clipboard Copied! git add .
$ git add .
Copy to Clipboard Copied! git commit -m "initial commit"
$ git commit -m "initial commit"
Copy to Clipboard Copied! アプリケーションがコミットされたら、これをリモートリポジトリーにプッシュする必要があります。新規リポジトリーを作成する GitHub アカウントです。
お使いの
git
リポジトリーを参照するリモートを設定します。git remote add origin git@github.com:<namespace/repository-name>.git
$ git remote add origin git@github.com:<namespace/repository-name>.git
Copy to Clipboard Copied! アプリケーションをリモートの git リポジトリーにプッシュします。
git push
$ git push
Copy to Clipboard Copied!
3.5.4. アプリケーションの OpenShift Container Platform へのデプロイ
OpenShift Container Platform にアプリケーションをデプロイすることができます。
rails-app
プロジェクトの作成後、新規プロジェクトの namespace に自動的に切り替えられます。
OpenShift Container Platform へのアプリケーションのデプロイでは 3 つの手順を実行します。
- OpenShift Container Platform の PostgreSQL イメージからデータベースサービスを作成します。
- データベースサービスと連動する OpenShift Container Platform の Ruby 2.0 ビルダーイメージおよび Ruby on Rails ソースコードのフロントエンドサービスを作成します。
- アプリケーションのルートを作成します。
手順
Ruby on Rails アプリケーションをデプロイするには、アプリケーション用に新規のプロジェクトを作成します。
oc new-project rails-app --description="My Rails application" --display-name="Rails Application"
$ oc new-project rails-app --description="My Rails application" --display-name="Rails Application"
Copy to Clipboard Copied!
3.5.4.1. データベースサービスの作成
Rails アプリケーションには実行中のデータベースサービスが必要です。このサービスには、PostgreSQL データベースイメージを使用します。
データベースサービスを作成するために、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
$ oc new-app postgresql -e POSTGRESQL_DATABASE=db_name -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password
Copy to Clipboard Copied! データベース管理者のパスワードを設定するには、直前のコマンドに以下を追加します。
-e POSTGRESQL_ADMIN_PASSWORD=admin_pw
-e POSTGRESQL_ADMIN_PASSWORD=admin_pw
Copy to Clipboard Copied! 進行状況を確認します。
oc get pods --watch
$ oc get pods --watch
Copy to Clipboard Copied!
3.5.4.2. フロントエンドサービスの作成
アプリケーションを OpenShift Container Platform にデプロイするには、アプリケーションが置かれるリポジトリーを指定する必要があります。
手順
フロントエンドサービスを作成し、データベースサービスの作成時に設定されたデータベース関連の環境変数を指定します。
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
$ 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
Copy to Clipboard Copied! このコマンドでは、OpenShift Container Platform は指定された環境変数を使用してソースコードの取得、ビルダーのセットアップ、アプリケーションイメージのビルド、新規に作成されたイメージのデプロイを実行します。このアプリケーションには
rails-app
という名前を指定します。rails-app
デプロイメント設定の JSON ドキュメントを参照して、環境変数が追加されたかどうかを確認できます。oc get dc rails-app -o json
$ oc get dc rails-app -o json
Copy to Clipboard Copied! 以下のセクションが表示されるはずです。
出力例
env": [ { "name": "POSTGRESQL_USER", "value": "username" }, { "name": "POSTGRESQL_PASSWORD", "value": "password" }, { "name": "POSTGRESQL_DATABASE", "value": "db_name" }, { "name": "DATABASE_SERVICE_NAME", "value": "postgresql" } ],
env": [ { "name": "POSTGRESQL_USER", "value": "username" }, { "name": "POSTGRESQL_PASSWORD", "value": "password" }, { "name": "POSTGRESQL_DATABASE", "value": "db_name" }, { "name": "DATABASE_SERVICE_NAME", "value": "postgresql" } ],
Copy to Clipboard Copied! ビルドプロセスを確認します。
oc logs -f build/rails-app-1
$ oc logs -f build/rails-app-1
Copy to Clipboard Copied! ビルドが完了すると、OpenShift Container Platform で Pod が実行されていることを確認します。
oc get pods
$ oc get pods
Copy to Clipboard Copied! myapp-<number>-<hash>
で始まる行が表示されますが、これは OpenShift Container Platform で実行中のアプリケーションです。データベースの移行スクリプトを実行してデータベースを初期化してからでないと、アプリケーションは機能しません。これを実行する 2 種類の方法があります。
実行中のフロントエンドコンテナーから手動で実行する
rsh
コマンドでフロントエンドコンテナーに exec を実行します。oc rsh <frontend_pod_id>
$ oc rsh <frontend_pod_id>
Copy to Clipboard Copied! コンテナー内から移行を実行します。
RAILS_ENV=production bundle exec rake db:migrate
$ RAILS_ENV=production bundle exec rake db:migrate
Copy to Clipboard Copied! development
またはtest
環境で Rails アプリケーションを実行する場合には、RAILS_ENV
の環境変数を指定する必要はありません。
- デプロイメント前のライフサイクルフックをテンプレートに追する
3.5.4.3. アプリケーションのルートの作成
アプリケーションのルートを作成するためにサービスを公開できます。
手順
www.example.com
などの外部からアクセスできるホスト名を指定してサービスを公開するには、OpenShift Container Platform のルートを使用します。この場合は、以下を入力してフロントエンドサービスを公開する必要があります。oc expose service rails-app --hostname=www.example.com
$ oc expose service rails-app --hostname=www.example.com
Copy to Clipboard Copied!
指定するホスト名がルーターの IP アドレスに解決することを確認します。