nikkie-ftnextの日記

イベントレポートや読書メモを発信

Phoenixアプリをドキュメントの「Deploying with Releases」に沿って動かす

はじめに

24!...不死...フェニックス!、nikkieです(引用はラ!サ!!より)。

WEB+DB PRESS vol.127の特集で知ったPhoenixmix releaseして開発マシンで動かすのを試しました。
ドキュメントを参照しつつもハマりながらとなったので、備忘録として記事を残します。

ElixirやPhoenixは完全理解よりも手前のレベルです(入門すらこれから)。
誤りやよりよいやり方にお気付きの場合はTwitter @ftnextまで教えていただけると大変助かります。

目次

WEB+DB PRESS Vol.127のPhoenix特集

2022年2月発売の号には、ElixirとPhoenixでWebアプリケーションを作る特集があります(特集2)。

ソースコードはこちら:

詳細は WEB+DB PRESS Vol.127の「作って学ぶPhoenix」で手を動かすために、Elixirの環境を構築する(macOS) #wdpress - nikkie-ftnextの日記 をご覧ください。

この記事ではmix releaseコマンドは登場しないようなのですが、どう動かすのが気になったのでドキュメントに当たりながら取り組みました。

環境

先ほども引いたこちらの記事で作ったElixirの環境で進めます。

$ docker --version
Docker version 20.10.13, build a224086

$ mix --version
Erlang/OTP 24 [erts-12.3.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]

Mix 1.13.4 (compiled with Erlang/OTP 22)

$ mix phx.new --version
Phoenix installer v1.6.7

DB起動(docker利用)

WEB+DB PRESS Vol.127を参考に、Phoenixのアプリが接続するDB(PostgreSQL)をDockerを使って用意しました。

このイメージはrunするときに環境変数を指定してDBを初期設定できます(「Environment Variables」参照)。

  • POSTGRES_PASSWORD(必須)
  • POSTGRES_USER
  • POSTGRES_DB
docker run --rm --name phoenix-postgres -p 5432:5432 \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=postgres \
  -e POSTGRES_DB=hello_dev \
  postgres:13

(DB接続のデバッグでログが見たかったので-dを指定していません)

なお、後述のmix phx.new--no-ectoを渡してDB接続を不要にする方法もあると思います1

Phoenixのインストール

WEB+DB PRESS Vol.127で案内されています。
また、Installation — Phoenix v1.6.7も参照しました。

# Hexのインストール(インストール済みの場合は最新のバージョンにアップグレード)
mix local.hex
# Phoenix(のアプリケーションジェネレータ)のインストール
mix archive.install hex phx_new

開発用サーバで動かす🚀

WEB+DB PRESSからは離れ、Up and Running — Phoenix v1.6.7を進めます。

以下のコマンドでスキャフォールドされます(必要なファイルが作られ、ディレクトリに配置されます)。

mix phx.new hello

開発用のサーバを起動します。

cd hello
mix phx.server

DBへの接続情報はconfig/dev.exsに書かれています(mix phx.newでできたファイルです)。

# Configure your database
config :hello, Hello.Repo,
  username: "postgres",
  password: "postgres",
  hostname: "localhost",
  database: "hello_dev",
  # 省略

docker runするときの設定は、このファイルに合わせていたわけです!

http://localhost:4000 にアクセスすると、「Welcome to Phoenix!」が表示されます2

サーバを止めるにはCtrl+C2度押しです。

本番用サーバで動かす🚀🚀

本番用のサーバでも動かしてみようと、Deploying with Releases — Phoenix v1.6.7を参照しました。

環境変数の設定

export SECRET_KEY_BASE=$(mix phx.gen.secret)
export DATABASE_URL=ecto://postgres:postgres@127.0.0.1/hello_dev

DATABASE_URLはdocker runの環境変数に渡した値と合わせて作っています。
これらはconfig/runtime.exsで読み込まれるようです (設定されていないとエラー送出)。

依存関係のインストール(など)3

mix deps.get --only prod
MIX_ENV=prod mix phx.digest

以上の準備をしたあとで起動します。

MIX_ENV=prod PORT=4001 mix phx.server

http://localhost:4001 にアクセスすると、「Welcome to Phoenix!」が見えます!

リリースをビルドして動かす🚀🚀🚀

コンパイル

MIX_ENV=prod mix compile
mix phx.gen.release

MIX_ENV=prod mix release

ビルドしたファイルからサーバを動かします

PHX_SERVER=true PORT=4001 _build/prod/rel/hello/bin/hello start

# PORT=4001 _build/prod/rel/hello/bin/server  # こちらでも動かせました

http://localhost:4001 にアクセスすると、「Welcome to Phoenix!」が見えます!

環境変数PHX_SERVER指定がないと、サーバが起動せず、何も表示されない状態になりました(config/runtime.exsで参照するようです)。
DATABASE_URLunsetするとエラーを吐くので、すべての処理は正常に行われるのですが、サーバが起動せずに待機した状態みたいです。

終わりに

ドキュメントに沿って、小さく躓きながらもやりたいことは達成できました!

Elixirのドキュメントは最小限という感じですが、

  • コマンド実行で出力されるメッセージ
  • スキャフォールドされたファイルの中

にコマンドや説明コメントが書かれています。
こういった情報を繋いで目的が達成できたときは、リアル脱出ゲームをクリアしたときのような達成感がありました。

「Deploying with Releases」に沿ってmix releaseして動かす方法は分かりました。
満足してしまった感もありますが、WEB+DB PRESS Vol.127の特集の残りもやってみたいですね。

参考文献

本文中で出したURL以外にも以下を参考にしました。

config以下の説明は以下が興味深かったです(ファイルの中のコメントにも詳しいです)。

  • config.exsがエントリポイント
  • config.exsの中でdev.exsprod.exsを読み込む
  • runtime.exsは秘密情報や動的な設定を読み込む

  1. mix phx.new — Phoenix v1.6.7

  2. PythonDjangoで言うロケットのページというわけですね! 参考:プロジェクトを作成しよう! · HonKit

  3. MIX_ENV=prod mix phx.digestと手元のコマンドメモにありました。このコマンドで再現したのですが、ドキュメントに当たるとMIX_ENV=prod mix assets.deployかもしれません