GMOクラウドVPS+Ubuntu14.04にdokkuをインストールしてみた_2016/02/13

今回、GMOクラウドVPS+Ubuntu14の組み合わせでdokkuをインストールしてみました。
結果として、割と楽にインストールに成功したんですが、アプリをデプロイするまでに色々ハマリどころがあったので手順として残しておきたいと思います。

このページは以下の内容になります。

- dokkuとは
- インストール前の準備
- インストール
- dokku上でのアプリ作成
- アプリのデプロイ
- まとめ

## dokkuとは
dokkuとはdockerを利用したherokuライクなPaaS環境を構築できるOSSのプロジェクトです。
本体のコードは200行ほどのbashスクリプトで書かれています。

## インストール前の準備
dokkuをインストールする前にVPS環境に対して公開鍵で認証できるようにしておきます。

公開鍵認証の設定についてはQiita上のこちらの記事を参考にしました
・ssh公開鍵認証設定まとめ
http://qiita.com/iruseira/items/af8550fea92b5c5f7fca

設定後は以下のコマンドでパスワードなしでログインできるようになるはずです

```shell-session
$ ssh <~/.ssh/configに記載のホスト名>
```

## dokkuのインストール
インストール前の準備が終わったらdokkuのインストールです。公式ドキュメントに記載の以下のコマンドを入力します。

```shell-session
$ wget https://raw.githubusercontent.com/dokku/dokku/v0.4.13/bootstrap.sh
$ sudo DOKKU_TAG=v0.4.13 bash bootstrap.sh
```

これだけでインストールは完了です。が、もしここでエラーが出た時は/tmpに移動して実行した方が良いかもしれません。

```shell-session
$ cd /tmp
```

インストール後はにdokkuをインストールしたサーバーにブラウザからアクセスします。そうすると専用のセットアップ画面が出てくると思われます。
※写真がなくてごめんなさい。参考までにDigital Oceanのdokkuインストールのチュートリアルページに同じ画面の写真があるので参考にしてください。
http://thewebivore.com/tutorial-deploying-dokku-to-digitalocean-for-excellent-deploying-goodness/
画面中央の「Dokku Setup v0.3.17」の画面が該当の画面になります。


Public Keyは事前準備で登録したものが出てくると思われますので特にいじりません。

Hostnameはあなたが使用している独自ドメインに書き換えて「Use virtualhost naming for apps」にチェックを入れます。

最後は「Finish Setup」を押下します。これでインストール作業は全部終了です。

## dokku上でのアプリ作成
次はdokku上でアプリを作成します。
http://dokku.viewdocs.io/dokku/application-deployment/

まずはdokkuコマンドを用いてアプリの作成を行います。このコマンドはサーバー側で行います

```shell-session
$ dokku apps:create ruby-rails-sample
```

次にpostgresをインストールします。以下のコマンドをサーバー側で実行します。

```shell-session
$ sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git
$ dokku postgres:create rails-database
```

上記のコマンドはpostgresのダウンロードと新規DBの作成を行っています。

次は作成したDBとrailsアプリのリンクを貼ります。リンクを貼るために以下のコマンドを実行します。

```shell-session
$ dokku postgres:link rails-database ruby-rails-sample
```

## アプリのデプロイ
最後にクライアント側からアプリのデプロイを行います。公式ドキュメントは先ほどと同じページになります。まずは、railsのサンプルアプリをダウンロードしておきます。

```shell-session
$ git clone https://github.com/railstutorial/sample_app_rails_4.git
```
※公式ドキュメントと違いhttpsでリポジトリを指定しています。

次に以下のコマンドでdokkuをインストールしたサーバーをリモートリポジトリに追加します。

```shell-session
$ git remote add dokku dokku@dokku.me:ruby-rails-sample
```

ここの「dokku@dokku.me:ruby-rails-sample」ですが、@前のdokkuはuserネームです。dokkuをインストールした際に生成されています。dokku.meはdokkuをインストールしたサーバーの独自ドメインになります。ruby-rails-sampleは先ほどdokkuサーバー側で作成したアプリになります。

最後に以下のコマンドでアプリをdokkuサーバーにデプロイします。うまくいけば、アプリのデプロイが完了します。

```shell-session
$ git push dokku master
```
※ここで失敗したら、公開鍵登録の設定が失敗している可能性があります。

アプリのデプロイが完了すれば、「ruby-rails-sample.ドメイン名」でデプロイしたアプリにアクセスできます。

※Railsアプリの場合、DBのマグレーション処理が必要です。以下のコマンドをクライアント側で実行すればマイグレーション処理が完了します。

```shell-session
$ ssh dokku run ruby-rails-sample rake db:migrate
```

## まとめ
以上で、dokkuのインストールからRailsアプリのデプロイまでの手順となります。オープンPaasではFlynnなども試しましたが、そちらと比較するとかなり安定しているなという印象でした。
また、HerokuなどのPaasサービスと比較すると以下の自由度があると思います。

- 独自ドメインが使える
- 一つのDBに対して複数のRailsアプリからlinkをはることができる

上記のことはHerokuの有料版でもできるかもしれませんが、dokkuがGMOクラウドVPSの1GBプランでもスイスイと動くことを考えるとコストパフォーマンスでかなり有利だと思います。GMOクラウドVPSは株主優待も使えば一年間の使用料金はほぼゼロに近いとこまで落とせますし。

所感としては個人で使う分にはdokkuはかなりいい選択肢なんじゃないでしょうか？

※気になるところ
以下は、私が気になっているけどよく調べていないから分かっていないことです。
dokkuはスケールしないからプロダクトでは使用しないほうが良いという記事をたまに見ます。
しかし、公式ドキュメントを見たところ「Scaling Apps」という項目があるのを発見しました。なんでもv0.3.14からマルチプロセスには対応したようです。（だいたい2015年2月ごろ？）

ただ、複数台のサーバーにまたがる環境でdokkuを運用できるのか謎です。dokkuのGitHubリポジトリのREADME.mdにはかつてマルチホストの運用はサポートしていないからそちらを使いたい人はFlynnを使ってね。っていう記載があったんですが、今は無くなっています。また、docker自体にはマルチホストネットワークに対応した云々の記事をよく見ます。
果たして実際どうなんだろうか？dokkuは実運用にも使えるのか？気になるところです。