Dokku 入れた && モリモリ使える感じにした

### Dokku のインストール

[公式](https://github.com/progrium/dokku) の通り、 Ubuntu 14.04 であればなにも考えなくても入る。

```bash
$ wget -qO- https://raw.github.com/progrium/dokku/v0.2.3/bootstrap.sh | sudo DOKKU_TAG=v0.2.3 bash
```

例えば、 `dokku.example.local` というドメ因で解決できるようなサーバにDokkuをインストールしておけば、勝手に `/home/dokku/VHOST` の中身が `dokku.example.local` になる（大事な部分）。アプリをデプロイしたら `foobar.dokku.example.local` というところにホストされる。

で、そのあと、Heroku並みに簡単にデプロイできるようにするまでが若干めんどいので詳しく書いておく。

### 公開鍵を登録する。

このままではプッシュできないので登録。`dokku.example.local`にログインしてこんな感じで良いのでは。

```bash
curl https://github.com/udzura.keys | sudo sshcommand acl-add dokku udzura
```

`dokku@dokku.example.local` にSSHログインできるようにする。

研修とかで使う場合、めんど~なので社内Dokku専用の公開鍵を登録して秘密鍵を配っても良いかも。

### プッシュしてみる

適当なSinatraプロジェクト:

```rb:app.rb
require 'sinatra'
get '/' do
  "Hello, from dokku!!"
end
```

```rb:Gemfile
source "https://rubygems.org"
ruby '2.1.1'

gem 'sinatra'
```

```rb:Procfile
web: bundle exec ruby app.rb -p $PORT
```

まるっきりherokuと同じもの。このGitプロジェクトを、こんな感じでプッシュ。`sinatra-sample` は任意。そこの名前がそのままサブドメ院になる

```bash
$ git remote add dokku dokku@dokku.example.local:sinatra-sample
$ git push dokku master
```

するとなんかHerokuっぽい表示が出てくる。

```
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 323 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
-----> Cleaning up ...
remote: Cloning into '/tmp/tmp.5eBkCHIIsz'...
-----> Building sinatra-sample ...
remote: done.
remote: HEAD is now at 2c0f55f... Fix typo ooooo
       Ruby app detected
-----> Compiling Ruby/Rack
-----> Using Ruby version: ruby-2.1.1
-----> Installing dependencies using 1.5.2
       Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
       Using rack (1.5.2)
       Using tilt (1.4.1)
       Using bundler (1.5.2)
...
=====> Application deployed:
       http://sinatra-sample.dokku.example.local
```

Herokuと同じbuildpackを使っているので、当然と言えば当然...。

で、この `sinatra-sample.dokku.example.local` を我々がこのまま解決できる訳も無いので、全部エトセホスツにエントリを書いていっても良いけど、少しだけ楽な方法にする。

### dnsmasq で `*.dokku.example.local` を全部 `dokku.example.local` と同じとこに向ける

xip.io を使う人も多いみたいだけど、ちょっと... と思ったのでdnsmasqを使いたい。

まずはおもむろにインストール。みなさんもちろん、Mac.....ですよね...

```bash
$ brew install dnsmasq
$ cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
$ sudo cp -fv /usr/local/opt/dnsmasq/*.plist /Library/LaunchDaemons
```

おもむろに設定、ぼくは http://tell-k.hatenablog.com/entry/2014/04/28/002437 を見た。 `dokku.example.local` が `192.168.0.123` に向いている前提で。

```ini:dnsmasq.conf
bind-interfaces
address=/dokku.example.local/192.168.0.123
```

`/etc/resolver/dokku.example.local` というファイルを作る。

```hosts:dokku.example.local
nameserver 127.0.0.1
```

起動。

```bash
sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
```

ここまでしたら、ネットワークの設定で一番目のDNSを `127.0.0.1` にする必要があるかも。要出典である...。

### 確認

```bash
$ dig @127.0.0.1 hogehoge.dokku.example.local                                 

; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 hogehoge.dokku.example.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20679
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;hogehoge.dokku.example.local.         IN      A

;; ANSWER SECTION:
hogehoge.dokku.example.local.  0       IN      A       192.168.0.123
...

$ ping -c 1 sinatra-sample.dokku.example.local
PING sinatra-sample.dokku.example.local (192.168.0.123): 56 data bytes
64 bytes from 192.168.0.123: icmp_seq=0 ttl=59 time=23.631 ms
```

さて、おもむろに http://sinatra-sample.dokku.example.local を開くと「`Hello, from dokku!!`」って出てくるはず。出てくると良いですね（Herokuっぽく初回アクセスに時間が掛かる。こんなとこまでHerokuクローンなの...）。

### Troubleshoot: なんか起動しない

ログを見るにはログインしないといけないぞう:

```bash
$ ssh -t dokku@dokku.example.local logs sinatra-sample
```

その他コマンドが色々あるので `help` すると良さそう。エイリアスを貼れば`heroku`コマンドのように使える...