Elixir/Phoenix: Distillery を利用した tarball 作成と配備

『Elixir/Phoenix 初級④: バリデーション』のサンプルアプリ NanoPlanner を本番環境(Ubuntu 18.04 Server LTS)にセットアップして、公開する手順を紹介します。

デプロイメントツールとしてDistilleryを使用します。

前提条件

  • Ubuntu 18.04 Server LTS
  • kuroda ユーザー (sudo 権限あり)
  • phoenix ユーザー (sudo 権限あり)

Erlang と Elixir のインストール

kuroda ユーザーで Ubuntu Server にログインして、次のコマンド群を順に実行。

$ wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
$ sudo dpkg -i erlang-solutions_1.0_all.deb
$ sudo apt-get update
$ sudo apt-get -y install esl-erlang
$ sudo apt-get -y install elixir
$ elixir --version

次のような結果が出ることを確認する(バージョン番号は異なるかもしれません)。

Erlang/OTP 22 [erts-10.4.1] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe]

Elixir 1.8.2 (compiled with Erlang/OTP 20)

Node.js のインストール

引き続き、kuroda ユーザーとして次のコマンド群を順に実行。

$ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
$ sudo apt-get install nodejs

PostgreSQL のインストールとセットアップ

引き続き、kuroda ユーザーとして次のコマンド群を順に実行。

$ sudo apt-get -y install postgresql
$ sudo -u postgres createuser -d phoenix -P

パスワードの入力を求められるので、phoenix と2回入力。

さらに次のコマンドを実行。

$ sudo -u postgres createdb --owner phoenix nano_planner_prod

Nginx のインストールと設定

kuroda ユーザーとして次のコマンドを実行。

$ sudo apt-get -y install nginx

テキストエディタ/etc/nginx/sites-available ディレクトリに新規ファイル nano_planner を作成

upstream phoenix {
  server 127.0.0.1:4000;
}

server {
  listen 80;
  server_name example.com;

  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-Cluster-Client-Ip $remote_addr;

  location / {
    proxy_pass  http://phoenix;
    allow all;
  }
}

ただし、example.com の部分は、Ubuntu Server に割り当てられた実際のホスト名で置き換える。

kuroda ユーザーとして次のコマンド群を順に実行。

$ cd /etc/nginx/sites-enabled
$ sudo ln -s ../sites-available/nano_planner .
$ sudo systemctl reload nginx

NanoPlanner のセットアップ

ここから先は、phoenix ユーザーで Ubuntu Server にログインして、次のコマンド群を順に実行。

ソースコードの取得から npm run deploy まで

$ git clone -b master4-deploy https://github.com/oiax/nano_planner.git
$ cd nano_planner
$ cp config/skel/prod.secret.exs config/
$ cd assets
$ npm install
$ npm run deploy
$ cd ..

tarballの作成

$ mix deps.get --only prod
$ MIX_ENV=prod mix compile
$ MIX_ENV=prod mix phx.digest
$ MIX_ENV=prod mix release

リリースの配備

$ mkdir -p ~/app/releases/0.1.0
$ cd _build/prod/rel/nano_planner/releases/0.1.0
$ cp nano_planner.tar.gz ~/app/releases/0.1.0
$ cd ~/app/releases/0.1.0
$ tar -xf nano_planner.tar.gz -C ~/app

データベースの初期化

$ cd ~/nano_planner
$ MIX_ENV=prod mix ecto.migrate
$ MIX_ENV=prod mix run priv/repo/seeds.exs

NanoPlanner の起動

$ cd ~/app
$ bin/nano_planner start

4000番ポートで待ち受けるプロセスの存在を確認。

$ lsof -i:4000

次のような結果が出ることを確認する。

COMMAND    PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
beam.smp 16931 phoenix   15u  IPv6  52028      0t0  TCP *:4000 (LISTEN)

以上で作業完了です。ブラウザで http://example.com にアクセスすれば、NanoPlanner の画面が出てくるはずです。ただし、example.com の部分は、Ubuntu Server に割り当てられた実際のホスト名で読み替えてください。