ConoHa + DokkuでプライベートPaaS構築


今まではHerokuのFreeプランでWebアプリやHubotを運用していました．
しかし，6月からの新料金では，24時間稼動が出来なくなりました．
Hubotは研究室やアルバイト先で使っているので，死活問題です．

  - [Herokuの新しいプライシングがついに公開。Freeは1日6時間以上Sleepする必要あり - SideCI Blog - SideCIの継続的インテグレーションブログ](http://sideci.hatenablog.com/entry/2015/05/08/094043)
  - [Herokuの新料金はお得なのか - フレクトのHeroku Lab](http://blog.flect.co.jp/labo/2015/05/free-dyno-fae3.html)

そこで，Hobbyプランに移行するのではなく，VPSを借りてプライベートPaaSを構築することにしました．
Open PaaSは[Deis](http://deis.io/)や[Flynn](https://flynn.io/)を検討しましたが，以下の理由で[Dokku](http://progrium.viewdocs.io/dokku/)にしました．

  - 各アプリは1 dynoで運用
  - PaaSは1 node(VPS 1台)で運用
  - Dockerベースでシンプルな構成

Open PaaSについては，[PaaS勉強会](http://paas.connpass.com/)の[@jacopen](http://twitter.com/jacopen)さんのスライドが参考になります．

  - [ひしめき合うOpen PaaSを徹底解剖！ PaaSの今と未来](http://www.slideshare.net/jacopen/openpaas-paas)
  - [Docker PaaSとしての OpenShift, Deis, Flynn比較](http://www.slideshare.net/jacopen/docker-paas-openshift-deis-flynn)

## ConoHaとお名前.comの契約

VPSは[さくらインターネット](http://vps.sakura.ad.jp/)と[ConoHa](https://www.conoha.jp/)で悩みました．
ただ，料金もほぼ同じなので **[キャラクターが可愛い](http://xn--y8j1ek.com/)** という理由でConoHaにしました．
**[こちら](https://www.conoha.jp/referral/?token=u2iNoLvj3bvVKbPs62OmmDIqtGyIYks.wOykoWrce1SXdu7VLMA-3CP)** から登録すると，1000円分のクーポンが貰えます．
イメージOSは「Ubuntu 14.04(64bit)」，接続許可ポートは「SSH」と「Web」を選択します．

![conoha_service_add.png](https://qiita-image-store.s3.amazonaws.com/0/58742/db5ed83a-b416-d2d0-ec55-94bfd6c27cc2.png "conoha_service_add.png")

合わせて，同じGMOが運営する[お名前.com](http://www.onamae.com/)でドメインをします．
今回は[hiconyan.com](http://www.hiconyan.com/)を680円/年で契約しました．
このとき，無料の[Whois公開情報代行](http://www.onamae.com/service/d-regist/option.html)を申し込むのを忘れずに．
取得できたら，以下の記事を参考に，名前解決時にVPSのIPアドレスを返すようにします．

  - [ConoHaとお名前.comで取得したドメインを利用してWEBサーバーを公開する - AKB428 Cafe](http://akb428.hatenablog.com/entry/2014/07/20/015906)

また，Dokkuでは `app.hiconyan.com` のように，Virtualhostを利用します．
そのため， `*.hiconyan.com` も名前解決できるようにしておきます．

![records.png](https://qiita-image-store.s3.amazonaws.com/0/58742/5c3d9959-d51a-0cb7-8421-7c15d1a1cda1.png "records.png")

## Dokkuのインストール

[Dokku](http://progrium.viewdocs.io/dokku/)はHerokuインスパイアのOpen PaaSです．
機能は限定されますが，Dockerと200行のBashスクリプトというシンプルな構成です．
(v0.3からは[Dockerfileのデプロイ](http://progrium.viewdocs.io/dokku/deployment/dockerfiles/)や[アプリのスケール](http://progrium.viewdocs.io/dokku/process-management/)も可能になりました．)
[Buildpack](https://devcenter.heroku.com/articles/buildpacks)対応なので， `git push` するだけで使えます．

インストールは公式に従って，以下のコマンドをコピペするだけ．
(DokkuやDockerのパッケージ，[herokuish](https://github.com/gliderlabs/herokuish)がインストールされます．)

```sh
$ wget https://raw.githubusercontent.com/progrium/dokku/v0.4.4/bootstrap.sh
$ sudo DOKKU_TAG=v0.4.4 bash bootstrap.sh
```

完了したら，VPSの80番ポートにアクセスして，Webで初期設定を行います．

  - **Public Key** : Gitで使う公開鍵 ( `https://github.com/username.keys` など)
  - **Hostname** : 取得したドメイン ( `hiconyan.com` など)
  - **Use virtualhost naming for apps** : チェック

## おすすめプラグイン&ツール

よりHeroku的に使うために，おすすめのプラグインとツールを紹介します．

  - [dokku-maintenance](https://github.com/dokku/dokku-maintenance)

Herokuの[Maintenance Mode](https://devcenter.heroku.com/articles/maintenance-mode)的なプラグインです．
`dokku maintenance:on <app>` で，メンテナンス中画面に切り替えられます．

  - [dokku-slack](https://github.com/ribot/dokku-slack)

Herokuの[Deploy Hooks](https://devcenter.heroku.com/articles/deploy-hooks)的なプラグインです．
`dokku slack:set <app> <webhook_url>` で設定しておくと，デプロイ時にSlackに通知してくれます． 

  - [dockland](http://qiita.com/uetchy/items/6ad8ee32b8bb9ee42975)

DokkuはHerokuと違って， `apps:create` や `config:set` をPaaS(サーバ)上で叩く必要があります．
docklandを使うと，それをクライアント(開発機)から実行でき，非常に便利です．

## アプリのデプロイ

ここからは，docklandを導入した前提で，Dokkuにデプロイしていきます．
サンプルは，僕が作ったGo言語製のWebアプリ「[kakuzuke](https://github.com/hico-horiuchi/kakuzuke)」を使います．
ポイントは，docklandを実行する為に，先に `git remote` を登録しておくことです．

```sh
$ git clone git://github.com/hico-horiuchi/kakuzuke.git
$ cd kakuzuke
$ git remote add dokku dokku@hiconyan.com:kakuzuke
$ dockland apps:create kakuzuke
$ dockland config:set GITHUB_ACCESS_TOKEN=your_access_token
$ git push dokku master
```

これでBuildpackを使ってコンテナがビルドされ，NginxのVirtualhostが設定されます．
Dokkuにアクセスすると，アプリが実行されているはずです．

[![screen.gif](https://raw.githubusercontent.com/hico-horiuchi/kakuzuke/master/screen.gif)](http://kakuzuke.hiconyan.com/)

## 監視について

[Sensu Deep Talks](http://sensu-talks.connpass.com/)の主催者としては[Sensu](https://sensuapp.org)を使いたいですが，監視サーバが必要になってしまいます．

そこで，VPSの監視には[Mackerel](https://mackerel.io/ja/)を使っています．
単純にCPUやメモリの使用率を監視し，アラートを通知するようにしています．

また，外形監視(HTTP)は[Uptime Robot](https://uptimerobot.com/)を使っています．
各アプリのURLに定期的にアクセスし，落ちていないかチェックさせます．
(本当はMackerelにしたいのですが，Freeプランでは無理なので…．)

## まとめ

今回は「ConoHa + お名前.com + Dokku」という構成で，プライベートPaaSを構築しました．
PaaSの構築も，アプリのデプロイも簡単なので，ぜひお試し下さい．

他にも，Railsなどでデータベースを使うには，[公式プラグイン](http://progrium.viewdocs.io/dokku/plugins/)を使うと良さそうです．
所属する[プログラミングサークル](https://github.com/slp-kbit)ではRails開発もしているので，PaaSを活用できればと思っています．

## 参考文献

  - [DockerでミニHeroku！「Dokku」をさくらのクラウドで試す - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/2356/)
  - [Inside Dokku in 5 minutes](http://banyan.me/slides/20140116/slides.html)