Edited at

HerokuにHaskellのアプリを公開する

More than 3 years have passed since last update.

Haskell on Herokuを使ってHerokuにHaskellのアプリを公開する方法を残しておきます。Haskell on Heroku は Halcyonを利用したHerokuの buildpack です。

Haskellのアプリは依存ライブラリのビルドに時間がかかってしまい、Herokuへデプロイする時は15分制限に簡単に引っかかってしまうので工夫が必要です。Halcyonは別のサーバー(Amazon S3)に環境を保存しておくことでインクリメンタルビルドを可能にしてくれます。

始めに新しくHerokuのアプリを作り buildpack を設定しておきます。

$ heroku create -b https://github.com/mietek/haskell-on-heroku

$ heroku buildpacks:set https://github.com/mietek/haskell-on-heroku


環境設定


  • ghc 7.10.1

  • cabal 1.22.6.0

を使用したいのでHerokuの環境変数に以下のように設定します。

$ heroku config:set HALCYON_GHC_VERSION=7.10.1

$ heroku config:set HALCYON_CABAL_VERSION=1.22.6.0

Haskell on Heroku はHerokuのデプロイ時の制限のためデフォルトで依存ライブラリのビルドを行わないようになっています。しかしこれだと sandbox を別に作る必要があって少し面倒くさいのでビルドを行うように修正します。この場合ビルドされたアプリはHalcyonのpublicサーバーに置かれるのでそれが嫌な場合はS3を使ってprivate storageを設定しましょう

$ heroku config:set HALCYON_NO_BUILD_DEPENDENCIES=0


アプリを公開する

ここまで設定できたら単純なアプリでうまく行ってるかどうかを試してみましょう。.cabalファイルもちゃんと作成しましょう。

{-# LANGUAGE OverloadedStrings #-}

import System.Environment
import Web.Scotty

main = do
env <- getEnvironment
let port = maybe 8080 read $ lookup "PORT" env
scotty port $ do
get "/" $ html $ "Hello Heroku!"

$ tree .

.
├── Main.hs
└── app.cabal

$ git push heroku master

...
$ heroku ps:scale web=1
$ heroku open

うまく行きましたか?