PhoenixをGCPにデプロイする方法

ようやくQiitaに初投稿です！

今回はElixirのフレームワークであるPhoenixで
GCP環境にデプロイする手順を解説します。
アプリは参照先に記載されてる`nano_plannner`を使用します。


### 環境は以下の通り
- Ubuntu 18.04 Server LTS
- リージョン: asia-northeast1(東京)
- ゾーン: asia-northeast1-b
- n1-standard-1（vCPU x 1、メモリ 3.75 GB）
- HTTP、HTTPSトラフィックを許可する。

今回はお試しで作るだけなので、インスタンスは1個のみで行います。


#####以下のユーザー名を追加します。

- mocamocaland 
- phoenix

######ユーザーの追加方法

作成したインスタンスにsshでアクセスしてから以下の手順でユーザーを追加していきます。

```
$ sudo adduser mocamocaland
```
そうすると以下の内容が出て来ます。

```
Adding user `mocamocaland' ...
Adding new group `mocamocaland' (1003) ...
Adding new user `mocamocaland' (1002) with group `mocamocaland' ...
Creating home directory `/home/mocamocaland' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: mocamocaland # 今回はお試しで作っているため
Retype new UNIX password: mocamocaland
passwd: password updated successfully
Changing the user information for mocamocaland
Enter the new value, or press ENTER for the default
# 以下5項目は何も入れずにenterを入力
        Full Name []: 
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n] # Yを入力してenterを入力
```

```
$ gpasswd -a mocamocaland sudo
```
上記を作業を`phoenix`ユーザーでも行なって下さい。


まず`mocamocaland`ユーザーでログインします。

```
$ sudo login mocamocaland
```


#Erlang と Elixir のインストール
以下の順番で環境構築とインストールをします。
途中聞かれるようなことがあれば`Y`を入力して進めて下さい。

```
$ 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が入ってることを確認します。

```
$ elixir --version
Erlang/OTP 21 [erts-10.1.3] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe]
Elixir 1.7.4 (compiled with Erlang/OTP 20)
```

# Node.jsのインストール
```
$ sudo apt install nodejs npm
```


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

```
$ sudo apt-get -y install postgresql
$ sudo -u postgres createuser -d phoenix -P
```
パスワード入力を求められたら`phoenix`で入力します。
更に以下を実行します。

```
$ sudo -u postgres createdb --owner phoenix nano_planner_prod
```

# Nginxのインストールと設定
Nginxをインストールをします。

```
$ sudo apt-get -y install nginx
```

インストールが終わりましたら
`/etc/nginx/sites-available` ディレクトリに移動します。

```
$ cd ~/etc/nginx/sites-available
```

移動したら新規ファイル で`nano_planner` を作成します。
ファイルには以下の内容を記載します。
`GCPの外部IP`は作成したGCPのインスタンスで自動で生成されてる外部IPを入力して下さい。

```
upstream phoenix {
  server 127.0.0.1:4000;
}

server {
  listen 80;
  server_name `GCPの外部IP`;

  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;
  }
}
```
最後に以下を実行します。

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


##`phoenix`ユーザーに変更

```
$ sudo login
sampler login: phoenix
Password: phoenix
```

ソースコードの取得、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
```
上記で`private/static`のディレクトリがなくて以下のエラーが出る場合は
`mkdir priv/static`で作成して下さい。

```
# エラー内容
$ MIX_ENV=prod mix phx.digest
The input path "priv/static" does not exist
```

リリースの配備をします。

```
$ 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.drop # 中身を一旦削除します。
$ MIX_ENV=prod mix ecto.create
$ MIX_ENV=prod mix ecto.migrate
$ MIX_ENV=prod mix run priv/repo/seeds.exs
```


アプリを起動します。

```
$ cd ~/app
$ bin/nano_planner start
```

最後に4000番ポートでプロセスの存在を確認します。

```
$ lsof -i:4000
```

以下の結果が出ればGCPの外部IPより表示を確認できます。
`http://'外部IP'`で表示確認ができます。

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





参考先URL
[Elixir/Phoenix: Distillery を利用した tarball 作成と配備]
(http://tkrd.hatenablog.com/entry/2018/12/01/034256?_ga=2.165002358.897563690.1544193303-1964647493.1527406712)

[Ubuntu 端末 その18 - 他のユーザーでログインする : login、logoutコマンド]
(https://kledgeb.blogspot.com/2012/08/ubuntu-18-loginlogout.html)

[ubuntu ユーザを追加して sudo 権限をつける]
(https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa)