GMOクラウドVPS+Ubuntu14.04にFlynnをインストールしたのでその手順(2016/02/05)


# GMOクラウドVPSを契約したのでFlynnをインストールしてみた
先月ぐらいにWEBサイトを作成したくなりGMOクラウドVPSの１GBプランを契約しました。
そこでサーバー側の環境構築に折角なのでプライベートPaasを構築してみたくなりFlynnのインストールをしてみました。その中で結構はまっちゃったのでインストールからデプロイまでの手順を残しておきたいと思います。
また、後述しますが、最終的によく分からないエラーにはまってしまい最終的に使用を断念してしまいました。

目次

* Flynnとは
* インストール準備
* Flynnのインストール
* Flynnの起動
* クラスター登録
* デプロイ
* 終わり
* 参考にしたサイト

## Flynnとは
Flynnとは何かをざっくり言うとOSSのPaasになります。
Flynnを使えば

 * 自前のサーバーにHerokuライクなPaas環境を構築できる
 * コマンド一つでスケールができるようになる
 
などが行えるようになります。Herokuライクな環境を構築できるおかげで、サーバー側にRubyをインストールしたりRaisをインストールしたりなどといった環境構築の手間が省けます。

他のOSSのPaasですが、Flynn以外に以下のものがあります。

* CloudFoundry
* OpenShift
* Deis

今回、これらを使うことも考えたんですが、CloudFoundryとOpenShiftは機能が豊富でIBMが採用していたり、Google,Amazonが使用して入りと個人がGMOクラウドVPSの1GBプランで使うには少し大げさな気がして今回は使いませんでした。

また、Deisを使用するにはOSがCoreOSでなければならず、Ubuntu環境である今回は使用できませんでした。
そこで、Flynnですが、システム要件が

* １GB以上のRAM
* ２０GB以上のストレージ
* ２つのCPUコア
* Ubuntu

と、今回のGMOクラウドVPSの1GBプランにぴったりでした。そのため、Flynnを使うことにしたのです。

## インストール準備
最初にGMOクラウドVPSでは契約時のUbuntuのバージョンが12.04となっているため、14.04にアップデートを行いました。
参考サイト[http://hentai-kun.hatenablog.jp/entry/2014/09/18/200000]

次に、Flynnインストール時に必要っぽいUbuntuカーネルとzfsのインストールを行いました。
これらはFlynnインストール時にもapt-getでインストールしているようですが、私はここでUbuntuカーネルのインストールなりzfsのインストールなりに失敗してハマっちゃいました。ですので、事前にインストールしておいたほうが無難だと思います。

#### Ubuntuカーネルのインストール
Ubuntuカーネルはapt-getコマンドでインストールしました。以下のコマンドを入力して何もエラーがでなければ大丈夫だと思います。

```shell-session
$ sudo apt-get install  linux-image-$(uname -r) linux-headers-$(uname -r) linux-image-extra-$(uname -r)
```

#### zfsのインストール
次にzfsのインストールです。以下のコマンドを入力して問題なくzfsがインストールできればFlynnをインストールするときに必要なものは揃うはずです。

```shell-session
$ sudo add-apt-repository ppa:zfs-native/stable
$ sudo apt-get update
$ sudo apt-get install spl spl-dkms ubuntu-zfs zfs-dkms
$ sudo dpkg-reconfigure spl-dkms
$ sudo dpkg-reconfigure zfs-dkmsdkms status
$ sudo dkms status
```
※sudo dkms statusでzfsのバージョン情報が表示されれば成功です。

## Flynnのインストール
Flynnのインストールは以下のコマンドを入力するだけでよく非常に簡単です。

```shell-session
$ sudo bash < <(curl -fsSL https://dl.flynn.io/install-flynn)
```

## Flynnの起動
インストールが完了したら次にFlynnの起動を行いました。以下の順番でコマンドを入力します。

```shell-session
$ sudo flynn-host init --init-discovery
https://discovery.flynn.io/clusters/53e8402e-030f-4861-95ba-d5b5a91b5902
$ sudo flynn-host init --discovery https://discovery.flynn.io/clusters/53e8402e-030f-4861-95ba-d5b5a91b5902
$ sudo start flynn-host
```

最後のstart flynn-hostのコマンドがFlynnの起動になります。起動後は以下のコマンドを打てば起動していることを確認できます

```shell-session
$ sudo status flynn-host
flynn-host start/running, process 4090
```

## クラスターの登録
Flynnの起動が済んだら次にクラスターの登録を行います。これも以下のコマンドを入力することで行えます。

```shell-session
sudo CLUSTER_DOMAIN=＜自分で用意したサーバーのドメイン＞ flynn-host bootstrap /etc/flynn/bootstrap-manifest.json
```

※サーバーのドメインについてですが、FlynnではGitリポジトリやダッシュボードなどにサブドメインを利用しています。
そのため、取得したドメインについて、サブドメインの設定をする必要があります。例えば、「demo.localflynn.com」というドメインであれば以下のような設定です。この設定についてはドメイン管理業者ごとに違いますので検索して調べてみてください。

```shell-session
*.demo.localflynn.com.  CNAME  demo.localflynn.com.
```

クラスターの登録が完了したら以下のコマンドが出力されていると思いますのでコピペして入力します。これにより~/.flynnrcという設定ファイルにクラスターの情報が登録されます。

```shell-session
flynn cluster add -p xxxxxxxxxxxxxx= default demo.localflynn.com xxxxxxxx
```

## デプロイ
いよいよアプリのデプロイになります。まずは、Flynnのクライアントツールをインストールします。これも以下のコマンドを入力するだけで完了します。

```shell-session
L=/usr/local/bin/flynn && curl -sSL -A "`uname -sp`" https://dl.flynn.io/cli | zcat >$L && chmod +x $L
```

続いて先ほどのクラスター登録をクライアント側でも行います。以下のコマンドを入力し~/.flynnrcにクラスター情報を設定します

```shell-session
flynn cluster add -p xxxxxxxxxxxxxx= default demo.localflynn.com xxxxxxxx
```

Flynnのクライアントツールをインストールし、クラスターの登録も済みましたのでいよいよアプリのデプロイになります。デプロイしたいアプリの場所まで移動し以下のコマンドを入力します。途中、ユーザーIDとパスワードを求められたら、~/.flynnrcに設定されているNameとKeyの値を入力します。

```shell-session
$ flynn create example
```

このコマンドにより、gitのリモートブランチにflynnが追加されます。git remoteコマンドを打てば追加されたリモートブランチの情報を確認できます。

あとは、git pushでアプリをFlynnにデプロイします。ここの使用感はHerokuと全く一緒ですね。もしも途中で、ユーザーIDとパスワードを求められたら、~/.flynnrcに設定されているNameとKeyの値を入力します。

```shell-session
$ git push flynn master
```

pushが完了してしばらく経てば、WEBサイトが起動します。ブラウザ等で以下のURLにアクセスすれば動いているサイトを見ることができます。
http://example.＜自分で用意したサーバーのドメイン＞

※もしも、デプロイしたいアプリがなければ公式が用意しているサンプルアプリを使うといいと思います。[https://flynn.io/docs]


## 終わり
以上が、Flynnをインストールしてアプリをデプロイするまでの私が行った手順になります。
印象としてはかなり簡単に自前のPaas環境を構築できました。私の場合は、サーバー側の環境を気にすることなく、Railsアプリのデプロイを行えました。

ただし、その後以下の問題が出て結局使用を断念してしまいました。

#### 二回目以降git push flynn masterに失敗する
二回目以降のデプロイ時になぜか失敗します。エラーの内容は以下になります。ググったりしてなんとか解決しようとしたんですが、正直お手上げ状態です。

```shell-session
-----> Creating release...
remote: Error deploying app release: Timed out waiting for deployment completion!
To ssh://git@demo.xxxxxxx.com:xxxx/example.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'ssh://git@demo.xxxxxxx.com:xxxxxxx/example.git'
```

#### 一回サーバーの再起動を行うとFlynnが立ち上がらなくなった
こちらも一回サーバーの再起動させたらsudo start flynn-hostを行った時に失敗するようになりました。結局flynnをクリーンインストールすることになりました。



色々調べたんですが、私には上記の問題を解決できず結局Flynnを使用しないことにしました。ただ、それを抜けば、こんなに簡単に自前のPaas環境を構築できるのは大変魅力的でした。場合によっては、サーバー側の環境（Rubyのバージョンとか）を全く意識しなくてもFlynnさえインストールすればスケールするインフラ・デプロイ環境を構築できるようになるかもしれません。そうすることでWEBアプリの開発により専念できるようになるかもしれませんね。

## 参考にしたサイト
私がFlynnをインストールした時に参考にしたサイトです。

・公式
https://flynn.io/docs/installation/manual
→Flynnご本家のマニュアルインストールページです。間違いなくこのページより詳しいです。

・DockerによるマルチホストのPaaS flynnの概要とそのアーキテクチャー
http://deeeet.com/writing/2014/07/07/flynn/
→Flynnの概要がわかりやすく載っています。ここを見ればFlynnがどういうものなのかわかるとおもいます。

・flynnを使ったオートスケーリングシステム
http://ameblo.jp/principia-ca/entry-12001479656.html
→自分はオートスケーリングを使用してみてはいないんですが、公式の「Bootstrap Flynn」に載っているクラスターの登録の方法では動かなかったためこのページに手順を参考にインストールしました。

・ひしめき合うOpen PaaSを徹底解剖！ PaaSの今と未来
http://www.slideshare.net/jacopen/openpaas-paas
→Flynn以外のOSSのPaasについて比較を行っているスライドです。私はここでFlynnを知りました。