Dokku Redis Plugin を試す

* http://udzura.hatenablog.jp/entry/2014/05/29/121741

こうは書いたものの永続化層についても徐々に検証していかねばならぬ、ということでRedis Pluginを試す。

## dokku-redis-pluginのご紹介

いくつかあるが、 [luxifer/dokku-redis-plugin](https://github.com/luxifer/dokku-redis-plugin) を試した。

インストール。Dokkuが動いているサーバでrootになっていれる必要がある。Dokku v0.2.3 だとSSH経由でインストールしようとしてもうまくいかなくて、なんなの感強い。

また、linkプラグインを一緒に入れる。

```bash
$ cd /var/lib/dokku/plugins
$ git clone https://github.com/rlaneve/dokku-link.git link
$ dokku plugin-install link
$ git clone https://github.com/luxifer/dokku-redis-plugin redis
$ dokku plugins-install redis
```

これで `redis:create` などのコマンドが打てる。最初に、redisのコンテナを作る。

```bash
$ ssh -t dokku@dokku001.example.local redis:create hubotest
```

**同じ名前** で Hubot のアプリケーションを作る。名前を変えられるらしいけど、linkプラグインの挙動がいまいち不安なのでやめた方が良いと思う。

```bash
$ git remote add dokku dokku@dokku001.example.local:hubotest
$ git push dokku master
```

こうすると勝手にredisとappがリンクされる、んで `REDIS_URL` という環境変数がセットされる。

```bash
$ ssh -t dokku@dokku001.example.local config hubotest
=== hubotest config vars ===
REDIS_URL: redis://172.17.0.2:6379
```

この環境変数はそのまま `redis-brain.coffee` にとって利用できる内容なので、あとは `redis-brain.coffee` を有効にするだけである。

```bash
$ echo '["redis-brain.coffee"]' > hubot-scripts.json
$ git add . && git commit -m 'Activate brain!!'
$ git push dokku master
```

以下のようなシンプルなメモ機能を書いて試してみる。

```coffeescript:memo-simple.coffee
# Description:
#   簡易メモ。
#
# Commands:
#   hubot memo <key> <内容> - <内容> を key に紐付けて保存する
#   hubot memo <key> - 紐づいたメモを閲覧する
#   hubot memo-delete <key> - 紐づいたメモを削除する
#

module.exports = (robot) ->
  robot.respond /memo (.*(?: +)?(?:.*))/, (msg) ->
    messages = msg.match[1].split(/\s+/)
    key = messages.shift()
    value = messages.join(' ')
    if value is ''
      value = robot.brain.get "memo::#{key}"
    else
      robot.brain.set "memo::#{key}", value
      msg.send 'Saved!'

    if value is '' or !value
      msg.send "Memo: #{key} に関連づいたメモはありません。"
    else
      msg.send "Memo: #{key} = #{value}"

  robot.respond /memo-delete (.*)/, (msg) ->
    key = msg.match[1]
    robot.brain.remove "memo::#{key}"
    msg.send "Memo: #{key} に関連づいたメモを削除しました。"
```

```irc
udzura | hubot-sample: help memo                                                      
    -- | Notice(hubot-sample): hubot-sample-sample memo <key> - 紐づいたメモを閲覧する
udzura | hubot-sample: memo ジャバ                                                    
    -- | Notice(hubot-sample): Memo: ジャバ に関連づいたメモはありません。            
udzura | hubot-sample: memo ジャバ あなたと                                               
    -- | Notice(hubot-sample): Saved!                                                 
    -- | Notice(hubot-sample): Memo: ジャバ = あなたと                                    
udzura | hubot-sample: memo ジャバ                                                    
    -- | Notice(hubot-sample): Memo: ジャバ = あなたと
```

良さそう。

#### コンテナ名とか

```shell-session
root@dokku001:/var/lib/dokku/plugins# docker ps
CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS                     NAMES
dd0c81efe4e0        dokku/hubotest:latest     /bin/bash -c '/start   37 minutes ago      Up 37 minutes       0.0.0.0:49167->5000/tcp   dreamy_carson       
f3799752dcdb        redis/hubotest:latest     /bin/start_redis.sh    About an hour ago   Up About an hour    0.0.0.0:49165->6379/tcp   angry_hypatia       
```

とのこと。

#### 永続化って言うけどサーバ自体リブートしたらどうなるの？

Redisがコンテナ内部だけでデータを保存していたら消える。けどそうはなっていないようで：

* https://github.com/luxifer/dokku-redis-plugin/blob/master/commands#L31-L50

:arrow_up: の辺を見ると分かるけれども `/home/dokku/.redis/volume-${APP_NAME}/` のあたりにRedisのデータディレクトリをマウントしてくれる。なので設定によるけどサーバ再起動がかかっても残る。Redis自体の設定は https://github.com/luxifer/dokku-redis-dockerfiles を見る限りUbuntu Quantalのパッケージのデフォルトのままみたい。

----

MariaDB Plugin とかはベースイメージが異常な状態っぽくてうまく動かなかったけど、これは動いて良かった。素直に作ったイメージを用いて、他のDBでもプラグインを作ると良さそうに思う。