Dokku は、デプロイツール (PaaS) として最もシンプルなものです。このコーナーでは、 Dokku で Haskell アプリケーションを、リモートサーバーへデプロイする方法を説明しています。
「haskell-web-app.cabal
」において
「http-types
」とすべきところを
「htt-types
」としていました。
すみませんでした。2019年2月5日午後7時
Haskell の Web アプリケーション開発では、Haskell-Platform ではなく、 Haskell Stack を使ってアプリケーションを作成します。
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
次のコードをターミナルで実行します。
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
」をテキストエディタで開いて、
末尾に次のコードを追加します。
build-depends: base >= 4.7 && < 5
, warp
, wai
, http-types
テキストエディタでプロジェクト内の「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
」というファイルを追加します。
このファイルは、リモートサーバーの「haskell-web-app
」
リポジトリに Haskell 実行環境をインストールします。「.buildpacks
」
には、次のように記述します。
https://github.com/mfine/heroku-buildpack-stack
プロジェクト内に「Procfile
」というファイルを追加します。
このファイルはDokku でプロセスを実行するために必要です。
「Procfiel
」には、次のように記述します。
web: haskell-web-app
haskell-web-app
に Git リポジトリを作ります。
作業は、haskell-web-app
ディレクトリ内で行ってください。
空のリポジトリを作成します。
git init
リポジトリにプロジェクト内のすべてのファイルを追加します。
git add .
「
.
」は、すべてのファイルを意味しています。
追加したファイルをリポジトリに紐付けします。
git commit -m "1.0.0"
文字列は任意の文字列で構いません。
デプロイ先を登録します。
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サーバにログインして次の作業をしてください。「:
」の後の5桁のポート番号です。この作業はUbuntuサーバーには必要
ありません。
firewall-cmd --zone=public --add-port=xxxxx/tcp --permanent
firewall-cmd --reload
ブラウザで新規ウィンドウか新規タブを開いて、URLフィールドに表示されたアドレスを 入力して実行します。
CentOSサーバーの場合はドット区切りに直したアドレスを入力してください。
src/Main.hs
の次の箇所を任意の文字列に変更します。
"Hello, Haskell Web application."
↓
"This is app Design test site"
プロジェクトをビルドします。
stack build
変更したファイルをリポジトリに追加します。ただし、ここではビルドしていますので、
何が変更されているのか分かりません。念のためにすべてを追加することにします。
git add .
追加したファイルをリポジトリに紐付けします。
git commit -m "1.0.1"
リポジトリをデプロイします。デプロイ先は初回に設定していますので、
今回は設定しません。
git push dokku master
今回のデプロイはすぐに終わります。表示されるアドレスも先ほど同じです。 ブラウザで確認してみてください。
デプロイに失敗する場合は次のことを試してみてください。
ファイルの記述に間違いがないか
プロジェクトはビルドしたか
.ssh/known_hosts
ファイルを削除する
次のコードを実行してリポジトリを削除して、またリポジトリを作り直す。
rm -rf .git
リモートサーバーでリポジトリを削除して、またリポジトリを作り直す。
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