Scotty   デプロイ

ホーム


サーバーの準備

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

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

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

Dokku の必要条件は 1GB以上のメモリです。Scotty フレームワークは軽いので、 そのまま 1GB のメモリで大丈夫です。

Yesod フレームワークの場合は、2GB以上のメモリーで、複数回トライしなければ デプロイに成功しません。Spock フレームワークの場合も、1GBメモリでは、複数回 トライしなければ、デプロイは成功しません。

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

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


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

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

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

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


$ mkdir scotty-web
$ cd scotty-web
$ mkdir src
    

Cabal ファイルの作成

「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
    

Main.hsの作成

「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
    

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

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

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

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

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


4311 visits
Posted: Feb. 18, 2019
Update: Feb. 18, 2019

ホーム ページトップ