elixir + cowboyでwebアプリ その5 デプロイ
elixir + cowboyでapiサーバーを作ってみました。elixir + cowboyでwebアプリ その4 住所検索APIサンプル
これ、実運用するときどうするんだろう。
まさかiex -S mixって起動するわけじゃ・・・
ということで、デプロイの方法について調べてみます。
exrm
デプロイはこちらを参考にしました。
Application Deployment
Elixir Release Manager (exrm)を使えとのこと。
https://github.com/bitwalker/exrm
FreeBSD 10.1には、pkgが用意されているようです。
# pkg search exrm
elixir-exrm-0.18.5
これをインストールして使用することにしました。
# pkg install elixir-exrm
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 11 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
elixir-exrm: 0.18.5
relx: 3.4.0
rebar3: 20150630_1
erlang-ssl_verify_hostname: 1.0.5
erlang-rebar3_hex: 0.1.0
erlang-providers: 1.4.1
erlang-getopt: 0.8.2
erlang-erlware_commons: 0.15.0
erlang-bbmustache: 1.0.3
elixir-conform: 0.15.0
erlang-neotoma: 1.7.2_1
結構、色んな物に依存してますね。
インストールが終わったら、「mix help」を実行してみます。
「mix release」が追加されているはずです。
# mix help
mix # Run the default task (current: mix run)
mix app.start # Start all registered apps
mix archive # List all archives
...
mix new # Create a new Elixir project
mix release # Build a release for the current mix application.
mix release.clean # Clean up any release-related files.
mix release.plugins # View information about active release plugins
リリースビルド
ビルドすると、必要なライブラリが一つのフォルダにまとめられ、
そのライブラリを使用して起動するようになります。
そのため、mix.exsのapplicationsに依存しているライブラリを列挙しておきます。
・mix.exs
- defmodule Cowjson.Mixfile do
- use Mix.Project
- def project do
- [app: :cowjson,
- version: "0.0.1",
- elixir: "~> 1.0",
- build_embedded: Mix.env == :prod,
- start_permanent: Mix.env == :prod,
- deps: deps]
- end
- def application do
- [
- mod: {Cowjson, []},
- applications: [:logger, :cowboy, :mariaex, :exjsx]
- ]
- end
- defp deps do
- []
- end
- end
mix releaseを実行。
# mix release
==> Building release with MIX_ENV=dev.
==> Generating relx configuration...
==> Generating sys.config...
==> Generating boot script...
==> Generating release...
==> Generating nodetool...
==> Packaging release...
==> The release for cowjson-0.0.1 is ready!
==> You can boot a console running your release with `$ rel/cowjson/bin/cowjson console`
relディレクトリが作成され、必要なライブラリがまとめられました。

コンソールモードで起動してみます。
rel/[アプリケーション名]/bin/[アプリケーション名]
例えば「rel/my_app/bin/my_app」に実行可能なバイナリが配置されています。
consoleオプション付きで起動してみます。
# rel/cowjson/bin/cowjson console
/var/dev/elixir/cowjson/rel/cowjson/running-config
Exec: /var/dev/elixir/cowjson/rel/cowjson/erts-7.0.2/bin/erlexec -boot /var/dev/elixir/cowjson/rel/cowjson/releases/0.0.1/cowjson -boot_var ERTS_LIB_DIR /var/dev/elixir/cowjson/rel/cowjson/erts-7.0.2/../lib -env ERL_LIBS /var/dev/elixir/cowjson/rel/cowjson/lib -config /var/dev/elixir/cowjson/rel/cowjson/running-config/sys.config -pa /var/dev/elixir/cowjson/rel/cowjson/lib/consolidated -args_file /var/dev/elixir/cowjson/rel/cowjson/running-config/vm.args -user Elixir.IEx.CLI -extra --no-halt +iex -- console
Root: /var/dev/elixir/cowjson/rel/cowjson
/var/dev/elixir/cowjson/rel/cowjson
Erlang/OTP 18 [erts-7.0.2] [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.0.5) - press Ctrl+C to exit (type h() ENTER for help)
iex([email protected])1>
起動してくれました。
通常のiexと同様、Ctrl + cからabortでシュル用できます。
コンソール無しで起動するにはstartオプションを指定。
# rel/cowjson/bin/cowjson start
これでバックグラウンドで実行してくれます。
停止は、stopオプションを付けて実行。
# rel/cowjson/bin/cowjson stop
適用
実際にサーバーへ適用するときは、releasesの中に
全資産のアーカイブが作成されています。
rel/my_app/releases/0.0.1/my_app-0.0.1.tar.gz

これをサーバーにコピーして解凍することで、
適用を行うことになるようです。
起動スクリプトやnginxとの連携はまた後日。