MyrokuというHerokuっぽいものを実装してみた

あけましておめでとうございます。SF アドベントカレンダーも書けず、2012 年のまとめとかも書けず、まぁ何をしてたかというと生きるのに精一杯だったんですが、あともう一個やってたのがアプリ書くってことでした。前から、自前で簡単につかえる Heroku っぽい PaaS があるといいなぁと思ってたのですが、やっと動くものができましたので公開します。”My Heroku”で Myroku。

どういうもの?

基本の挙動は超シンプルです。Heroku っぽい感じ。

  • 好きな名前のアプリを作成する(sample-app)

  • .llenvに使いたい LL のバージョンを書く(node-0.9.3)

  • Procfileに起動するプロセス書く(web: node app.js)

    • 一番最初に HTTP サーバを書く
  • パッケージの管理ファイルを書く(nodeならpackage.json)

  • admin サーバが持ってる git レポジトリに push する(git push -u myroku master)

  • あとはしばらく待ってhttp://sample-app.example.localにアクセスするだけ

    • ワイルドカード DNS とかで全部 proxy サーバに向けておけば、アプリ作るたびに DNS 変更とか要らない

何が起こってるかというと

  • アプリ作成すると、その名前をサブドメインにしてnginxの conf 作る

    • 自動でポート番号とかアサインされる
  • git push すると、hook スクリプトがアプリのビルドキューを Resque に投げる

    • 正確には Resque に投げる HTTP リクエストを叩く
  • Resque ワーカーがビルドしてデプロイする

    • 拙作のruby-llenvを使ってる
  • foreman exportで daemontools のプロセスとして登録する

    • これも拙作のライブラリ使ってる
    • この時、最初のポート番号とか環境変数に入れてる

といったところ。

使った主なライブラリ

大体これまで使ったことないものだったので学習コストがえらくかかったけど、大変楽しかったし、その過程でruby-llenv, gitolite2-cookbook, foreman-export-daemontoolsとかも生まれて良かった。

これ全部ゼロから書くとかあり得ないし、レールに乗っかるという意味では ruby 最強だった。ちと凝りすぎた感は否めないけど。。。

使い方

今のところ cookbook とセットで使う想定しかしてないので、こちらの README に書いてる感じでやると多分使える気がします。

Vagrant でしか試してないですが、多分chef-soloが入ってるサーバで ssh できればconfig/deploy/default.rbとかを適当に書いてcap deployでも動く気はしますが未確認。

これから

ちょっと燃え尽きたのでいろいろ整備するのはずっと先になるのでは。。。やりたいことは Issues にでもまとめておきます。

おわりに

誰の需要もないニッチなところで自分だけが欲しい物をゴリゴリ書けて満足です。アイデアは半年前くらいからあったのですが、出来上がってみたら思ったよりコードの量は多くなりましたね。レールに乗ったのと、chef 使ってなるべく記述するようにしたのと、無駄にサーバが複数の場合も想定したので膨れた感じ。まぁ自己満足なのでどうでもいいです。

これを通じて、chef, cap, foreman, vagrant といった ruby 製の優秀なツールにだいぶ慣れたので、今後は必要に応じてすぐに使うことができそう。特に vagrant は素晴らしい。ruby 自体という意味では、まだまだスニペットの蓄積が少ないけど、やりたいことを無理やりにでも書く程度ならググらずにできることが多くなってきました。

あと ActiveRecord は優秀ですね。こういう管理アプリ用途であればこそ、DB ごときで頭悩ませたくないので思いっきりレールに乗るのは正しいと思いました。実はまだ Rails 触ったことないのですが、AR だけで正直満足。まともな UI 作ろうと思った時まで取っておきます。

2012 年まとめとかアドベントカレンダーはまた気が向いたら書きます。ちとくたびれました。。。

もし Myroku もしくは llenv に興味持った方がいれば、ぜひご連絡くださいませ〜


Ryosuke Iwanaga

Software engineer / Anime / NFL / Father. Posts are my own, not endorsed by any org.