はじめに
24!...不死...フェニックス!、nikkieです(引用はラ!サ!!より)。
WEB+DB PRESS vol.127の特集で知ったPhoenixをmix release
して開発マシンで動かすのを試しました。
ドキュメントを参照しつつもハマりながらとなったので、備忘録として記事を残します。
ElixirやPhoenixは完全理解よりも手前のレベルです(入門すらこれから)。
誤りやよりよいやり方にお気付きの場合はTwitter @ftnextまで教えていただけると大変助かります。
#wdpress 1つ前の2月の号(vol.127)のPhoenixの特集、mix releaseの成果物をどう動かすんだろうと気になり(脱線を始め)、https://t.co/X5jF32iCuG を参照しつつもめちゃめちゃ躓いた挙げ句、ついに動かせました🙌 pic.twitter.com/53muFdntf6
— nikkie にっきー シオンv0.0.1開発中⚒ (@ftnext) 2022年4月24日
目次
- はじめに
- 目次
- WEB+DB PRESS Vol.127のPhoenix特集
- 環境
- DB起動(docker利用)
- Phoenixのインストール
- 開発用サーバで動かす🚀
- 本番用サーバで動かす🚀🚀
- リリースをビルドして動かす🚀🚀🚀
- 終わりに
- 参考文献
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+C
の2度押しです。
本番用サーバで動かす🚀🚀
本番用のサーバでも動かしてみようと、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_URL
をunset
するとエラーを吐くので、すべての処理は正常に行われるのですが、サーバが起動せずに待機した状態みたいです。
終わりに
ドキュメントに沿って、小さく躓きながらもやりたいことは達成できました!
Elixirのドキュメントは最小限という感じですが、
- コマンド実行で出力されるメッセージ
- スキャフォールドされたファイルの中
にコマンドや説明コメントが書かれています。
こういった情報を繋いで目的が達成できたときは、リアル脱出ゲームをクリアしたときのような達成感がありました。
「Deploying with Releases」に沿ってmix release
して動かす方法は分かりました。
満足してしまった感もありますが、WEB+DB PRESS Vol.127の特集の残りもやってみたいですね。
参考文献
本文中で出したURL以外にも以下を参考にしました。
config以下の説明は以下が興味深かったです(ファイルの中のコメントにも詳しいです)。
config.exs
がエントリポイントconfig.exs
の中でdev.exs
やprod.exs
を読み込むruntime.exs
は秘密情報や動的な設定を読み込む
-
PythonのDjangoで言うロケットのページというわけですね! 参考:プロジェクトを作成しよう! · HonKit↩
-
MIX_ENV=prod mix phx.digest
と手元のコマンドメモにありました。このコマンドで再現したのですが、ドキュメントに当たるとMIX_ENV=prod mix assets.deploy
かもしれません↩