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
- ruby-llenv | RubyGems.org | your community gem host
- 1 ヶ月前くらいにこれに備えて作ってた。やっと陽の目を見た。
-
Gitolite
- sitaramc/gitolite · GitHub
- Hosting git repositories
git
のレポジトリサーバが作れる。OS の sshd に乗っかるのでユーザ作成とかとセットで使う
-
gitolite gem
- wingrunr21/gitolite · GitHub
- ruby から gitolite を操作できる。中身は
Grit
というののラッパ的な感じ。
-
Vagrant
- Vagrant
- VirtualBox をプログラマブルに操作できる
- これないと死んでた。マジ神。
-
Chef-Solo
- Chef Solo – Chef – Opscode Open Source Wiki
- スタンドアローンでサーバのプロビジョンができる
- gitolite とユーザ作成とかを全部宣言的に管理できた。神。
-
Berkshelf
- Berkshelf
- Chef の cookbook を bundler っぽく管理できる。knife みたいに自分の git に突っ込む必要ないので綺麗
-
gitolite2-cookbook
- riywo/gitolite2-cookbook · GitHub
gitolite
という cookbook は新し目の gitolite に対応してないので作り直した
-
Capistrano
- Home · capistrano/capistrano Wiki
- デプロイツール。アプリのデプロイ初め、各種タスクを書きまくった。コードの半分以上は cap
-
capistrano_rsync_with_remote_cache
- vigetlabs/capistrano_rsync_with_remote_cache · GitHub
- admin サーバでビルド終わらせて deploy するために使った。実際はこんな感じで
llenv install
も行ってる
-
capistrano-multiconfig
- railsware/capistrano-multiconfig · GitHub
- cap のタスクを簡単に共通化できる
- アプリのデプロイにも管理サーバのデプロイにも使ってる
-
Resque
- defunkt/resque · GitHub
- Redis 使って簡単にキューの仕組みが作れる
- 実際はこんな感じで
cap
のタスク叩いてるのがほとんど
-
Foreman
- ddollar/foreman · GitHub
- プロセスを宣言的に管理できる。Heroku も使ってるしマジ便利
-
foreman-export-daemontools
- riywo/foreman-export-daemontools · GitHub
- 同名の gem があるんだが、新し目の foreman に対応してないので作り直した
-
Sinatra
- Sinatra
- 言わずもがな。API サーバ的なのだけでとりあえず十分だったので sinatra で満足。
-
ActiveRecord
- ActiveRecord::Base
- Rails が使ってる OR マッパーだけど、単体でも使い勝手良いので使った
sinatra-activerecord
は使わずに自分で管理してるけど、造作ない
-
他
nginx
,mysql
,ubuntu
,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 に興味持った方がいれば、ぜひご連絡くださいませ〜