Yesod   複数のページ

ホーム   目次


サーバーの準備

Ubuntu は「 Conoha 」を参考に用意してください。

CentOS は「 CentOS で Dokkuを参考に用意してください。

Dokku の必要条件は 1GB以上のメモリですが、Yesodをデプロイするには、2GB 以上 のサーバーをお勧めします。

私の場合ですと、今回のサンプルは、2GBのUbuntuサーバーに対して2回目のデプロイ で成功しました。

サーバーでの Dokkuリポジトリの作成

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
    

Git リポジトリの作成とデプロイ

「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サーバにログインして次の作業をしてください。「12345」の部分は、ポート番号を入力します。「:」の後の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回目のデプロイ で成功しました。


19343 visits
Posted: Feb. 14, 2019
Update: Feb. 15, 2019

ホーム   目次   ページトップ