Spock   デプロイ

ホーム


サーバーの準備

Spock で作成した Web アプリケーションを Dokku を使って、サーバーへ デプロイします。

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

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

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

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

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

Ubuntu の場合も、CentOS の場合も同じです。


$ su dokku
$ cd
$ dokku apps:create spock-web
    

ローカルでのプロジェクトの作成

ここからは、ローカルコンピューターでの作業です。

よりシンプルな形にするために、プロジェクトを手動で作成します。


$ mkdir spock-web
$ cd spock-web
$ mkdir src
    

Cabal ファイルの作成

「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
    

Main.hsの作成

「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
    

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

「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サーバにログインして次の作業をしてください。「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:spock-web'
    

リモートサーバーのメモリを増やすか、再度デプロイを試みてください。デプロイを 繰り返すと上手くいく場合もあります。

再度デプロイをする場合は、念のために「stack clean」と「stack build」で プロジェクトをビルドしなおして、「git add .」と「git commit -m "spock-web"」で git に登録しなおしてください。

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


3484 visits
Posted: Feb. 16, 2019
Update: Feb. 22, 2019

ホーム ページトップ