OpenShiftでRuby, Sinatraを動かしてみた（Herokuの代わりに）


Herokuの料金体系が変わったことによって、Rubyが動く無料なPaaSを探さねばと思い、いろいろ調べていたらRedHatさんがやっているOpenShiftに行き着きました。

- [OpenShift](https://www.openshift.com/)

## OpenShiftの料金体系

Freeプランは、3つのGear（アプリケーション）までSmallインスタンスタイプで稼働できるようです。Smallのスペックは、CPU 1x / Mem 512MB / Storage 1GB / Region USのみと、シンプルなアプリなら必要十分。もし、トラフィックが増えてきたとしてもスケール可能なので、いざというときも安心。

- [OpenShift Pricing](https://www.openshift.com/products/pricing)

## OpenShiftでRuby / Sinatraを動かす

OpenShiftでは、Ruby1.8 / 1.9 / 2.0が選べます。今回はRuby2.0でいきます。ユーザ登録が必要なので、OpenShiftでサインアップを済ませておきます。

### アプリケーションの登録

HerokuのToolbeltと同様に、OpenShiftにも`rhc`というコマンドが用意されています。gemでサクッとインストールします。この`rhc`コマンドで、アプリケーションの登録を行います（ブラウザのコンソールでもできるけど面倒なので）。

```
$ gem i rhc
```

### rhcのセットアップ

まずrhcにユーザ情報を登録してあげます。登録してあるメールアドレスとパスワードでログインしてあげればOKです。最後に、アプリケーションの動作環境のリストが表示されます。

```
$ rhc setup
(略)

Login to openshift.redhat.com: 登録メールアドレス
Password: パスワード

(略)

Generate a token now? (yes|no) yes

(略)

Run 'rhc create-app' to create your first application.

  Do-It-Yourself 0.1                      rhc create-app <app name> diy-0.1
  JBoss Application Server 7              rhc create-app <app name> jbossas-7
  JBoss Data Virtualization 6             rhc create-app <app name> jboss-dv-6.1.0
  JBoss Enterprise Application Platform 6 rhc create-app <app name> jbosseap-6
  JBoss Unified Push Server 1.0.0.Beta1   rhc create-app <app name> jboss-unified-push-1
  JBoss Unified Push Server 1.0.0.Beta2   rhc create-app <app name> jboss-unified-push-2
  Jenkins Server                          rhc create-app <app name> jenkins-1
  Node.js 0.10                            rhc create-app <app name> nodejs-0.10
  PHP 5.3                                 rhc create-app <app name> php-5.3
  PHP 5.4                                 rhc create-app <app name> php-5.4
  PHP 5.4 with Zend Server 6.1            rhc create-app <app name> zend-6.1
  Perl 5.10                               rhc create-app <app name> perl-5.10
  Python 2.6                              rhc create-app <app name> python-2.6
  Python 2.7                              rhc create-app <app name> python-2.7
  Python 3.3                              rhc create-app <app name> python-3.3
  Ruby 1.8                                rhc create-app <app name> ruby-1.8
  Ruby 1.9                                rhc create-app <app name> ruby-1.9
  Ruby 2.0                                rhc create-app <app name> ruby-2.0
  Tomcat 6 (JBoss EWS 1.0)                rhc create-app <app name> jbossews-1.0
  Tomcat 7 (JBoss EWS 2.0)                rhc create-app <app name> jbossews-2.0
  Vert.x 2.1                              rhc create-app <app name> jboss-vertx-2.1
  WildFly Application Server 8.2.0.Final  rhc create-app <app name> jboss-wildfly-8
  WildFly Application Server 9            rhc create-app <app name> jboss-wildfly-9

  You are using 0 of 3 total gears
  The following gear sizes are available to you: small

Your client tools are now configured.
```

### アプリケーションの新規作成

`rhc create-app`コマンドでアプリケーションの新規作成を行います。その際に、アプリケーション名と、プラットフォームを指定します。少し時間がかかりますが、完了するとURL / SSH / Gitリポジトリが表示されます。

ちなみに、なんでも良いからとりあえずSinatraデプロイしたい！っていう人は、OpenShiftがQuickStartのページを用意しているので、ここからデプロイボタンをぽちっと押せばそれで終了です。ただし、Rubyは1.9を指定しないと動きません。

- [Sinatra QuickStart](https://hub.openshift.com/quickstarts/118-sinatra)

```
$ rhc create-app hoge ruby-2.0

(略)

Your application 'hoge' is now available.

  URL:        http://hoge-example.rhcloud.com/
  SSH to:     1234123412341234@hoge-example.rhcloud.com
  Git remote: ssh://1234123412341234@hoge-example.rhcloud.com/~/git/hoge.git/
  Cloned to:  /Users/zaru/hoge

Run 'rhc show-app hoge' for more details about your app.
```

あとは、作成されたGitリポジトリに`git push`すればサーバに反映されます。

### Sinatraを入れる

Bundlerで入れるんですが、rackのバージョンを1.5.2に固定しないと動きませんでした。OpenShiftのサーバにSSHで入ってrackのバージョンを上げる方法もありますが、わざわざやるのが面倒なので、特にコダワリがなければ1.5.2で良いと思います。

```Gemfile
# A sample Gemfile
source "https://rubygems.org"

ruby '2.0.0'

gem 'rack', '1.5.2'
gem "sinatra", require: "sinatra/base"
gem "sinatra-contrib", require: "sinatra/reloader"
gem "sinatra-assetpack"

gem "slim"
```

```config.ru
require 'rubygems'
require 'bundler'
Bundler.require

require './app.rb'
run WebApp
```

```app.rb
require 'sinatra/base'

class WebApp < Sinatra::Base
  get '/' do
    "hoge"
  end
end
```

```
$ git add .
$ git commit -m 'first commit'
$ git push origin master
```

これで、OpenShiftには反映されてブラウザで動作確認ができると思います。

`rhc`コマンドオプションはこちら。デバッグで`rhc tail アプリ名`をよく使うと思います。

- [Common RHC (Command Line Tool) Commands](https://developers.openshift.com/en/managing-common-rhc-commands.html)

## まとめ

Herokuに比べるとあまり情報がない点や、連携ツールが少ないところなどが劣りますが、3つまで無料で使えるのは魅力的ですね。Herokuも$7程度なので、そんな高いわけじゃないですが…。

AzureAppServices（旧Websites）も、無料で使える枠があるんですが、Rubyがデフォルトだと使えない（Windowsで使えるRubyバイナリを梱包しなくちゃいけないっぽい）ので選択肢から外しました。PHPやPythonならデフォで動くのでAzureでもいいかもしれないです。