Dokku   デプロイ

ホーム   目次

Dokku は、デプロイツール (PaaS) として最もシンプルなものです。このコーナーでは、 Dokku で Haskell アプリケーションを、リモートサーバーへデプロイする方法を説明しています。


haskell-web-app.cabal」において 「http-types」とすべきところを 「htt-types」としていました。 すみませんでした。2019年2月5日午後7時

Haskell Stack のインストール

Haskell の Web アプリケーション開発では、Haskell-Platform ではなく、 Haskell Stack を使ってアプリケーションを作成します。

masOSの場合

macOS では、Homebrew を使って Haskell Stack をインストールします。

下記サイトでインストールコードをコピーして、ターミナルにペーストして 実行してください。

macOS 用パッケージマネージャー — macOS 用パッケージマネージャー

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrewのインストールが完了しましたら、ターミナルに次のコードを入力して Haskell Stack をインストールしてください。

brew install haskell-stack

Linux の場合

次のコードをターミナルで実行します。

curl -sSL https://get.haskellstack.org/ | sh

もしくは

wget -qO- https://get.haskellstack.org/ | sh

プロジェクトの作成

次のコードをターミナルに入力して、Stack のテンプレートから haskell-web-app プロジェクトを作成します。

stack new haskell-web-app simple

作成された「haskell-web-app」ディレクトへ移動して、ビルドします。

cd haskell-web-app
stack build

次に実行してみます。

stack exec haskell-web-app
hello world

プロジェクトのカスタマイズ

プロジェクトを Web アプリケーションに作り変えていきます。

haskell-web-app.cabalの変更

プロジェクト内の「haskell-web-app.cabal」をテキストエディタで開いて、 末尾に次のコードを追加します。


 build-depends:       base >= 4.7 && < 5
                    , warp
                    , wai
                    , http-types
    

src/Main.hs の変更

テキストエディタでプロジェクト内の「src」ディレクトリの 「Main.hs」を開いて、次のように変更します。


{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run, Port)
import System.Environment (getEnvironment)
import Data.List (lookup)
import Data.Maybe

app :: Application
app _ respond = do
    putStrLn "I've done some IO here"
    respond $ responseLBS
        status200
        [("Content-Type", "text/plain")]
        "Hello, Haskell Web application."

main :: IO ()
main = do
    port <- getPort
    run port app

getPort :: IO Port
getPort = getEnvironment >>= return . port
  where
    port = fromMaybe defaultPort . fmap read . lookup "PORT"

defaultPort :: Port
defaultPort = 80
    

ビルド

プロジェクトをビルドします。

実行はしません。すでに Webアプリケーションになっているので、デスクトップ上 では実行できません。

stack build

.buildpacks の追加

プロジェクト内に「.buildpacks」というファイルを追加します。

このファイルは、リモートサーバーの「haskell-web-app」 リポジトリに Haskell 実行環境をインストールします。「.buildpacks」 には、次のように記述します。


    https://github.com/mfine/heroku-buildpack-stack

Procfile の追加

プロジェクト内に「Procfile」というファイルを追加します。

このファイルはDokku でプロセスを実行するために必要です。 「Procfiel」には、次のように記述します。


web: haskell-web-app
    

Git リポジトリの作成

haskell-web-app に Git リポジトリを作ります。 作業は、haskell-web-app ディレクトリ内で行ってください。

  1. 空のリポジトリを作成します。
    git init

  2. リポジトリにプロジェクト内のすべてのファイルを追加します。
    git add .
    .」は、すべてのファイルを意味しています。

  3. 追加したファイルをリポジトリに紐付けします。
    git commit -m "1.0.0"
    文字列は任意の文字列で構いません。

  4. デプロイ先を登録します。
    git remote add dokku dokku@xxx.xxx.xxx.xxx:haskell-web-app
    xxx.xxx.xxx.xxxの部分は、あなたのリモートサーバーの「IPアドレス」です。

デプロイ

リモートサーバーへhaskell-web-appをデプロイします。

git push dokku master

初回のデプロイは、Haskellの実行環境もインストールしますので、 かなりの時間がかかります。

同じリポジトリに更新ファイルをデプロイする場合は、 2回目からは時間がかかりません

違うリポジトリにデプロイする場合は、また時間がかかります。

次のように表示されたらデプロイは成功しています。

=====> Renaming container (07c828c5d6ae) peaceful_hawking to haskell-web-app.web.1
=====> Application deployed:
https://xxx.xxx.xxx.xxx:xxxxx

To xxx.xx.xx.xx:haskell-web-app
* [new branch] master -> master

表示されたアドレスはメモしておいてください。

CentOSサーバーにデプロイした場合はアドレスがハイフンで区切られています。 これをドット区切りに直してください。

https://xxx-xxx-xxx-xxx:xxxxx

https://xxx.xxx.xxx.xxx:xxxxx

さらにCentOSサーバーでは、 ファイアーウォールに指定のポートのアクセスを許可させなければなりません。 CentOSサーバにログインして次の作業をしてください。「xxxxx」の部分は、 「:」の後の5桁のポート番号です。この作業はUbuntuサーバーには必要 ありません。

firewall-cmd --zone=public --add-port=xxxxx/tcp --permanent
firewall-cmd --reload

ブラウザで新規ウィンドウか新規タブを開いて、URLフィールドに表示されたアドレスを 入力して実行します。

CentOSサーバーの場合はドット区切りに直したアドレスを入力してください。

更新

  1. src/Main.hsの次の箇所を任意の文字列に変更します。
    "Hello, Haskell Web application."

    "This is app Design test site"

  2. プロジェクトをビルドします。
    stack build

  3. 変更したファイルをリポジトリに追加します。ただし、ここではビルドしていますので、 何が変更されているのか分かりません。念のためにすべてを追加することにします。
    git add .

  4. 追加したファイルをリポジトリに紐付けします。
    git commit -m "1.0.1"

  5. リポジトリをデプロイします。デプロイ先は初回に設定していますので、 今回は設定しません。
    git push dokku master

  6. 今回のデプロイはすぐに終わります。表示されるアドレスも先ほど同じです。 ブラウザで確認してみてください。

トラブルシューティング

デプロイに失敗する場合は次のことを試してみてください。

  1. ファイルの記述に間違いがないか

  2. プロジェクトはビルドしたか

  3. .ssh/known_hostsファイルを削除する

  4. 次のコードを実行してリポジトリを削除して、またリポジトリを作り直す。
    rm -rf .git

  5. リモートサーバーでリポジトリを削除して、またリポジトリを作り直す。
    ssh root@xxx.xxx.xxx.xxx
    su dokku
    cd
    dokku apps:destroy haskell-web-app
    haskell-web-app
    dokku apps:create haskell-web-app
    dokku apps:list
    リモートサーバーのリポジトリを作り直した場合は、アプリケーションのポート番号が 変更されます。またリモートサーバーのリポジトリを作り直した後の、初回デプロイは、 時間がかかります。


2659 visits
Posted: Feb. 05, 2019
Update: Feb. 05, 2019

ホーム   目次   ページトップ