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