CentOS7にErlangとElixir、Phoenixをインストールしてみる

　Elmを勉強中ですが、フロントエンドをJavaScriptから関数型言語へ変えるので、せっかくですからサーバ環境も関数型言語へ変更したいと思いました。調べるとErlang VM上で動くElixir(Phoenix)が良いらしいので、インストールしてみました。

　Elixirは開発環境を含めてErlangを使いやすく再設計した関数型言語で、Erlangとバイナリコードレベルで互換性があり、そのライブラリであるOTPも使うことができるということです。ニューフェイスだが、Erlangが長い歴史で築いてきた資産をそのまま使えるというおいしい言語です。ちなみに作者(José Valim氏)はRuby on Railsのチームのコアメンバーだということです。ElixirがRubyの置き換えだとしたら、PhoenixはRailsの置き換えになります。PhoenixはデフォルトのDBとしてPostgreSQLを使うのでそのインストールも行います。
https://hexdocs.pm/phoenix/installation.html


# １．nodeのインストール
　Phoenixはデフォルトでbrunch.ioを使ってstatic assets (JavaScript, CSS, etc)をコンパイルします。brunch.ioはnpmを利用しているのでnodeが必要になります。これは他の作業とまったく独立しているので、最初に行っておくことにします。以下のように最新版を入れておけば問題ないはずです。

```sh:
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
source ~/.nvm/nvm.sh
nvm install --lts
nvm use --lts
node -v
npm -v
```

　Elmのコンパイルもbrunch.ioのお世話になるのだろう。webpackではないのね。

# ２．Erlangのインストール
　話を簡単にするために以下の操作はrootで行います。

　まずErlangをインストールするための準備を行います。

```sh:
yum update
yum install epel-release
yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git wget wxBase.x86_64
```

　次にErlangのインストールです。

```sh:
wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
yum update
yum install erlang
```

　インストールを確認するためにerlコマンドで、shellが立ち上がるかを確認します。

```sh:
[root@www13134uf sand]# erl
Erlang/OTP 20 [erts-9.1] [source] [64-bit] ...

Eshell V9.1  (abort with ^G)
1>
```



# ３．Elixirのインストール
　以下のコマンドでElixirの最新バージョンが入手できます。

```sh:
git clone https://github.com/elixir-lang/elixir.git
```

　作成されたelixirディレクトリで以下のコマンドを打ちます。

```sh:
cd elixir/
make clean test
```

　問題がなかったらpathを設定するために.bashrcを編集します。

```sh:
vi /root/.bashrc
```

　私の場合は以下のようなpathを追加しました。

```:
export PATH="$PATH:/home/sand/elixir/elixir/bin"
```


　iexコマンドでshellが立ち上がることを確認してください。

```sh:
[root@www13134uf sand]# iex
Erlang/OTP 20 [erts-9.1] [source] [64-bit] ...

Interactive Elixir (1.7.0-dev) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
```

　最後にElixirのパッケージマネージャ hexをインストールしておきます

```sh:
 mix local.hex
```


# ４．Phoenixのインストール
　次のコマンドでPhoenixがインストールできます。

```sh:
mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez
```

# ５．PostgreSQLのインストール

 まずPostgreSQLをインストールし、サービスを立ち上げます。

```sh:
yum -y install postgresql-server
postgresql-setup initdb
systemctl start postgresql.service
systemctl enable postgresql.service
```

　次にパスワードを設定するためにshellを立ち上げ、postgresというパスワードを2回打ちます。

```sh:
sudo -u postgres psql
\password postgres
	Enter the password postgres twice,
\q
```

　次にローカル接続のAuthenticationのメソッドをidentからmd5に変更します。以下のファイルを編集します。

```sh:
vi /var/lib/pgsql/data/pg_hba.conf
```

　該当する箇所を以下のように書き換えてください。

```:
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
```

　サービスを再起動して設定変更を反映させます。

```sh:
systemctl restart postgresql.service
```

# ６．inotify-toolsのインストール
　inotify-toolsはPhoenixが使うファイルシステム監視ツールで、コード変更があったらリロードするのに使われます。

```sh:
yum install inotify-tools
```


# ７．Phoenixプロジェクトの作成

　最後にPhoenixのプロジェクトを作成して終わります。以下のコマンドでプロジェクトを作成し、サーバの起動が行われます。

```sh:
mix phoenix.new my_test
cd my_test
mix ecto.create
mix phx.server
```

　ブラウザで以下のアドレスを叩くとPhoenixのデモ画面が表示されます。ポート番号4000以外は自分のサーバのIPを入れてください。

```:
http://xxx.xxxx.xxx.xxx:4000
```