Chapter 24

デプロイの紹介

koga1020
koga1020
2021.11.23に更新

デプロイの紹介

動作するアプリケーションができたら、いよいよデプロイします。自分のアプリケーションがまだ完成していなくても、心配はいりません。起動ガイドにしたがって、基本的なアプリケーションを作成すればOKです。

アプリケーションをデプロイするための準備には、主に3つのステップがあります。

  • アプリケーションシークレットの取り扱い
  • アセットのコンパイル
  • 本番環境でのサーバーの起動

このガイドでは、ローカルに本番動作環境を構築する方法を学びます。本番環境でアプリケーションを動かすためにはこのガイドで説明する同じ技法を使うことができますが、デプロイインフラストラクチャによっては、追加のステップが必要となるでしょう。

他のインフラへのデプロイの例として、本ガイドでは3つの異なるアプローチについても説明しています。Elixirのリリースmix release で使用する方法、Gigalixirを使用する方法Herokuを使用する方法です。また、コミュニティ・デプロイメント・ガイドに、Phoenixを他のプラットフォームにデプロイするためのリンクを掲載しました。もしコンテナー技術でデプロイをするのがお好みなら、このリリースガイドでは利用可能なサンプルのDockerファイルも紹介します。

それでは、上記の手順を1つずつ見ていきましょう。

アプリケーションシークレットの取り扱い

すべてのPhoenixアプリケーションには、安全性を確保しなければならないデータがあります。たとえば、本番用データベースのユーザー名とパスワード、Phoenixが重要な情報に署名したり暗号化したりするために使用するシークレットなどです。一般的にはこれらのデータを環境変数に入れておき,それをアプリケーションに読み込むこと推奨されます。これは config/runtime.exs(以前は config/prod.secret.exsconfig/releases.exs)で行われ、環境変数からシークレットや設定を読み込む役割を担っています。

したがって、関連する変数が正しく本番環境に設定されていることを確認する必要があります:

$ mix phx.gen.secret
REALLY_LONG_SECRET
$ export SECRET_KEY_BASE=REALLY_LONG_SECRET
$ export DATABASE_URL=ecto://USER:PASS@HOST/database

これらの値をそのままコピーしてはいけません。SECRET_KEY_BASEmix phx.gen.secret の結果に合わせて、DATABASE_URL はデータベースのアドレスに合わせて設定してください。

何らかの理由で環境変数に頼りたくない場合は、config/runtime.exs (以前は config/prod.secret.exsconfig/releases.exs) にシークレットをハードコーディングできますが、このファイルをバージョン管理システムにチェックインしないように注意してください。

シークレット情報が適切で安全に設定できたので、アセットを構成してみましょう!

このステップに入る前に、ちょっとした準備をする必要があります。本番環境に向けてすべてを準備するので、依存関係を取得したり、コンパイルしたりして、本番環境のセットアップを行う必要があります。

$ mix deps.get --only prod
$ MIX_ENV=prod mix compile

アセットのコンパイル

このステップは、JavaScriptやスタイルシートなどのコンパイル可能なアセットがある場合にのみ必要です。Phoenixはデフォルトでは esbuild を使用しますが、すべては mix.exs で定義された単一の mix assets.deploy タスクに集約されます。

$ MIX_ENV=prod mix assets.deploy
Check your digested files at "priv/static".

これで完成です。Mixタスクはデフォルトでアセットをビルドし、キャッシュマニフェストファイルを使ってダイジェストを生成するので、Phoenixは本番環境で素早くアセットを提供できます。

注意: 上記のタスクをローカルマシンで実行すると、priv/static に多数のダイジェスト版アセットが生成されます。これらは、mix phx.digest.clean --all を実行することで削除できます。

万が一、上記の手順を実行するのを忘れてしまうと、Phoenix はエラーメッセージを表示しますので、注意してください。

$ PORT=4001 MIX_ENV=prod mix phx.server
10:50:18.732 [info] Running MyAppWeb.Endpoint with Cowboy on http://example.com
10:50:18.735 [error] Could not find static manifest at "my_app/_build/prod/lib/foo/priv/static/cache_manifest.json". Run "mix phx.digest" after building your static files or remove the configuration from "config/prod.exs".

エラーメッセージは非常に明確です。Phoenixが静的なマニフェストを見つけられなかったことを表しています。上記のコマンドを実行して修正するか、アセットを提供しないかまったく気にしない場合には、config/prod.exs から cache_static_manifest 設定を削除してください。

productionモードでのサーバーの起動

productionモードでPhoenixを開始するには、mix phx.server を起動する際に、環境変数 PORTMIX_ENV を設定する必要があります。

$ PORT=4001 MIX_ENV=prod mix phx.server
10:59:19.136 [info] Running MyAppWeb.Endpoint with Cowboy on http://example.com

デタッチモードを使うと、ターミナルを閉じたときにPhoenixサーバーを止めずに実行し続けるようになります:

$ PORT=4001 MIX_ENV=prod elixir --erl "-detached" -S mix phx.server

エラーメッセージが表示された場合は、その内容をよく読み、対処方法が不明な場合はバグレポートを作成してください。

作成したアプリケーションをインタラクティブシェルで実行することもできます。

$ PORT=4001 MIX_ENV=prod iex -S mix phx.server
10:59:19.136 [info] Running MyAppWeb.Endpoint with Cowboy on http://example.com

まとめ

これまでのセクションでは、Phoenixアプリケーションのデプロイに必要な手順を説明してきました。実際には、独自の手順を追加していくことになるでしょう。たとえば、データベースを使用している場合は、サーバーを起動する前に mix ecto.migrate を実行して、データベースが最新の状態になっていることを確認する必要があります。

全体として、ここに雛形として使用できるスクリプトを示しておきます:

# Initial setup
$ mix deps.get --only prod
$ MIX_ENV=prod mix compile

# Compile assets
$ MIX_ENV=prod mix assets.deploy

# Custom tasks (like DB migrations)
$ MIX_ENV=prod mix ecto.migrate

# Finally run the server
$ PORT=4001 MIX_ENV=prod mix phx.server

以上です。続いてデプロイのための公式ガイドを利用できます。

コミュニティ・デプロイメント・ガイド