Scotty で作成した Web アプリケーションを Dokku を使って、サーバーへ デプロイします。
Ubuntu サーバーは「 Conoha 」を参考に用意してください。
CentOS サーバーは「 CentOS で Dokkuを参考に用意してください。
Dokku の必要条件は 1GB以上のメモリです。Scotty フレームワークは軽いので、 そのまま 1GB のメモリで大丈夫です。
Yesod フレームワークの場合は、2GB以上のメモリーで、複数回トライしなければ デプロイに成功しません。Spock フレームワークの場合も、1GBメモリでは、複数回 トライしなければ、デプロイは成功しません。
Ubuntu の場合も、CentOS の場合も同じです。
$ su dokku
$ cd
$ dokku apps:create scotty-web
ここからは、ローカルコンピューターでの作業です。
よりシンプルな形にするために、プロジェクトを手動で作成します。
$ mkdir scotty-web
$ cd scotty-web
$ mkdir src
「scotty-web」プロジェクト内に、次の内容で「scotty-web.cabal
」というファイルを作ります。ローカルで使う場合と比べると「, warp
」というコードが追加されています。
name: scotty-web
version: 0.1.0.0
category: Web
build-type: Simple
cabal-version: >=1.10
executable scotty-web
main-is: Main.hs
build-depends: base >=4.9 && <4.10
, scotty
hs-source-dirs: src
default-language: Haskell2010
「scotty-web」プロジェクト内の「src
」ディレクトリに、次の内容の
「Main.hs
」というファイルを作ります。
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import System.Environment
import Control.Monad
main :: IO ()
main = do
port <- liftM read $ getEnv "PORT"
scotty port $ do
get "/" $
html "<p>Hello World!</p><p>on a remote server.</p>"
$ stack init
$ stack build
初回のビルドは、Scotty の開発環境と実行環境をインストールするため、 すごく時間がかかります。2回目からは、すぐに終わります。 「stack init」は初回の1回だけで構いません。
Dokkuは、まだHaskellに対応していないため、Herokuの「buildpack」
を利用します。「scotty-web」プロジェクト内に次の内容で「.buildpacks
」というファイルを作ってください。
.buildpacks
https://github.com/mfine/heroku-buildpack-stack
Herokuは「Procfile」というファイルが必要です。「scotty-web」プロジェクト内に
次の内容で「Procrile
」というファイルを作ってください。
Procfile
web: scotty-web
「123.123.123.123」の部分は、サーバーのIPアドレスです。
$ git init
$ git add .
$ git commit -m "scotty-web"
$ git remote add dokku dokku@123.123.123.123:scotty-web
$ git push dokku master
初回のデプロイは、Haskellの実行環境もインストールしますので、 かなりの時間がかかります。
同じリポジトリに更新ファイルをデプロイする場合は、 2回目からはそれほど時間がかかりません
違うリポジトリにデプロイする場合は、また時間がかかります。
次のように表示されたらデプロイは成功しています。
=====> Application deployed:
https://123.123.123.123:12345
To 123.123.123.123:scotty-web
* [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:scotty-web'
リモートサーバーのメモリを増やすか、再度デプロイを試みてください。デプロイを 繰り返すと上手くいく場合もあります。
再度デプロイをする場合は、念のために「stack clean」と「stack build」で プロジェクトをビルドしなおして、「git add .」と「git commit -m "scotty-web"」で git に登録しなおしてください。私の場合ですと、このサンプルは、1GBメモリーのUbuntuサーバーに対して1回目の デプロイで成功しました。