KeterでのYesodアプリケーションの実行

Keterとは

reverse proxy. 次のようなことが出来る

  • main port 80番にバインド、各アプリケーションにリバースプロキシ

  • SSLのサポート

  • アプリのプロセスの死活監視、自動起動。ダウンタイム無しでの切り替え

  • ログファイルの管理

他にも色々できるらしい。

ローカル環境での試す。

まずはmac os x上で試す。

keterのインストール

cabal update  
cabal install keter

keterの設定ファイルを作成

/etc/keter.yaml を編集
https://github.com/snoyberg/keter/blob/master/etc/keter-config.yaml
を元に作成。 今回はrootを任意に変更(KETER_ROOT)、httpsのリスナーを削除

とりあえず動かす(デーモン化は後述の本番で)

sudo keter /etc/keter.yaml

$KETER_ROOT/log 以下にログが吐かれる

アプリケーションの設定

(yesodのscaffoldingで作ったアプリであれば最初から必要なファイルが有るので、それを編集)

設定ファイルの作成 config/keter.yaml を作成する。

exec: ../dist/build/app_name/app_name
host: example.com

サンプル: https://github.com/snoyberg/keter/blob/master/incoming/foo1_0/config/keter.yaml

アプリのポート

環境変数 PORT を読んで、それでリッスンするように修正する。
サンプル:

デプロイ

アプリの「実行ファイル、keterのconfig、スタティックリソースなど」をtarで固める。固めたファイルの名前は.keterにする

tar -czvf gif-viewer-server.keter dist/build/gif-viewer-server/gif-viewer-server config/keter.yaml static/

出来た.keterを、 $KETER_ROOT/incomingにコピーするとデプロイ実行

アプリで設定したドメインでローカルにアクセス(必要に応じてhostsで再現)、ポートはketerの設定のもの、にアクセスするとアプリケーションが動作しているのを確認できるはず

お疲れ様でした!アプリごとのログもローテートされ管理されているので確認しましょう。

本番環境で導入

だいたい次の状態

  • 環境はopenSUSE 13.2 (x86_64)
  • keterのプロセスはsystemdで起動、monitで監視
  • nginx経由

(因みにランスクリプトは、公式のREADMEはubuntuでupstart、こちら解説 ではinit.dのやつとsystemdどちらも、が参考できる)

install

cabal install keter
sudo cp ~/.cabal/bin/keter /usr/bin/

keter config

/etc/keter.yaml

root: /opt/keter

listeners:
    # HTTP
    - host: "*4" # Listen on all IPv4 hosts
      port: 3000  # Could be used to modify port

systemd

/etc/systemd/system/keter.service

sudo systemctl daemon-reload
sudo systemctl start keter.service
sudo systemctl enable keter.service
curl localhost:3000
# keterのwelcome

monit(if need)

cat /etc/monit.d/keter.conf
check process keter matching "keter"
    start program = "/usr/bin/systemctl start keter.service"
    stop  program = "/usr/bin/systemctl stop keter.service"
    if 5 restarts within 5 cycles then unmonitor

nginx conf

location / {
         proxy_pass http://127.0.0.1:3000;
     proxy_set_header Host $host;
     proxy_set_header X-Forwarded-For $remote_addr;
}

deploy

ローカルで試したとおりサーバー上でビルドして、keter/incomingに.keterを配置でデプロイ完了

状況によっては使えるかも

次はghcのクロスコンパイルかな