Ubuntu は「 Conoha 」を参考に用意してください。
CentOS は「 CentOS で Dokkuを参考に用意してください。
Dokku の必要条件は 1GB以上のメモリですが、Yesodをデプロイするには、2GB 以上 のサーバーをお勧めします。
私の場合ですと、今回のサンプルは、2GBのUbuntuサーバーに対して2回目のデプロイ で成功しました。
Ubuntu の場合も、CentOS の場合も同じです。
$ su dokku
$ cd
$ dokku apps:create yesod-sample
ここからは、ローカルコンピューターでの作業です。
$ stack new yesod-sample simple
$ cd yesod-sample
$ stack build
$ stack exec yesod-sample
$ hello world
プロジェクト内の「src
」ディレクトリの「Main.hs
」
を次のコードに書き換える。
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Main where
import Yesod
import Network.Wai.Handler.Warp (run, Port)
import System.Environment (getEnvironment)
import Data.List (lookup)
import Data.Maybe
data Links = Links
mkYesod "Links" [parseRoutes|
/ HomeR GET
/page1 Page1R GET
/page2 Page2R GET
|]
instance Yesod Links
getHomeR = defaultLayout [whamlet|
<h1>Home page</h1>
<p><a href=@{Page1R}>Go to page 1!</p>
<p><a href=@{Page2R}>Go to page 2!</p>
|]
getPage1R = defaultLayout [whamlet|
<h1>Page 1</h1>
<p><a href=@{HomeR}>Go home!</p>
<p><a href=@{Page2R}>Go to page 2!</p>
|]
getPage2R = defaultLayout [whamlet|
<h1>Page 2</h1>
<p><a href=@{HomeR}>Go home!</p>
<p><a href=@{Page1R}>Go to page 1!</p>
|]
main = do
port <- getPort
warp port Links
getPort :: IO Port
getPort = getEnvironment >>= return . port
where
port = fromMaybe defaultPort . fmap read . lookup "PORT"
defaultPort :: Port
defaultPort = 80
プロジェクト内の「my-project.cabal
」の「build-depends」に
次のコードを追加
build-depends: base >= 4.7 && < 5
, yesod
, warp
yesod-bin のインストール
$ stack install yesod-bin
初回は時間がかかります。
Stack のビルド
$ stack clean
$ stack build
すごくすご〜く時間がかかります。
Dokkuは、まだHaskellに対応していないため、Herokuの「buildpack」
を利用します。プロジェクト内に次の内容で「.buildpacks
」
というファイルを作ってください。
.buildpacks
https://github.com/mfine/heroku-buildpack-stack
Herokuは「Procfile」というファイルが必要です。プロジェクト内に次の内容で
「Procrile
」というファイルを作ってください。
Procfile
web: yesod-sample
「123.123.123.123」の部分は、サーバーのIPアドレスです。
$ git init
$ git add .
$ git commit -m "yesod-sample"
$ git remote add dokku dokku@123.123.123.123:yesod-sample
$ git push dokku master
初回のデプロイは、Haskellの実行環境もインストールしますので、 かなりの時間がかかります。
同じリポジトリに更新ファイルをデプロイする場合は、 2回目からはそれほど時間がかかりません
違うリポジトリにデプロイする場合は、また時間がかかります。
次のように表示されたらデプロイは成功しています。
=====> Application deployed:
https://123.123.123.123:12345
To 123.123.123.123:yesod-sampe
* [new branch] master -> master
表示されたアドレスはメモしておいてください。
CentOSサーバーにデプロイした場合はアドレスがハイフンで区切られています。 これをドット区切りに直してください。
https://123-123-123-123:12345
↓
https://123.123.123.123:12345
さらにCentOSサーバーでは、
ファイアーウォールに指定のポートのアクセスを許可させなければなりません。
CentOSサーバにログインして次の作業をしてください。「:
」の後の5桁もしくは4桁の数字が
ポート番号です。なお、この作業はUbuntuサーバーでは必要ありません。
firewall-cmd --zone=public --add-port=12345/tcp --permanent
firewall-cmd --reload
ブラウザで新規ウィンドウか新規タブを開いて、URLフィールドに表示されたアドレスを 入力して実行します。
CentOSサーバーの場合はドット区切りに直したアドレスを入力してください。
デプロイを始めてからすぐにエラーが出る場合は、プロジェクトの設定のどこかに ミスがあります。Dokkuの設定やプロジェクトの設定をもう一度見直してください。
デプロイを始めてからしばらくして次のメッセージが出た場合は、リモートサーバー側の 問題です。
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'dokku@123.123.123.123:yesod-sample'
リモートサーバーのメモリを増やすか、再度デプロイを試みてください。デプロイを 繰り返すと上手くいく場合もあります。
再度デプロイをする場合は、念のために「stack clean」と「stack build」で プロジェクトをビルドしなおして、「git add .」と「git commit -m "yesod-sample"」で git に登録しなおしてください。私の場合ですと、このサンプルは、2GBのUbuntuサーバーに対して2回目のデプロイ で成功しました。