2020年にはもっと便利な方法があるのでこちらの記事を参照してください
HerokuにHaskellで作ったWebサービスを公開する簡単な方法 - Qiita
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
うまく行きましたか?