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に興味持った方がいれば、ぜひご連絡くださいませ〜