こうは書いたものの永続化層についても徐々に検証していかねばならぬ、ということでRedis Pluginを試す。
dokku-redis-pluginのご紹介
いくつかあるが、 luxifer/dokku-redis-plugin を試した。
インストール。Dokkuが動いているサーバでrootになっていれる必要がある。Dokku v0.2.3 だとSSH経由でインストールしようとしてもうまくいかなくて、なんなの感強い。
また、linkプラグインを一緒に入れる。
$ 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のコンテナを作る。
$ ssh -t dokku@dokku001.example.local redis:create hubotest
同じ名前 で Hubot のアプリケーションを作る。名前を変えられるらしいけど、linkプラグインの挙動がいまいち不安なのでやめた方が良いと思う。
$ git remote add dokku dokku@dokku001.example.local:hubotest
$ git push dokku master
こうすると勝手にredisとappがリンクされる、んで REDIS_URL
という環境変数がセットされる。
$ 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
を有効にするだけである。
$ echo '["redis-brain.coffee"]' > hubot-scripts.json
$ git add . && git commit -m 'Activate brain!!'
$ git push dokku master
以下のようなシンプルなメモ機能を書いて試してみる。
# 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} に関連づいたメモを削除しました。"
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: ジャバ = あなたと
良さそう。
コンテナ名とか
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がコンテナ内部だけでデータを保存していたら消える。けどそうはなっていないようで:
の辺を見ると分かるけれども /home/dokku/.redis/volume-${APP_NAME}/
のあたりにRedisのデータディレクトリをマウントしてくれる。なので設定によるけどサーバ再起動がかかっても残る。Redis自体の設定は https://github.com/luxifer/dokku-redis-dockerfiles を見る限りUbuntu Quantalのパッケージのデフォルトのままみたい。
MariaDB Plugin とかはベースイメージが異常な状態っぽくてうまく動かなかったけど、これは動いて良かった。素直に作ったイメージを用いて、他のDBでもプラグインを作ると良さそうに思う。