Heroku で Haskell を動かす方法は http://daimatz.hateblo.jp/entry/2013/02/09/164531 のように buildpack を使うとデプロイ時に Heroku のホストでビルドできて便利です。しかしビルド時間が15分までで Yesod などを使っていると間に合わず、手元で Ubuntu 10.04 向けのバイナリを作って push などする必要があります。Ubuntu 10.04 で開発してる人はもうあまりいないと思いますので、最近流行っている Docker を使って cedar stack 向けにビルドできるようにしてみました。
ビルドに使う Docker image は cedar 用のものに ghc と cabal-install をインストールして作りました。
サンプルプロジェクトは
- https://github.com/mechairoi/docker-heroku-cedar-ghc-demo
- http://docker-heroku-cedar-ghc.herokuapp.com/
にあります。デプロイするには READMEに書いてある通り、docker
とか heroku
コマンドをインストールして、リポジトリをクローンして
git clone https://github.com/mechairoi/docker-heroku-cedar-ghc.git
Heroku の アプリケーションを作って、
heroku create --stack=cedar
ビルドしてpush すれば
make build git checkout -b deploy git add -f dist/build/heroku-haskell/heroku-haskell git commit -m "build" git push heroku deploy:master
デプロイできると思います。Yesod でも deploy/Procfile に従って package.json などを配置して Makefile を修正すれば動くはずです。
make build の中身は
sudo docker run -v ${PWD}:/workspace -t mechairoi/heroku-cedar-ghc /bin/bash -xc 'cd /workspace/ \ && cabal --sandbox-config-file=./heroku.cabal.sandbox.config sandbox --sandbox=/workspace/.heroku-cabal-sandbox init \ && cabal --sandbox-config-file=./heroku.cabal.sandbox.config install --dependencies-only \ && cabal --sandbox-config-file=./heroku.cabal.sandbox.config configure \ && cabal --sandbox-config-file=./heroku.cabal.sandbox.config build --builddir=./dist-heroku \ && strip --strip-unneeded ./dist-heroku/build/heroku-haskell/heroku-haskell'
のようになっていて、Docker のホスト側をマウントして cabal sandbox を作ってるので2回目からはパッケージのダウンロードもなくビルドできます。Vagrant と違って起動も早いし Docker 便利ですね。