ようやく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)