PaaSにSkinny Frameworkアプリケーションをデプロイする(OpenShift編) on OSX Client



### 注意書き

作業後に書き直しため、間違いがあるかもしれません。
後で確認して、修正します。

## はじめに
複数のPaaSでSkinny Frameworkをデプロイする方法を試したので、まずは、OpenShiftの方法を記載します。
（CloudBeesでは、DBサービスがMySQLのみなので再検討中）

スタンドアローンでの実行なども出来ると思いますが、
今回は、warファイルをTomcatにデプロイする方法を取りました。

また、同一インスタンス上のPostgreSQLを利用しています。


## OpenShiftについて
RedHat提供のPaaSサービスを使って、3インスタンスまで、無料で使えます。

特徴としては、OpenStack準拠で、標準のカートリッジを使えば自動でセキュリティーパッチのメンテナンスを行ってくれることでしょうか。

現時点(2014/5/10)において、日本在住の設定では有料登録ができないようです。

## OpenShift登録手順

[OpenShift](https://www.openshift.com/)のサイトを開いたあと、

* サインアップ
* メールアドレスの確認
* 規約同意

の順におこないます。


**サイトトップ画面**
![スクリーンショット 2014-05-10 21.33.11.png](https://qiita-image-store.s3.amazonaws.com/0/31371/ab63a756-84a0-3ec4-a8aa-5427e7f3ab81.png "スクリーンショット 2014-05-10 21.33.11.png")


**サインアップ画面**
![スクリーンショット 2014-05-10 21.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/31371/8921de30-f46f-b655-56c1-ffd06877fb83.png "スクリーンショット 2014-05-10 21.34.47.png")

**メールアドレス確認メール送信完了画面**
![スクリーンショット 2014-05-10 21.38.26.png](https://qiita-image-store.s3.amazonaws.com/0/31371/5a75f668-754b-5842-a786-d4b26a79c213.png "スクリーンショット 2014-05-10 21.38.26.png")

**メールアドレス確認メール**
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/31371/82f9c0f0-2298-7249-589a-376237cb2e16.png "名称未設定.png")


**規約同意画面**
![スクリーンショット 2014-05-10 21.39.03.png](https://qiita-image-store.s3.amazonaws.com/0/31371/9bca5144-5f4e-2d66-e7b6-9172a6b94e23.png "スクリーンショット 2014-05-10 21.39.03.png")


### Tips

* アカウントもパスワードもRedHat全体のアカウントと共通になります。
* サインイン後にエラー画面に入る場合は、ブラウザーのクッキーを削除します。削除対象は、「redhat.com」を含むものになります。

## RHCコマンドラインツールの導入手順
以下を参考に説明します。

* コマンドラインツールの[インストール方法](https://www.openshift.com/developers/rhc-client-tools-install)


OpenShiftのコマンドラインツールは、RubyのGEMとして用意されているのでRubyが必要です。

OSXの場合は、

```bash:
$ sudo gem install rhc --no-rdoc --no-ri
```
でインストールできます。

次に、アカウントを紐付けます。セットアップ作業中に、自動でsshの公開鍵のアップロードなども行われます。

```bash:
# アカウント設定します。
$ rhc setup

OpenShift Client Tools (RHC) Setup Wizard

This wizard will help you upload your SSH keys, set your application namespace,
and check that other programs like Git are properly installed.

Login to openshift.redhat.com: <登録メールアドレス>
Password: ************

OpenShift can create and store a token on disk which allows to you to access the
server without using your password. The key is stored in your home directory and
should be kept secret.  You can delete the key at any time by running 'rhc
logout'.
Generate a token now? (yes|no) yes
Generating an authorization token for this client ... lasts about 1 month

Saving configuration to /Users/foobar/.openshift/express.conf ... done

Checking for git ... found git version 1.8.5.2 (Apple Git-48)

Checking common problems .. done

Your client tools are now configured.
```


### 足りない時

* ドメインの設定
* sshの公開鍵

sshの設定ができなかった場合は、[Webコンソールの設定画面](https://openshift.redhat.com/app/console/settings)から公開鍵を追加します。


```bash:
$ pbcopy < ~/.ssh/id_rsa.pub
```
で、クリップボードにコピーして追加しましょう。


## コマンドラインからOpenShiftアプリを作成
GUIから設定する方法は、公式ドキュメントの[はじめよう](https://www.openshift.com/get-started) から確認して下さい。

OpenShiftアプリのおおまかな作成手順は、
1. フレームワークを選択
2. DBなどのカートリッジを追加
3. コードをGitでアップロード
になります。

コマンドラインからおこなうと、1,2,3がセットで行えます。

```bash:
# tomcat7 + postgres9.2 のカートリッジを利用
# rhc app-create <アプリ名> <カートリッジ> [<追加カートリッジ>]
$ rhc app-create skinnyapp jbossews-2.0 postgresql-9.2

Application Options
-------------------
Domain:     foobar
Cartridges: jbossews-2.0, postgresql-9.2
Gear Size:  default
Scaling:    no

Creating application 'skinnyapp' ... done

  PostgreSQL 9.2 database added.  Please make note of these credentials:

   Root User: adminxxxxxx
   Root Password: xxxxxxxxxxxx
   Database Name: skinnyapp

Connection URL: postgresql://$OPENSHIFT_POSTGRESQL_DB_HOST:$OPENSHIFT_POSTGRESQL_DB_PORT

Waiting for your DNS name to be available ... done

Cloning into 'skinnyapp'...
The authenticity of host 'skinnyapp-foobar.rhcloud.com (255.255.255.255)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'skinnyapp-foobar.rhcloud.com,255.255.255.255' (RSA) to the list of known hosts.

Your application 'skinnyapp' is now available.

  URL:        http://skinnyapp-foobar.rhcloud.com/
  SSH to:     xxxxxxxxxxxx@skinnyapp-foobar.rhcloud.com
  Git remote: ssh://xxxxxxxxxxxx@skinnyapp-foobar.rhcloud.com/~/git/skinnyapp.git/
  Cloned to:  /Users/foobar/skinnyapp

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

```

DBの情報
>   Root User: adminxxxxxx
>   Root Password: xxxxxxxxxxxx
>   Database Name: skinnyapp

サーバの情報
>  URL:        http://skinnyapp-foobar.rhcloud.com/
>  SSH to:     xxxxxxxxxxxx@skinnyapp-foobar.rhcloud.com
>  Git remote: ssh://xxxxxxxxxxxx@skinnyapp-foobar.rhcloud.com/~/git/skinnyapp.git/

Gitクローン先の情報
>  Cloned to:  /Users/foobar/skinnyapp


サーバーにgitリポジトリがあり、
また、sshでログインも出来ます。


作成した、アプリを一度開いてみましょう。

```bash:
# 
$ open http://skinnyapp-foobar.rhcloud.com/

```

![名称未設定２.png](https://qiita-image-store.s3.amazonaws.com/0/31371/b3cbd6c7-6709-2ffd-316e-8900e0f00d32.png "名称未設定２.png")
という画面が、表示されているはずです。


gitリポジトリを自前でクローンしたいときは、

```bash:
# クローン
$ git clone ssh://xxxxxxxxxxxx@skinnyapp-foobar.rhcloud.com/~/git/skinnyapp.git skinnyapp 
$ cd skinnyapp

```
とします。


## skinnyを用意

今回は公式チュートリアルを元に、ざっくり、下記の手順で準備します。

* ダウンロード
* モデル作成
* DBマイグレート
* サーバ起動
* ページ確認

[Skinny Frameworkのサイト](http://skinny-framework.org/)から、まずは、スケルトンをダウンロードしてきます。

「skinny-blank-app-with-deps.zip (80MB)」
など書いてある物になります。

ZIPファイルを展開して、ターミナルを開き、フォルダ内に移動して
まずは、development環境でコマンドを実行します。

```bash:
# Membersを用意
$ ./skinny g scaffold members member name:String activated:Boolean luckyNumber:Option[Long] birthday:Option[LocalDate]
# DBマイグレート(SQLite)
$ ./skinny db:migrate
# サーバ起動
$ ./skinny run
```


サーバが起動したら別のターミナルを開き、コマンドラインからブラウザを表示します。
```bash:
#トップ画面をブラウザで表示
$ open http://127.0.0.1:8080/

#memberの一覧画面をブラウザで表示
$ open http://127.0.0.1:8080/members
```


## OpenShiftデプロイ用の設定
ここからは、OpenShift環境に合わせた設定変更をおこないます。

PostgreSQL用のJDBCドライバーを追加します。
```scala:Build.scala
      "com.h2database"          %  "h2"                  % "1.4.177",      // your own JDBC driver
      "org.postgresql" % "postgresql" % "9.2-1004-jdbc4",      // your own JDBC driver


```


OpenShift用のデータベース設定に変更します。
```bash:application.conf
development {
  db {
    default {
      driver="org.h2.Driver"
      url="jdbc:h2:file:./db/development;MODE=PostgreSQL;AUTO_SERVER=TRUE"
      user="sa"
      password="sa"
      poolInitialSize=2
      poolMaxSize=10
    }
  }
}

test {
  db {
    default {
      driver="org.h2.Driver"
      url="jdbc:h2:file:./db/test;MODE=PostgreSQL;AUTO_SERVER=TRUE"
      user="sa"
      password="sa"
      poolInitialSize=2
      poolMaxSize=10
    }
  }
}

staging {
  db {
    default {
      driver="org.postgresql.Driver"
      url="jdbc:postgresql://"${?OPENSHIFT_POSTGRESQL_DB_HOST}":"${?OPENSHIFT_POSTGRESQL_DB_PORT}"/"${?PGDATABASE}
      user=${?OPENSHIFT_POSTGRESQL_DB_USERNAME}
      password=${?OPENSHIFT_POSTGRESQL_DB_PASSWORD}
      poolInitialSize=5
      poolMaxSize=20
    }
  }
}

production {
  db {
    default {
      driver="org.postgresql.Driver"
      url="jdbc:postgresql://"${?OPENSHIFT_POSTGRESQL_DB_HOST}":"${?OPENSHIFT_POSTGRESQL_DB_PORT}"/"${?PGDATABASE}
      user=${?OPENSHIFT_POSTGRESQL_DB_USERNAME}
      password=${?OPENSHIFT_POSTGRESQL_DB_PASSWORD}
      poolInitialSize=5
      poolMaxSize=20
    }
  }
}


```

warファイルを作成して、OpenShiftのGitフォルダにコピーします。

```bash:
#war作成
$ ./skinny package production

#ファイルコピー（Tomcat上にwarファイル名で展開されるので、ファイル名を変更）
$ cp ./build/target/scala-2.10/skinny-blank-app_2.10-0.1.0-SNAPSHOT.war /User/foobar/skinnyapp/deployments/skinnyapp.war

```

## OpenShift環境にDBマイグレート

OpenShiftのインスタンス上のPostgreSQLにDBマイグレーションするには、ポートフォワーディングをつかいます。

```bash:
# ポートフォワード作成
$ rhc port-forward shinnyapp
Checking available ports ... done
Forwarding ports ...

To connect to a service running on OpenShift, use the Local address

Service    Local               OpenShift
---------- -------------- ---- ----------------
java       127.0.0.1:8080  =>  127.4.227.1:8080
postgresql 127.0.0.1:5432  =>  127.4.227.2:5432

Press CTRL-C to terminate port forwarding
```

次に、DB設定用の環境変数を揃えます。
```bash:
# 環境変数を取得する
[shinnyapp-foobar.rhcloud.com]\> export|egrep "OPENSHIFT_POSTGRESQL_DB_PORT|PGDATABASE|OPENSHIFT_POSTGRESQL_DB_PASSWORD"

declare -x OPENSHIFT_POSTGRESQL_DB_PASSWORD="xxxxxxxx"
declare -x OPENSHIFT_POSTGRESQL_DB_PORT="5432"
declare -x PGDATABASE="skinnyapp"

```

ローカルにも環境変数を反映して、DBマイグレートを実行します。

```bash:
#ローカル環境に環境変数をエクスポート
declare -x OPENSHIFT_POSTGRESQL_DB_PASSWORD="mjIwfERH7B3s"
declare -x OPENSHIFT_POSTGRESQL_DB_PORT="5432"
declare -x PGDATABASE="jbossews"

#ポートフォワーディングのため、ここだけ違う
declare -x OPENSHIFT_POSTGRESQL_DB_HOST="127.0.0.1"

#OpenShiftにDBマイグレート
./skinny db:migrate production

```

## OpenShift環境にwarファイルをアップロード

最後に、先ほどコピーしたwarファイルをGit経由でアップロードします。

```bash:
$ git add .
$ git commit -m "Inital commit."
$ git push

...再起動に関するログ...

```

別のターミナルで、ログを開いてみましょう。

```bash:
# ログを表示
$ rhc log skinnyapp
```


しばらくして、ブラウザを開いて、動作を確認しましょう。


```bash:
$ open http://shinnyapp-foobar.rhcloud.com/shinnyapp/members
```

## おわりに
ソースに修正があれば、再びwarファイルを作成して、デプロイしてみましょう。

以上で終わりです。